]> review.fuel-infra Code Review - packages/trusty/rabbitmq-server.git/commitdiff
New upstream release 3.6.6 48/28748/1
authorAlexey Lebedeff <alebedev@mirantis.com>
Tue, 22 Nov 2016 12:35:13 +0000 (15:35 +0300)
committerAlexey Lebedeff <alebedev@mirantis.com>
Tue, 22 Nov 2016 12:35:13 +0000 (15:35 +0300)
Change-Id: I6d31c1bc027fb3b4cc1b176e8bb0eb28169f4a77

1471 files changed:
CODE_OF_CONDUCT.md [moved from rabbitmq-server/CODE_OF_CONDUCT.md with 100% similarity]
CONTRIBUTING.md [moved from rabbitmq-server/CONTRIBUTING.md with 100% similarity]
LICENSE [moved from rabbitmq-server/LICENSE with 100% similarity]
LICENSE-APACHE2-ExplorerCanvas [moved from rabbitmq-server/LICENSE-APACHE2-ExplorerCanvas with 100% similarity]
LICENSE-APL2-Rebar [moved from rabbitmq-server/LICENSE-APL2-Rebar with 100% similarity]
LICENSE-APL2-Stomp-Websocket [moved from rabbitmq-server/LICENSE-APL2-Stomp-Websocket with 100% similarity]
LICENSE-BSD-base64js [moved from rabbitmq-server/LICENSE-BSD-base64js with 100% similarity]
LICENSE-BSD-glMatrix [moved from rabbitmq-server/LICENSE-BSD-glMatrix with 100% similarity]
LICENSE-EPL-OTP [moved from rabbitmq-server/LICENSE-EPL-OTP with 100% similarity]
LICENSE-MIT-EJS10 [moved from rabbitmq-server/LICENSE-MIT-EJS10 with 100% similarity]
LICENSE-MIT-Erlware-Commons [new file with mode: 0644]
LICENSE-MIT-Flot [moved from rabbitmq-server/LICENSE-MIT-Flot with 100% similarity]
LICENSE-MIT-Mochi [moved from rabbitmq-server/LICENSE-MIT-Mochi with 100% similarity]
LICENSE-MIT-Mochiweb [moved from rabbitmq-server/LICENSE-MIT-Mochiweb with 100% similarity]
LICENSE-MIT-Sammy060 [moved from rabbitmq-server/LICENSE-MIT-Sammy060 with 100% similarity]
LICENSE-MIT-SockJS [moved from rabbitmq-server/LICENSE-MIT-SockJS with 100% similarity]
LICENSE-MIT-jQuery164 [moved from rabbitmq-server/LICENSE-MIT-jQuery164 with 100% similarity]
LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/LICENSE-MPL-RabbitMQ with 100% similarity]
LICENSE-MPL2 [moved from rabbitmq-server/LICENSE-MPL2 with 100% similarity]
Makefile [moved from rabbitmq-server/Makefile with 59% similarity]
debian/changelog
debian/control
debian/copyright
debian/dirs [new file with mode: 0644]
debian/gbp.conf [deleted file]
debian/patches/health-check-rabbit-node-monitor-rmq-pr-915.patch [deleted file]
debian/patches/list-only-local-queues-rmq-pr-911.patch [deleted file]
debian/patches/native-code-path.patch [deleted file]
debian/patches/series [deleted file]
debian/postinst [moved from debian/rabbitmq-server.postinst with 89% similarity, mode: 0644]
debian/postrm.in [moved from debian/rabbitmq-server.postrm with 100% similarity]
debian/rabbitmq-server.default
debian/rabbitmq-server.dirs [deleted file]
debian/rabbitmq-server.docs [new file with mode: 0644]
debian/rabbitmq-server.init [changed mode: 0755->0644]
debian/rabbitmq-server.manpages
debian/rabbitmq-server.service
debian/rules
debian/watch
deps/amqp_client/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/amqp_client/CODE_OF_CONDUCT.md with 100% similarity]
deps/amqp_client/CONTRIBUTING.md [moved from rabbitmq-server/deps/amqp_client/CONTRIBUTING.md with 100% similarity]
deps/amqp_client/Makefile [moved from rabbitmq-server/deps/amqp_client/Makefile with 98% similarity]
deps/amqp_client/README.in [moved from rabbitmq-server/deps/amqp_client/README.in with 100% similarity]
deps/amqp_client/ci/test.sh [moved from rabbitmq-server/deps/amqp_client/ci/test.sh with 100% similarity]
deps/amqp_client/ci/test.yml [moved from rabbitmq-server/deps/amqp_client/ci/test.yml with 100% similarity]
deps/amqp_client/erlang.mk [moved from rabbitmq-server/deps/rabbitmq_shovel_management/erlang.mk with 97% similarity]
deps/amqp_client/include/amqp_client.hrl [moved from rabbitmq-server/deps/amqp_client/include/amqp_client.hrl with 100% similarity]
deps/amqp_client/include/amqp_client_internal.hrl [moved from rabbitmq-server/deps/amqp_client/include/amqp_client_internal.hrl with 100% similarity]
deps/amqp_client/include/amqp_gen_consumer_spec.hrl [moved from rabbitmq-server/deps/amqp_client/include/amqp_gen_consumer_spec.hrl with 100% similarity]
deps/amqp_client/include/rabbit_routing_prefixes.hrl [moved from rabbitmq-server/deps/amqp_client/include/rabbit_routing_prefixes.hrl with 100% similarity]
deps/amqp_client/rabbitmq-components.mk [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/rabbitmq-components.mk with 88% similarity]
deps/amqp_client/src/amqp_auth_mechanisms.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_auth_mechanisms.erl with 100% similarity]
deps/amqp_client/src/amqp_channel.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_channel.erl with 100% similarity]
deps/amqp_client/src/amqp_channel_sup.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_channel_sup.erl with 100% similarity]
deps/amqp_client/src/amqp_channel_sup_sup.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_channel_sup_sup.erl with 100% similarity]
deps/amqp_client/src/amqp_channels_manager.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_channels_manager.erl with 100% similarity]
deps/amqp_client/src/amqp_client.app.src [moved from rabbitmq-server/deps/amqp_client/src/amqp_client.app.src with 93% similarity]
deps/amqp_client/src/amqp_client.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_client.erl with 100% similarity]
deps/amqp_client/src/amqp_connection.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_connection.erl with 100% similarity]
deps/amqp_client/src/amqp_connection_sup.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_connection_sup.erl with 100% similarity]
deps/amqp_client/src/amqp_connection_type_sup.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_connection_type_sup.erl with 100% similarity]
deps/amqp_client/src/amqp_direct_connection.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_direct_connection.erl with 100% similarity]
deps/amqp_client/src/amqp_direct_consumer.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_direct_consumer.erl with 100% similarity]
deps/amqp_client/src/amqp_gen_connection.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_gen_connection.erl with 100% similarity]
deps/amqp_client/src/amqp_gen_consumer.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_gen_consumer.erl with 100% similarity]
deps/amqp_client/src/amqp_main_reader.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_main_reader.erl with 100% similarity]
deps/amqp_client/src/amqp_network_connection.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_network_connection.erl with 99% similarity]
deps/amqp_client/src/amqp_rpc_client.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_rpc_client.erl with 100% similarity]
deps/amqp_client/src/amqp_rpc_server.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_rpc_server.erl with 100% similarity]
deps/amqp_client/src/amqp_selective_consumer.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_selective_consumer.erl with 100% similarity]
deps/amqp_client/src/amqp_sup.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_sup.erl with 100% similarity]
deps/amqp_client/src/amqp_uri.erl [moved from rabbitmq-server/deps/amqp_client/src/amqp_uri.erl with 100% similarity]
deps/amqp_client/src/overview.edoc.in [moved from rabbitmq-server/deps/amqp_client/src/overview.edoc.in with 100% similarity]
deps/amqp_client/src/rabbit_routing_util.erl [moved from rabbitmq-server/deps/amqp_client/src/rabbit_routing_util.erl with 100% similarity]
deps/amqp_client/src/uri_parser.erl [moved from rabbitmq-server/deps/amqp_client/src/uri_parser.erl with 100% similarity]
deps/cowboy/AUTHORS [moved from rabbitmq-server/deps/cowboy/AUTHORS with 100% similarity]
deps/cowboy/CHANGELOG.md [moved from rabbitmq-server/deps/cowboy/CHANGELOG.md with 100% similarity]
deps/cowboy/CONTRIBUTING.md [moved from rabbitmq-server/deps/cowboy/CONTRIBUTING.md with 100% similarity]
deps/cowboy/LICENSE [moved from rabbitmq-server/deps/cowboy/LICENSE with 100% similarity]
deps/cowboy/Makefile [moved from rabbitmq-server/deps/cowboy/Makefile with 100% similarity]
deps/cowboy/README.md [moved from rabbitmq-server/deps/cowboy/README.md with 100% similarity]
deps/cowboy/ROADMAP.md [moved from rabbitmq-server/deps/cowboy/ROADMAP.md with 100% similarity]
deps/cowboy/all.sh [moved from rabbitmq-server/deps/cowboy/all.sh with 100% similarity]
deps/cowboy/circle.yml [moved from rabbitmq-server/deps/cowboy/circle.yml with 100% similarity]
deps/cowboy/erlang.mk [moved from rabbitmq-server/deps/cowboy/erlang.mk with 100% similarity]
deps/cowboy/rebar.config [moved from rabbitmq-server/deps/cowboy/rebar.config with 100% similarity]
deps/cowboy/src/cowboy.app.src [moved from rabbitmq-server/deps/cowboy/src/cowboy.app.src with 100% similarity]
deps/cowboy/src/cowboy.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy.erl with 100% similarity]
deps/cowboy/src/cowboy_app.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_app.erl with 100% similarity]
deps/cowboy/src/cowboy_bstr.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_bstr.erl with 100% similarity]
deps/cowboy/src/cowboy_clock.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_clock.erl with 100% similarity]
deps/cowboy/src/cowboy_handler.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_handler.erl with 100% similarity]
deps/cowboy/src/cowboy_http.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_http.erl with 100% similarity]
deps/cowboy/src/cowboy_http_handler.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_http_handler.erl with 100% similarity]
deps/cowboy/src/cowboy_loop_handler.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_loop_handler.erl with 100% similarity]
deps/cowboy/src/cowboy_middleware.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_middleware.erl with 100% similarity]
deps/cowboy/src/cowboy_protocol.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_protocol.erl with 100% similarity]
deps/cowboy/src/cowboy_req.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_req.erl with 100% similarity]
deps/cowboy/src/cowboy_rest.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_rest.erl with 100% similarity]
deps/cowboy/src/cowboy_router.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_router.erl with 100% similarity]
deps/cowboy/src/cowboy_spdy.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_spdy.erl with 100% similarity]
deps/cowboy/src/cowboy_static.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_static.erl with 100% similarity]
deps/cowboy/src/cowboy_sub_protocol.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_sub_protocol.erl with 100% similarity]
deps/cowboy/src/cowboy_sup.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_sup.erl with 100% similarity]
deps/cowboy/src/cowboy_websocket.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_websocket.erl with 100% similarity]
deps/cowboy/src/cowboy_websocket_handler.erl [moved from rabbitmq-server/deps/cowboy/src/cowboy_websocket_handler.erl with 100% similarity]
deps/cowlib/AUTHORS [moved from rabbitmq-server/deps/cowlib/AUTHORS with 100% similarity]
deps/cowlib/CHANGELOG.md [moved from rabbitmq-server/deps/cowlib/CHANGELOG.md with 100% similarity]
deps/cowlib/LICENSE [moved from rabbitmq-server/deps/cowlib/LICENSE with 100% similarity]
deps/cowlib/Makefile [moved from rabbitmq-server/deps/cowlib/Makefile with 100% similarity]
deps/cowlib/README.md [moved from rabbitmq-server/deps/cowlib/README.md with 100% similarity]
deps/cowlib/all.sh [moved from rabbitmq-server/deps/cowlib/all.sh with 100% similarity]
deps/cowlib/build.config [moved from rabbitmq-server/deps/cowlib/build.config with 100% similarity]
deps/cowlib/erlang.mk [moved from rabbitmq-server/deps/cowlib/erlang.mk with 100% similarity]
deps/cowlib/include/cow_inline.hrl [moved from rabbitmq-server/deps/cowlib/include/cow_inline.hrl with 100% similarity]
deps/cowlib/src/cow_cookie.erl [moved from rabbitmq-server/deps/cowlib/src/cow_cookie.erl with 100% similarity]
deps/cowlib/src/cow_date.erl [moved from rabbitmq-server/deps/cowlib/src/cow_date.erl with 100% similarity]
deps/cowlib/src/cow_http.erl [moved from rabbitmq-server/deps/cowlib/src/cow_http.erl with 100% similarity]
deps/cowlib/src/cow_http_hd.erl [moved from rabbitmq-server/deps/cowlib/src/cow_http_hd.erl with 100% similarity]
deps/cowlib/src/cow_http_te.erl [moved from rabbitmq-server/deps/cowlib/src/cow_http_te.erl with 100% similarity]
deps/cowlib/src/cow_mimetypes.erl [moved from rabbitmq-server/deps/cowlib/src/cow_mimetypes.erl with 100% similarity]
deps/cowlib/src/cow_mimetypes.erl.src [moved from rabbitmq-server/deps/cowlib/src/cow_mimetypes.erl.src with 100% similarity]
deps/cowlib/src/cow_multipart.erl [moved from rabbitmq-server/deps/cowlib/src/cow_multipart.erl with 100% similarity]
deps/cowlib/src/cow_qs.erl [moved from rabbitmq-server/deps/cowlib/src/cow_qs.erl with 100% similarity]
deps/cowlib/src/cow_spdy.erl [moved from rabbitmq-server/deps/cowlib/src/cow_spdy.erl with 100% similarity]
deps/cowlib/src/cow_spdy.hrl [moved from rabbitmq-server/deps/cowlib/src/cow_spdy.hrl with 100% similarity]
deps/cowlib/src/cowlib.app.src [moved from rabbitmq-server/deps/cowlib/src/cowlib.app.src with 100% similarity]
deps/licensing/LICENSE-APACHE2-ExplorerCanvas [moved from rabbitmq-server/deps/licensing/LICENSE-APACHE2-ExplorerCanvas with 100% similarity]
deps/licensing/LICENSE-APL2-Rebar [moved from rabbitmq-server/deps/licensing/LICENSE-APL2-Rebar with 100% similarity]
deps/licensing/LICENSE-APL2-Stomp-Websocket [moved from rabbitmq-server/deps/licensing/LICENSE-APL2-Stomp-Websocket with 100% similarity]
deps/licensing/LICENSE-BSD-base64js [moved from rabbitmq-server/deps/licensing/LICENSE-BSD-base64js with 100% similarity]
deps/licensing/LICENSE-BSD-glMatrix [moved from rabbitmq-server/deps/licensing/LICENSE-BSD-glMatrix with 100% similarity]
deps/licensing/LICENSE-EPL-OTP [moved from rabbitmq-server/deps/licensing/LICENSE-EPL-OTP with 100% similarity]
deps/licensing/LICENSE-MIT-EJS10 [moved from rabbitmq-server/deps/licensing/LICENSE-MIT-EJS10 with 100% similarity]
deps/licensing/LICENSE-MIT-Erlware-Commons [new file with mode: 0644]
deps/licensing/LICENSE-MIT-Flot [moved from rabbitmq-server/deps/licensing/LICENSE-MIT-Flot with 100% similarity]
deps/licensing/LICENSE-MIT-Mochi [moved from rabbitmq-server/deps/mochiweb/LICENSE with 100% similarity]
deps/licensing/LICENSE-MIT-Mochiweb [moved from rabbitmq-server/deps/licensing/LICENSE-MIT-Mochiweb with 100% similarity]
deps/licensing/LICENSE-MIT-Sammy060 [moved from rabbitmq-server/deps/licensing/LICENSE-MIT-Sammy060 with 100% similarity]
deps/licensing/LICENSE-MIT-SockJS [moved from rabbitmq-server/deps/licensing/LICENSE-MIT-SockJS with 100% similarity]
deps/licensing/LICENSE-MIT-jQuery164 [moved from rabbitmq-server/deps/licensing/LICENSE-MIT-jQuery164 with 100% similarity]
deps/licensing/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/licensing/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/licensing/LICENSE-MPL2 [moved from rabbitmq-server/deps/licensing/LICENSE-MPL2 with 100% similarity]
deps/licensing/license_info_rabbitmq_codegen [moved from rabbitmq-server/deps/licensing/license_info_rabbitmq_codegen with 100% similarity]
deps/licensing/license_info_rabbitmq_management [moved from rabbitmq-server/deps/licensing/license_info_rabbitmq_management with 100% similarity]
deps/licensing/license_info_rabbitmq_management_visualiser [moved from rabbitmq-server/deps/licensing/license_info_rabbitmq_management_visualiser with 100% similarity]
deps/mochiweb/.editorconfig [moved from rabbitmq-server/deps/mochiweb/.editorconfig with 100% similarity]
deps/mochiweb/CHANGES.md [moved from rabbitmq-server/deps/mochiweb/CHANGES.md with 100% similarity]
deps/mochiweb/LICENSE [new file with mode: 0644]
deps/mochiweb/Makefile [moved from rabbitmq-server/deps/mochiweb/Makefile with 100% similarity]
deps/mochiweb/Makefile.orig.mk [moved from rabbitmq-server/deps/mochiweb/Makefile.orig.mk with 100% similarity]
deps/mochiweb/README [moved from rabbitmq-server/deps/mochiweb/README with 100% similarity]
deps/mochiweb/examples/hmac_api/README [moved from rabbitmq-server/deps/mochiweb/examples/hmac_api/README with 100% similarity]
deps/mochiweb/examples/hmac_api/hmac_api.hrl [moved from rabbitmq-server/deps/mochiweb/examples/hmac_api/hmac_api.hrl with 100% similarity]
deps/mochiweb/examples/hmac_api/hmac_api_client.erl [moved from rabbitmq-server/deps/mochiweb/examples/hmac_api/hmac_api_client.erl with 100% similarity]
deps/mochiweb/examples/hmac_api/hmac_api_lib.erl [moved from rabbitmq-server/deps/mochiweb/examples/hmac_api/hmac_api_lib.erl with 100% similarity]
deps/mochiweb/examples/https/https_store.erl [moved from rabbitmq-server/deps/mochiweb/examples/https/https_store.erl with 100% similarity]
deps/mochiweb/examples/https/server_cert.pem [moved from rabbitmq-server/deps/mochiweb/examples/https/server_cert.pem with 100% similarity]
deps/mochiweb/examples/https/server_key.pem [moved from rabbitmq-server/deps/mochiweb/examples/https/server_key.pem with 100% similarity]
deps/mochiweb/examples/keepalive/keepalive.erl [moved from rabbitmq-server/deps/mochiweb/examples/keepalive/keepalive.erl with 100% similarity]
deps/mochiweb/examples/websocket/index.html [moved from rabbitmq-server/deps/mochiweb/examples/websocket/index.html with 100% similarity]
deps/mochiweb/examples/websocket/websocket.erl [moved from rabbitmq-server/deps/mochiweb/examples/websocket/websocket.erl with 100% similarity]
deps/mochiweb/include/internal.hrl [moved from rabbitmq-server/deps/mochiweb/include/internal.hrl with 100% similarity]
deps/mochiweb/rebar [moved from rabbitmq-server/deps/mochiweb/rebar with 100% similarity]
deps/mochiweb/rebar.config [moved from rabbitmq-server/deps/mochiweb/rebar.config with 100% similarity]
deps/mochiweb/scripts/entities.erl [moved from rabbitmq-server/deps/mochiweb/scripts/entities.erl with 100% similarity]
deps/mochiweb/src/mochifmt.erl [moved from rabbitmq-server/deps/mochiweb/src/mochifmt.erl with 100% similarity]
deps/mochiweb/src/mochifmt_records.erl [moved from rabbitmq-server/deps/mochiweb/src/mochifmt_records.erl with 100% similarity]
deps/mochiweb/src/mochifmt_std.erl [moved from rabbitmq-server/deps/mochiweb/src/mochifmt_std.erl with 100% similarity]
deps/mochiweb/src/mochiglobal.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiglobal.erl with 100% similarity]
deps/mochiweb/src/mochihex.erl [moved from rabbitmq-server/deps/mochiweb/src/mochihex.erl with 100% similarity]
deps/mochiweb/src/mochijson.erl [moved from rabbitmq-server/deps/mochiweb/src/mochijson.erl with 100% similarity]
deps/mochiweb/src/mochijson2.erl [moved from rabbitmq-server/deps/mochiweb/src/mochijson2.erl with 100% similarity]
deps/mochiweb/src/mochilists.erl [moved from rabbitmq-server/deps/mochiweb/src/mochilists.erl with 100% similarity]
deps/mochiweb/src/mochilogfile2.erl [moved from rabbitmq-server/deps/mochiweb/src/mochilogfile2.erl with 100% similarity]
deps/mochiweb/src/mochinum.erl [moved from rabbitmq-server/deps/mochiweb/src/mochinum.erl with 100% similarity]
deps/mochiweb/src/mochitemp.erl [moved from rabbitmq-server/deps/mochiweb/src/mochitemp.erl with 100% similarity]
deps/mochiweb/src/mochiutf8.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiutf8.erl with 100% similarity]
deps/mochiweb/src/mochiweb.app.src [moved from rabbitmq-server/deps/mochiweb/src/mochiweb.app.src with 100% similarity]
deps/mochiweb/src/mochiweb.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb.erl with 100% similarity]
deps/mochiweb/src/mochiweb_acceptor.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_acceptor.erl with 100% similarity]
deps/mochiweb/src/mochiweb_base64url.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_base64url.erl with 100% similarity]
deps/mochiweb/src/mochiweb_charref.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_charref.erl with 100% similarity]
deps/mochiweb/src/mochiweb_clock.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_clock.erl with 100% similarity]
deps/mochiweb/src/mochiweb_cookies.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_cookies.erl with 100% similarity]
deps/mochiweb/src/mochiweb_cover.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_cover.erl with 100% similarity]
deps/mochiweb/src/mochiweb_echo.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_echo.erl with 100% similarity]
deps/mochiweb/src/mochiweb_headers.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_headers.erl with 100% similarity]
deps/mochiweb/src/mochiweb_html.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_html.erl with 100% similarity]
deps/mochiweb/src/mochiweb_http.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_http.erl with 100% similarity]
deps/mochiweb/src/mochiweb_io.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_io.erl with 100% similarity]
deps/mochiweb/src/mochiweb_mime.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_mime.erl with 100% similarity]
deps/mochiweb/src/mochiweb_multipart.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_multipart.erl with 100% similarity]
deps/mochiweb/src/mochiweb_request.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_request.erl with 100% similarity]
deps/mochiweb/src/mochiweb_response.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_response.erl with 100% similarity]
deps/mochiweb/src/mochiweb_session.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_session.erl with 100% similarity]
deps/mochiweb/src/mochiweb_socket.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_socket.erl with 100% similarity]
deps/mochiweb/src/mochiweb_socket_server.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_socket_server.erl with 100% similarity]
deps/mochiweb/src/mochiweb_util.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_util.erl with 100% similarity]
deps/mochiweb/src/mochiweb_websocket.erl [moved from rabbitmq-server/deps/mochiweb/src/mochiweb_websocket.erl with 100% similarity]
deps/mochiweb/src/reloader.erl [moved from rabbitmq-server/deps/mochiweb/src/reloader.erl with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp.template [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp.template with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/bench.sh [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/bench.sh with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/priv/www/index.html [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/priv/www/index.html with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/rebar.config [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/rebar.config with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp.app.src [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp.app.src with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp.erl [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp.erl with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_app.erl [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_app.erl with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_deps.erl [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_deps.erl with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_sup.erl [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_sup.erl with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_web.erl [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/src/mochiapp_web.erl with 100% similarity]
deps/mochiweb/support/templates/mochiwebapp_skel/start-dev.sh [moved from rabbitmq-server/deps/mochiweb/support/templates/mochiwebapp_skel/start-dev.sh with 100% similarity]
deps/mochiweb/support/test-materials/test_ssl_cert.pem [moved from rabbitmq-server/deps/mochiweb/support/test-materials/test_ssl_cert.pem with 100% similarity]
deps/mochiweb/support/test-materials/test_ssl_key.pem [moved from rabbitmq-server/deps/mochiweb/support/test-materials/test_ssl_key.pem with 100% similarity]
deps/rabbit/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbit_common/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbit/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbit_common/CONTRIBUTING.md with 100% similarity]
deps/rabbit/INSTALL [moved from rabbitmq-server/INSTALL with 100% similarity]
deps/rabbit/LICENSE [new file with mode: 0644]
deps/rabbit/LICENSE-MIT-Mochi [new file with mode: 0644]
deps/rabbit/LICENSE-MPL-RabbitMQ [new file with mode: 0644]
deps/rabbit/Makefile [new file with mode: 0644]
deps/rabbit/README [moved from rabbitmq-server/README with 100% similarity]
deps/rabbit/README.md [moved from rabbitmq-server/README.md with 74% similarity]
deps/rabbit/check_xref [moved from rabbitmq-server/check_xref with 100% similarity]
deps/rabbit/docs/README-for-packages [moved from rabbitmq-server/docs/README-for-packages with 100% similarity]
deps/rabbit/docs/examples-to-end.xsl [moved from rabbitmq-server/docs/examples-to-end.xsl with 100% similarity]
deps/rabbit/docs/html-to-website-xml.xsl [moved from rabbitmq-server/docs/html-to-website-xml.xsl with 100% similarity]
deps/rabbit/docs/rabbitmq-echopid.xml [moved from rabbitmq-server/docs/rabbitmq-echopid.xml with 100% similarity]
deps/rabbit/docs/rabbitmq-env.conf.5.xml [moved from rabbitmq-server/docs/rabbitmq-env.conf.5.xml with 100% similarity]
deps/rabbit/docs/rabbitmq-plugins.1.xml [moved from rabbitmq-server/docs/rabbitmq-plugins.1.xml with 100% similarity]
deps/rabbit/docs/rabbitmq-server.1.xml [moved from rabbitmq-server/docs/rabbitmq-server.1.xml with 100% similarity]
deps/rabbit/docs/rabbitmq-server.service.example [moved from rabbitmq-server/docs/rabbitmq-server.service.example with 100% similarity]
deps/rabbit/docs/rabbitmq-service.xml [moved from rabbitmq-server/docs/rabbitmq-service.xml with 100% similarity]
deps/rabbit/docs/rabbitmq.config.example [moved from rabbitmq-server/docs/rabbitmq.config.example with 96% similarity]
deps/rabbit/docs/rabbitmqctl.1.xml [moved from rabbitmq-server/docs/rabbitmqctl.1.xml with 94% similarity]
deps/rabbit/docs/remove-namespaces.xsl [moved from rabbitmq-server/docs/remove-namespaces.xsl with 100% similarity]
deps/rabbit/docs/set_rabbitmq_policy.sh.example [moved from rabbitmq-server/docs/set_rabbitmq_policy.sh.example with 100% similarity]
deps/rabbit/docs/usage.xsl [moved from rabbitmq-server/docs/usage.xsl with 90% similarity]
deps/rabbit/erlang.mk [moved from rabbitmq-server/deps/rabbitmq_federation/erlang.mk with 97% similarity]
deps/rabbit/include/gm_specs.hrl [moved from rabbitmq-server/include/gm_specs.hrl with 100% similarity]
deps/rabbit/include/rabbit_cli.hrl [moved from rabbitmq-server/include/rabbit_cli.hrl with 76% similarity]
deps/rabbit/quickcheck [moved from rabbitmq-server/quickcheck with 100% similarity]
deps/rabbit/rabbitmq-components.mk [moved from rabbitmq-server/deps/amqp_client/rabbitmq-components.mk with 88% similarity]
deps/rabbit/scripts/rabbitmq-defaults [moved from rabbitmq-server/scripts/rabbitmq-defaults with 100% similarity]
deps/rabbit/scripts/rabbitmq-defaults.bat [moved from rabbitmq-server/scripts/rabbitmq-defaults.bat with 100% similarity]
deps/rabbit/scripts/rabbitmq-echopid.bat [moved from rabbitmq-server/scripts/rabbitmq-echopid.bat with 100% similarity]
deps/rabbit/scripts/rabbitmq-env [moved from rabbitmq-server/scripts/rabbitmq-env with 96% similarity]
deps/rabbit/scripts/rabbitmq-env.bat [moved from rabbitmq-server/scripts/rabbitmq-env.bat with 94% similarity]
deps/rabbit/scripts/rabbitmq-plugins [moved from rabbitmq-server/scripts/rabbitmq-plugins with 100% similarity]
deps/rabbit/scripts/rabbitmq-plugins.bat [moved from rabbitmq-server/scripts/rabbitmq-plugins.bat with 100% similarity]
deps/rabbit/scripts/rabbitmq-server [moved from rabbitmq-server/scripts/rabbitmq-server with 92% similarity]
deps/rabbit/scripts/rabbitmq-server.bat [moved from rabbitmq-server/scripts/rabbitmq-server.bat with 100% similarity]
deps/rabbit/scripts/rabbitmq-service.bat [moved from rabbitmq-server/scripts/rabbitmq-service.bat with 100% similarity]
deps/rabbit/scripts/rabbitmqctl [moved from rabbitmq-server/scripts/rabbitmqctl with 100% similarity]
deps/rabbit/scripts/rabbitmqctl.bat [moved from rabbitmq-server/scripts/rabbitmqctl.bat with 100% similarity]
deps/rabbit/src/background_gc.erl [moved from rabbitmq-server/src/background_gc.erl with 100% similarity]
deps/rabbit/src/delegate.erl [moved from rabbitmq-server/src/delegate.erl with 100% similarity]
deps/rabbit/src/delegate_sup.erl [moved from rabbitmq-server/src/delegate_sup.erl with 100% similarity]
deps/rabbit/src/dtree.erl [moved from rabbitmq-server/src/dtree.erl with 100% similarity]
deps/rabbit/src/file_handle_cache.erl [moved from rabbitmq-server/src/file_handle_cache.erl with 100% similarity]
deps/rabbit/src/file_handle_cache_stats.erl [moved from rabbitmq-server/src/file_handle_cache_stats.erl with 100% similarity]
deps/rabbit/src/gatherer.erl [moved from rabbitmq-server/src/gatherer.erl with 100% similarity]
deps/rabbit/src/gm.erl [moved from rabbitmq-server/src/gm.erl with 97% similarity]
deps/rabbit/src/lqueue.erl [moved from rabbitmq-server/src/lqueue.erl with 100% similarity]
deps/rabbit/src/mirrored_supervisor_sups.erl [moved from rabbitmq-server/src/mirrored_supervisor_sups.erl with 100% similarity]
deps/rabbit/src/mnesia_sync.erl [moved from rabbitmq-server/src/mnesia_sync.erl with 100% similarity]
deps/rabbit/src/pg_local.erl [moved from rabbitmq-server/src/pg_local.erl with 100% similarity]
deps/rabbit/src/rabbit.app.src [moved from rabbitmq-server/src/rabbit.app.src with 91% similarity]
deps/rabbit/src/rabbit.erl [moved from rabbitmq-server/src/rabbit.erl with 91% similarity]
deps/rabbit/src/rabbit_access_control.erl [moved from rabbitmq-server/src/rabbit_access_control.erl with 100% similarity]
deps/rabbit/src/rabbit_alarm.erl [moved from rabbitmq-server/src/rabbit_alarm.erl with 100% similarity]
deps/rabbit/src/rabbit_amqqueue_process.erl [moved from rabbitmq-server/src/rabbit_amqqueue_process.erl with 95% similarity]
deps/rabbit/src/rabbit_amqqueue_sup.erl [moved from rabbitmq-server/src/rabbit_amqqueue_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_amqqueue_sup_sup.erl [moved from rabbitmq-server/src/rabbit_amqqueue_sup_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_auth_mechanism_amqplain.erl [moved from rabbitmq-server/src/rabbit_auth_mechanism_amqplain.erl with 100% similarity]
deps/rabbit/src/rabbit_auth_mechanism_cr_demo.erl [moved from rabbitmq-server/src/rabbit_auth_mechanism_cr_demo.erl with 100% similarity]
deps/rabbit/src/rabbit_auth_mechanism_plain.erl [moved from rabbitmq-server/src/rabbit_auth_mechanism_plain.erl with 100% similarity]
deps/rabbit/src/rabbit_autoheal.erl [moved from rabbitmq-server/src/rabbit_autoheal.erl with 83% similarity]
deps/rabbit/src/rabbit_binding.erl [moved from rabbitmq-server/src/rabbit_binding.erl with 100% similarity]
deps/rabbit/src/rabbit_boot_steps.erl [moved from rabbitmq-server/src/rabbit_boot_steps.erl with 100% similarity]
deps/rabbit/src/rabbit_channel_sup.erl [moved from rabbitmq-server/src/rabbit_channel_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_channel_sup_sup.erl [moved from rabbitmq-server/src/rabbit_channel_sup_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_cli.erl [moved from rabbitmq-server/src/rabbit_cli.erl with 85% similarity]
deps/rabbit/src/rabbit_client_sup.erl [moved from rabbitmq-server/src/rabbit_client_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_connection_helper_sup.erl [moved from rabbitmq-server/src/rabbit_connection_helper_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_connection_sup.erl [moved from rabbitmq-server/src/rabbit_connection_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_control_main.erl [moved from rabbitmq-server/src/rabbit_control_main.erl with 96% similarity]
deps/rabbit/src/rabbit_control_pbe.erl [new file with mode: 0644]
deps/rabbit/src/rabbit_dead_letter.erl [moved from rabbitmq-server/src/rabbit_dead_letter.erl with 100% similarity]
deps/rabbit/src/rabbit_diagnostics.erl [moved from rabbitmq-server/src/rabbit_diagnostics.erl with 100% similarity]
deps/rabbit/src/rabbit_direct.erl [moved from rabbitmq-server/src/rabbit_direct.erl with 100% similarity]
deps/rabbit/src/rabbit_disk_monitor.erl [moved from rabbitmq-server/src/rabbit_disk_monitor.erl with 100% similarity]
deps/rabbit/src/rabbit_epmd_monitor.erl [moved from rabbitmq-server/src/rabbit_epmd_monitor.erl with 100% similarity]
deps/rabbit/src/rabbit_error_logger.erl [moved from rabbitmq-server/src/rabbit_error_logger.erl with 100% similarity]
deps/rabbit/src/rabbit_error_logger_file_h.erl [moved from rabbitmq-server/src/rabbit_error_logger_file_h.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange.erl [moved from rabbitmq-server/src/rabbit_exchange.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange_parameters.erl [moved from rabbitmq-server/src/rabbit_exchange_parameters.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange_type_direct.erl [moved from rabbitmq-server/src/rabbit_exchange_type_direct.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange_type_fanout.erl [moved from rabbitmq-server/src/rabbit_exchange_type_fanout.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange_type_headers.erl [moved from rabbitmq-server/src/rabbit_exchange_type_headers.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange_type_invalid.erl [moved from rabbitmq-server/src/rabbit_exchange_type_invalid.erl with 100% similarity]
deps/rabbit/src/rabbit_exchange_type_topic.erl [moved from rabbitmq-server/src/rabbit_exchange_type_topic.erl with 100% similarity]
deps/rabbit/src/rabbit_file.erl [moved from rabbitmq-server/src/rabbit_file.erl with 100% similarity]
deps/rabbit/src/rabbit_framing.erl [moved from rabbitmq-server/src/rabbit_framing.erl with 100% similarity]
deps/rabbit/src/rabbit_guid.erl [moved from rabbitmq-server/src/rabbit_guid.erl with 100% similarity]
deps/rabbit/src/rabbit_hipe.erl [moved from rabbitmq-server/src/rabbit_hipe.erl with 100% similarity]
deps/rabbit/src/rabbit_limiter.erl [moved from rabbitmq-server/src/rabbit_limiter.erl with 100% similarity]
deps/rabbit/src/rabbit_log.erl [moved from rabbitmq-server/src/rabbit_log.erl with 100% similarity]
deps/rabbit/src/rabbit_memory_monitor.erl [moved from rabbitmq-server/src/rabbit_memory_monitor.erl with 100% similarity]
deps/rabbit/src/rabbit_mirror_queue_coordinator.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_coordinator.erl with 96% similarity]
deps/rabbit/src/rabbit_mirror_queue_master.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_master.erl with 93% similarity]
deps/rabbit/src/rabbit_mirror_queue_misc.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_misc.erl with 94% similarity]
deps/rabbit/src/rabbit_mirror_queue_mode.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_mode.erl with 100% similarity]
deps/rabbit/src/rabbit_mirror_queue_mode_all.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_mode_all.erl with 100% similarity]
deps/rabbit/src/rabbit_mirror_queue_mode_exactly.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_mode_exactly.erl with 100% similarity]
deps/rabbit/src/rabbit_mirror_queue_mode_nodes.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_mode_nodes.erl with 65% similarity]
deps/rabbit/src/rabbit_mirror_queue_slave.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_slave.erl with 97% similarity]
deps/rabbit/src/rabbit_mirror_queue_sync.erl [moved from rabbitmq-server/src/rabbit_mirror_queue_sync.erl with 98% similarity]
deps/rabbit/src/rabbit_mnesia.erl [moved from rabbitmq-server/src/rabbit_mnesia.erl with 100% similarity]
deps/rabbit/src/rabbit_mnesia_rename.erl [moved from rabbitmq-server/src/rabbit_mnesia_rename.erl with 100% similarity]
deps/rabbit/src/rabbit_msg_file.erl [moved from rabbitmq-server/src/rabbit_msg_file.erl with 100% similarity]
deps/rabbit/src/rabbit_msg_store.erl [moved from rabbitmq-server/src/rabbit_msg_store.erl with 100% similarity]
deps/rabbit/src/rabbit_msg_store_ets_index.erl [moved from rabbitmq-server/src/rabbit_msg_store_ets_index.erl with 100% similarity]
deps/rabbit/src/rabbit_msg_store_gc.erl [moved from rabbitmq-server/src/rabbit_msg_store_gc.erl with 100% similarity]
deps/rabbit/src/rabbit_node_monitor.erl [moved from rabbitmq-server/src/rabbit_node_monitor.erl with 95% similarity]
deps/rabbit/src/rabbit_parameter_validation.erl [moved from rabbitmq-server/src/rabbit_parameter_validation.erl with 100% similarity]
deps/rabbit/src/rabbit_password.erl [moved from rabbitmq-server/src/rabbit_password.erl with 100% similarity]
deps/rabbit/src/rabbit_password_hashing_md5.erl [moved from rabbitmq-server/src/rabbit_password_hashing_md5.erl with 100% similarity]
deps/rabbit/src/rabbit_password_hashing_sha256.erl [moved from rabbitmq-server/src/rabbit_password_hashing_sha256.erl with 100% similarity]
deps/rabbit/src/rabbit_password_hashing_sha512.erl [moved from rabbitmq-server/src/rabbit_password_hashing_sha512.erl with 100% similarity]
deps/rabbit/src/rabbit_pbe.erl [new file with mode: 0644]
deps/rabbit/src/rabbit_plugins.erl [moved from rabbitmq-server/src/rabbit_plugins.erl with 100% similarity]
deps/rabbit/src/rabbit_plugins_main.erl [moved from rabbitmq-server/src/rabbit_plugins_main.erl with 100% similarity]
deps/rabbit/src/rabbit_policies.erl [moved from rabbitmq-server/src/rabbit_policies.erl with 100% similarity]
deps/rabbit/src/rabbit_policy.erl [moved from rabbitmq-server/src/rabbit_policy.erl with 98% similarity]
deps/rabbit/src/rabbit_prelaunch.erl [moved from rabbitmq-server/src/rabbit_prelaunch.erl with 100% similarity]
deps/rabbit/src/rabbit_prequeue.erl [moved from rabbitmq-server/src/rabbit_prequeue.erl with 100% similarity]
deps/rabbit/src/rabbit_priority_queue.erl [moved from rabbitmq-server/src/rabbit_priority_queue.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_consumers.erl [moved from rabbitmq-server/src/rabbit_queue_consumers.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_index.erl [moved from rabbitmq-server/src/rabbit_queue_index.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_location_client_local.erl [moved from rabbitmq-server/src/rabbit_queue_location_client_local.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_location_min_masters.erl [moved from rabbitmq-server/src/rabbit_queue_location_min_masters.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_location_random.erl [moved from rabbitmq-server/src/rabbit_queue_location_random.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_location_validator.erl [moved from rabbitmq-server/src/rabbit_queue_location_validator.erl with 100% similarity]
deps/rabbit/src/rabbit_queue_master_location_misc.erl [moved from rabbitmq-server/src/rabbit_queue_master_location_misc.erl with 100% similarity]
deps/rabbit/src/rabbit_recovery_terms.erl [moved from rabbitmq-server/src/rabbit_recovery_terms.erl with 100% similarity]
deps/rabbit/src/rabbit_registry.erl [moved from rabbitmq-server/src/rabbit_registry.erl with 100% similarity]
deps/rabbit/src/rabbit_resource_monitor_misc.erl [moved from rabbitmq-server/src/rabbit_resource_monitor_misc.erl with 100% similarity]
deps/rabbit/src/rabbit_restartable_sup.erl [moved from rabbitmq-server/src/rabbit_restartable_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_router.erl [moved from rabbitmq-server/src/rabbit_router.erl with 100% similarity]
deps/rabbit/src/rabbit_runtime_parameters.erl [moved from rabbitmq-server/src/rabbit_runtime_parameters.erl with 100% similarity]
deps/rabbit/src/rabbit_sasl_report_file_h.erl [moved from rabbitmq-server/src/rabbit_sasl_report_file_h.erl with 100% similarity]
deps/rabbit/src/rabbit_ssl.erl [moved from rabbitmq-server/src/rabbit_ssl.erl with 100% similarity]
deps/rabbit/src/rabbit_sup.erl [moved from rabbitmq-server/src/rabbit_sup.erl with 100% similarity]
deps/rabbit/src/rabbit_table.erl [moved from rabbitmq-server/src/rabbit_table.erl with 100% similarity]
deps/rabbit/src/rabbit_trace.erl [moved from rabbitmq-server/src/rabbit_trace.erl with 100% similarity]
deps/rabbit/src/rabbit_upgrade.erl [moved from rabbitmq-server/src/rabbit_upgrade.erl with 100% similarity]
deps/rabbit/src/rabbit_upgrade_functions.erl [moved from rabbitmq-server/src/rabbit_upgrade_functions.erl with 95% similarity]
deps/rabbit/src/rabbit_variable_queue.erl [moved from rabbitmq-server/src/rabbit_variable_queue.erl with 96% similarity]
deps/rabbit/src/rabbit_version.erl [moved from rabbitmq-server/src/rabbit_version.erl with 100% similarity]
deps/rabbit/src/rabbit_vhost.erl [moved from rabbitmq-server/src/rabbit_vhost.erl with 100% similarity]
deps/rabbit/src/rabbit_vm.erl [moved from rabbitmq-server/src/rabbit_vm.erl with 100% similarity]
deps/rabbit/src/supervised_lifecycle.erl [moved from rabbitmq-server/src/supervised_lifecycle.erl with 100% similarity]
deps/rabbit/src/tcp_listener.erl [moved from rabbitmq-server/src/tcp_listener.erl with 100% similarity]
deps/rabbit/src/tcp_listener_sup.erl [moved from rabbitmq-server/src/tcp_listener_sup.erl with 100% similarity]
deps/rabbit/src/truncate.erl [moved from rabbitmq-server/src/truncate.erl with 100% similarity]
deps/rabbit/src/vm_memory_monitor.erl [moved from rabbitmq-server/src/vm_memory_monitor.erl with 100% similarity]
deps/rabbit/src/worker_pool.erl [moved from rabbitmq-server/src/worker_pool.erl with 100% similarity]
deps/rabbit/src/worker_pool_sup.erl [moved from rabbitmq-server/src/worker_pool_sup.erl with 100% similarity]
deps/rabbit/src/worker_pool_worker.erl [moved from rabbitmq-server/src/worker_pool_worker.erl with 100% similarity]
deps/rabbit_common/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbit_common/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/CONTRIBUTING.md with 100% similarity]
deps/rabbit_common/LICENSE [new file with mode: 0644]
deps/rabbit_common/LICENSE-MIT-Erlware-Commons [new file with mode: 0644]
deps/rabbit_common/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbit_common/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbit_common/Makefile [moved from rabbitmq-server/deps/rabbit_common/Makefile with 97% similarity]
deps/rabbit_common/codegen.py [moved from rabbitmq-server/deps/rabbit_common/codegen.py with 100% similarity]
deps/rabbit_common/erlang.mk [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/erlang.mk with 97% similarity]
deps/rabbit_common/include/old_builtin_types.hrl [moved from rabbitmq-server/deps/rabbit_common/include/old_builtin_types.hrl with 100% similarity]
deps/rabbit_common/include/rabbit.hrl [moved from rabbitmq-server/deps/rabbit_common/include/rabbit.hrl with 98% similarity]
deps/rabbit_common/include/rabbit_misc.hrl [moved from rabbitmq-server/deps/rabbit_common/include/rabbit_misc.hrl with 100% similarity]
deps/rabbit_common/include/rabbit_msg_store.hrl [moved from rabbitmq-server/deps/rabbit_common/include/rabbit_msg_store.hrl with 100% similarity]
deps/rabbit_common/mk/rabbitmq-build.mk [moved from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-build.mk with 97% similarity]
deps/rabbit_common/mk/rabbitmq-components.mk [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/rabbitmq-components.mk with 88% similarity]
deps/rabbit_common/mk/rabbitmq-dist.mk [moved from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-dist.mk with 89% similarity]
deps/rabbit_common/mk/rabbitmq-plugin.mk [moved from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-plugin.mk with 79% similarity]
deps/rabbit_common/mk/rabbitmq-run.mk [moved from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-run.mk with 69% similarity]
deps/rabbit_common/mk/rabbitmq-tools.mk [moved from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-tools.mk with 87% similarity]
deps/rabbit_common/src/app_utils.erl [moved from rabbitmq-server/deps/rabbit_common/src/app_utils.erl with 100% similarity]
deps/rabbit_common/src/code_version.erl [moved from rabbitmq-server/deps/rabbit_common/src/code_version.erl with 100% similarity]
deps/rabbit_common/src/credit_flow.erl [moved from rabbitmq-server/deps/rabbit_common/src/credit_flow.erl with 99% similarity]
deps/rabbit_common/src/ec_semver.erl [new file with mode: 0644]
deps/rabbit_common/src/ec_semver_parser.erl [new file with mode: 0644]
deps/rabbit_common/src/gen_server2.erl [moved from rabbitmq-server/deps/rabbit_common/src/gen_server2.erl with 100% similarity]
deps/rabbit_common/src/mirrored_supervisor.erl [moved from rabbitmq-server/deps/rabbit_common/src/mirrored_supervisor.erl with 98% similarity]
deps/rabbit_common/src/mochijson2.erl [moved from rabbitmq-server/deps/rabbit_common/src/mochijson2.erl with 100% similarity]
deps/rabbit_common/src/mochinum.erl [moved from rabbitmq-server/src/mochinum.erl with 100% similarity]
deps/rabbit_common/src/pmon.erl [moved from rabbitmq-server/deps/rabbit_common/src/pmon.erl with 100% similarity]
deps/rabbit_common/src/priority_queue.erl [moved from rabbitmq-server/deps/rabbit_common/src/priority_queue.erl with 100% similarity]
deps/rabbit_common/src/rabbit_amqqueue.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_amqqueue.erl with 94% similarity]
deps/rabbit_common/src/rabbit_auth_backend_dummy.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_auth_backend_dummy.erl with 100% similarity]
deps/rabbit_common/src/rabbit_auth_backend_internal.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_auth_backend_internal.erl with 100% similarity]
deps/rabbit_common/src/rabbit_auth_mechanism.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_auth_mechanism.erl with 100% similarity]
deps/rabbit_common/src/rabbit_authn_backend.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_authn_backend.erl with 100% similarity]
deps/rabbit_common/src/rabbit_authz_backend.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_authz_backend.erl with 100% similarity]
deps/rabbit_common/src/rabbit_backing_queue.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_backing_queue.erl with 100% similarity]
deps/rabbit_common/src/rabbit_basic.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_basic.erl with 100% similarity]
deps/rabbit_common/src/rabbit_binary_generator.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_binary_generator.erl with 100% similarity]
deps/rabbit_common/src/rabbit_binary_parser.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_binary_parser.erl with 100% similarity]
deps/rabbit_common/src/rabbit_channel.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_channel.erl with 99% similarity]
deps/rabbit_common/src/rabbit_channel_interceptor.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_channel_interceptor.erl with 100% similarity]
deps/rabbit_common/src/rabbit_command_assembler.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_command_assembler.erl with 100% similarity]
deps/rabbit_common/src/rabbit_common.app.src [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_common.app.src with 92% similarity]
deps/rabbit_common/src/rabbit_control_misc.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_control_misc.erl with 100% similarity]
deps/rabbit_common/src/rabbit_data_coercion.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_data_coercion.erl with 100% similarity]
deps/rabbit_common/src/rabbit_error_logger_handler.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_error_logger_handler.erl with 100% similarity]
deps/rabbit_common/src/rabbit_event.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_event.erl with 100% similarity]
deps/rabbit_common/src/rabbit_exchange_decorator.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_exchange_decorator.erl with 100% similarity]
deps/rabbit_common/src/rabbit_exchange_type.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_exchange_type.erl with 100% similarity]
deps/rabbit_common/src/rabbit_health_check.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_health_check.erl with 86% similarity]
deps/rabbit_common/src/rabbit_heartbeat.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_heartbeat.erl with 100% similarity]
deps/rabbit_common/src/rabbit_misc.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_misc.erl with 97% similarity]
deps/rabbit_common/src/rabbit_msg_store_index.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_msg_store_index.erl with 100% similarity]
deps/rabbit_common/src/rabbit_net.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_net.erl with 100% similarity]
deps/rabbit_common/src/rabbit_networking.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_networking.erl with 100% similarity]
deps/rabbit_common/src/rabbit_nodes.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_nodes.erl with 100% similarity]
deps/rabbit_common/src/rabbit_password_hashing.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_password_hashing.erl with 100% similarity]
deps/rabbit_common/src/rabbit_policy_validator.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_policy_validator.erl with 100% similarity]
deps/rabbit_common/src/rabbit_queue_collector.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_queue_collector.erl with 100% similarity]
deps/rabbit_common/src/rabbit_queue_decorator.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_queue_decorator.erl with 100% similarity]
deps/rabbit_common/src/rabbit_queue_master_locator.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_queue_master_locator.erl with 100% similarity]
deps/rabbit_common/src/rabbit_reader.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_reader.erl with 100% similarity]
deps/rabbit_common/src/rabbit_runtime_parameter.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_runtime_parameter.erl with 100% similarity]
deps/rabbit_common/src/rabbit_types.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_types.erl with 100% similarity]
deps/rabbit_common/src/rabbit_writer.erl [moved from rabbitmq-server/deps/rabbit_common/src/rabbit_writer.erl with 100% similarity]
deps/rabbit_common/src/rand_compat.erl [moved from rabbitmq-server/deps/rabbit_common/src/rand_compat.erl with 100% similarity]
deps/rabbit_common/src/ssl_compat.erl [moved from rabbitmq-server/deps/rabbit_common/src/ssl_compat.erl with 100% similarity]
deps/rabbit_common/src/supervisor2.erl [moved from rabbitmq-server/deps/rabbit_common/src/supervisor2.erl with 100% similarity]
deps/rabbit_common/src/time_compat.erl [moved from rabbitmq-server/deps/rabbit_common/src/time_compat.erl with 100% similarity]
deps/rabbitmq_amqp1_0/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_amqp1_0/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_amqp1_0/Makefile [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/Makefile with 91% similarity]
deps/rabbitmq_amqp1_0/README.md [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/README.md with 100% similarity]
deps/rabbitmq_amqp1_0/codegen.py [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/codegen.py with 100% similarity]
deps/rabbitmq_amqp1_0/erlang.mk [moved from rabbitmq-server/deps/rabbitmq_management/erlang.mk with 95% similarity]
deps/rabbitmq_amqp1_0/include/rabbit_amqp1_0.hrl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/include/rabbit_amqp1_0.hrl with 100% similarity]
deps/rabbitmq_amqp1_0/rabbitmq-components.mk [moved from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-components.mk with 88% similarity]
deps/rabbitmq_amqp1_0/spec/messaging.xml [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/spec/messaging.xml with 100% similarity]
deps/rabbitmq_amqp1_0/spec/security.xml [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/spec/security.xml with 100% similarity]
deps/rabbitmq_amqp1_0/spec/transactions.xml [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/spec/transactions.xml with 100% similarity]
deps/rabbitmq_amqp1_0/spec/transport.xml [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/spec/transport.xml with 100% similarity]
deps/rabbitmq_amqp1_0/spec/types.xml [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/spec/types.xml with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_binary_generator.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_binary_generator.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_binary_parser.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_binary_parser.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_channel.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_channel.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_framing.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_framing.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_incoming_link.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_incoming_link.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_link_util.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_link_util.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_message.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_message.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_outgoing_link.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_outgoing_link.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session_process.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session_process.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session_sup.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session_sup.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session_sup_sup.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_session_sup_sup.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_util.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_util.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_writer.erl [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_writer.erl with 100% similarity]
deps/rabbitmq_amqp1_0/src/rabbitmq_amqp1_0.app.src [moved from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbitmq_amqp1_0.app.src with 71% similarity]
deps/rabbitmq_auth_backend_ldap/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_auth_backend_ldap/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_auth_backend_ldap/Makefile [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/Makefile with 77% similarity]
deps/rabbitmq_auth_backend_ldap/README-authorisation.md [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/README-authorisation.md with 100% similarity]
deps/rabbitmq_auth_backend_ldap/README-tests.md [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/README-tests.md with 100% similarity]
deps/rabbitmq_auth_backend_ldap/README.md [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/README.md with 100% similarity]
deps/rabbitmq_auth_backend_ldap/Vagrantfile [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/Vagrantfile with 100% similarity]
deps/rabbitmq_auth_backend_ldap/erlang.mk [new file with mode: 0644]
deps/rabbitmq_auth_backend_ldap/example/global.ldif [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/example/global.ldif with 100% similarity]
deps/rabbitmq_auth_backend_ldap/example/memberof_init.ldif [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/example/memberof_init.ldif with 100% similarity]
deps/rabbitmq_auth_backend_ldap/example/refint_1.ldif [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/example/refint_1.ldif with 100% similarity]
deps/rabbitmq_auth_backend_ldap/example/refint_2.ldif [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/example/refint_2.ldif with 100% similarity]
deps/rabbitmq_auth_backend_ldap/example/seed.sh [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/example/seed.sh with 100% similarity]
deps/rabbitmq_auth_backend_ldap/example/setup.sh [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/example/setup.sh with 100% similarity]
deps/rabbitmq_auth_backend_ldap/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_auth_backend_ldap/src/rabbit_auth_backend_ldap.erl [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/src/rabbit_auth_backend_ldap.erl with 100% similarity]
deps/rabbitmq_auth_backend_ldap/src/rabbit_auth_backend_ldap_app.erl [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/src/rabbit_auth_backend_ldap_app.erl with 100% similarity]
deps/rabbitmq_auth_backend_ldap/src/rabbit_auth_backend_ldap_util.erl [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/src/rabbit_auth_backend_ldap_util.erl with 100% similarity]
deps/rabbitmq_auth_backend_ldap/src/rabbitmq_auth_backend_ldap.app.src [moved from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/src/rabbitmq_auth_backend_ldap.app.src with 91% similarity]
deps/rabbitmq_auth_mechanism_ssl/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_codegen/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_auth_mechanism_ssl/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_codegen/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_auth_mechanism_ssl/Makefile [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/Makefile with 92% similarity]
deps/rabbitmq_auth_mechanism_ssl/README.md [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/README.md with 100% similarity]
deps/rabbitmq_auth_mechanism_ssl/erlang.mk [new file with mode: 0644]
deps/rabbitmq_auth_mechanism_ssl/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_auth_mechanism_ssl/src/rabbit_auth_mechanism_ssl.erl [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/src/rabbit_auth_mechanism_ssl.erl with 100% similarity]
deps/rabbitmq_auth_mechanism_ssl/src/rabbit_auth_mechanism_ssl_app.erl [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/src/rabbit_auth_mechanism_ssl_app.erl with 100% similarity]
deps/rabbitmq_auth_mechanism_ssl/src/rabbitmq_auth_mechanism_ssl.app.src [moved from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/src/rabbitmq_auth_mechanism_ssl.app.src with 76% similarity]
deps/rabbitmq_codegen/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_codegen/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_codegen/LICENSE [moved from rabbitmq-server/deps/rabbitmq_codegen/LICENSE with 100% similarity]
deps/rabbitmq_codegen/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_codegen/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_codegen/Makefile [moved from rabbitmq-server/deps/rabbitmq_codegen/Makefile with 100% similarity]
deps/rabbitmq_codegen/README.extensions.md [moved from rabbitmq-server/deps/rabbitmq_codegen/README.extensions.md with 100% similarity]
deps/rabbitmq_codegen/amqp-rabbitmq-0.8.json [moved from rabbitmq-server/deps/rabbitmq_codegen/amqp-rabbitmq-0.8.json with 100% similarity]
deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json [moved from rabbitmq-server/deps/rabbitmq_codegen/amqp-rabbitmq-0.9.1.json with 100% similarity]
deps/rabbitmq_codegen/amqp_codegen.py [moved from rabbitmq-server/deps/rabbitmq_codegen/amqp_codegen.py with 100% similarity]
deps/rabbitmq_codegen/credit_extension.json [moved from rabbitmq-server/deps/rabbitmq_codegen/credit_extension.json with 100% similarity]
deps/rabbitmq_codegen/demo_extension.json [moved from rabbitmq-server/deps/rabbitmq_codegen/demo_extension.json with 100% similarity]
deps/rabbitmq_codegen/license_info [moved from rabbitmq-server/deps/rabbitmq_codegen/license_info with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_event_exchange/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_event_exchange/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/LICENSE [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/LICENSE with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/Makefile [new file with mode: 0644]
deps/rabbitmq_consistent_hash_exchange/README.md [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/README.md with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/erlang.mk [new file with mode: 0644]
deps/rabbitmq_consistent_hash_exchange/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_consistent_hash_exchange/src/rabbit_exchange_type_consistent_hash.erl [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/src/rabbit_exchange_type_consistent_hash.erl with 100% similarity]
deps/rabbitmq_consistent_hash_exchange/src/rabbitmq_consistent_hash_exchange.app.src [moved from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/src/rabbitmq_consistent_hash_exchange.app.src with 65% similarity]
deps/rabbitmq_event_exchange/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_federation/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_event_exchange/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_federation/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_event_exchange/LICENSE [moved from rabbitmq-server/deps/rabbitmq_event_exchange/LICENSE with 100% similarity]
deps/rabbitmq_event_exchange/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_event_exchange/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_event_exchange/Makefile [new file with mode: 0644]
deps/rabbitmq_event_exchange/README.md [moved from rabbitmq-server/deps/rabbitmq_event_exchange/README.md with 100% similarity]
deps/rabbitmq_event_exchange/erlang.mk [new file with mode: 0644]
deps/rabbitmq_event_exchange/examples/java/QueueEvents.java [moved from rabbitmq-server/deps/rabbitmq_event_exchange/examples/java/QueueEvents.java with 100% similarity]
deps/rabbitmq_event_exchange/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_event_exchange/src/rabbit_exchange_type_event.erl [moved from rabbitmq-server/deps/rabbitmq_event_exchange/src/rabbit_exchange_type_event.erl with 100% similarity]
deps/rabbitmq_event_exchange/src/rabbitmq_event_exchange.app.src [moved from rabbitmq-server/deps/rabbitmq_event_exchange/src/rabbitmq_event_exchange.app.src with 62% similarity]
deps/rabbitmq_federation/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_federation_management/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_federation/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_federation_management/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_federation/Makefile [new file with mode: 0644]
deps/rabbitmq_federation/README-hacking [moved from rabbitmq-server/deps/rabbitmq_federation/README-hacking with 100% similarity]
deps/rabbitmq_federation/README.md [moved from rabbitmq-server/deps/rabbitmq_federation/README.md with 100% similarity]
deps/rabbitmq_federation/erlang.mk [new file with mode: 0644]
deps/rabbitmq_federation/etc/rabbit-test.sh [moved from rabbitmq-server/deps/rabbitmq_federation/etc/rabbit-test.sh with 100% similarity]
deps/rabbitmq_federation/etc/setup-rabbit-test.sh [moved from rabbitmq-server/deps/rabbitmq_federation/etc/setup-rabbit-test.sh with 100% similarity]
deps/rabbitmq_federation/include/rabbit_federation.hrl [moved from rabbitmq-server/deps/rabbitmq_federation/include/rabbit_federation.hrl with 100% similarity]
deps/rabbitmq_federation/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_federation/src/rabbit_federation_app.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_app.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_db.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_db.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_event.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_event.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_exchange.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_exchange.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_exchange_link.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_exchange_link.erl with 98% similarity]
deps/rabbitmq_federation/src/rabbit_federation_exchange_link_sup_sup.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_exchange_link_sup_sup.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_link_util.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_link_util.erl with 90% similarity]
deps/rabbitmq_federation/src/rabbit_federation_parameters.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_parameters.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_queue.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_queue.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_queue_link.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_queue_link.erl with 97% similarity]
deps/rabbitmq_federation/src/rabbit_federation_queue_link_sup_sup.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_queue_link_sup_sup.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_status.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_status.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_sup.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_sup.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_upstream.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_upstream.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_upstream_exchange.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_upstream_exchange.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbit_federation_util.erl [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_util.erl with 100% similarity]
deps/rabbitmq_federation/src/rabbitmq_federation.app.src [moved from rabbitmq-server/deps/rabbitmq_federation/src/rabbitmq_federation.app.src with 67% similarity]
deps/rabbitmq_federation_management/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_federation_management/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_federation_management/LICENSE [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE with 82% similarity]
deps/rabbitmq_federation_management/LICENSE-APACHE2-ExplorerCanvas [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-APACHE2-ExplorerCanvas with 100% similarity]
deps/rabbitmq_federation_management/LICENSE-BSD-base64js [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-BSD-base64js with 100% similarity]
deps/rabbitmq_federation_management/LICENSE-MIT-EJS10 [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-MIT-EJS10 with 100% similarity]
deps/rabbitmq_federation_management/LICENSE-MIT-Flot [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-MIT-Flot with 100% similarity]
deps/rabbitmq_federation_management/LICENSE-MIT-Sammy060 [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-MIT-Sammy060 with 100% similarity]
deps/rabbitmq_federation_management/LICENSE-MIT-jQuery164 [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-MIT-jQuery164 with 100% similarity]
deps/rabbitmq_federation_management/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_federation_management/Makefile [moved from rabbitmq-server/deps/rabbitmq_federation_management/Makefile with 84% similarity]
deps/rabbitmq_federation_management/README.md [moved from rabbitmq-server/deps/rabbitmq_federation_management/README.md with 100% similarity]
deps/rabbitmq_federation_management/erlang.mk [new file with mode: 0644]
deps/rabbitmq_federation_management/priv/www/js/federation.js [moved from rabbitmq-server/deps/rabbitmq_federation_management/priv/www/js/federation.js with 100% similarity]
deps/rabbitmq_federation_management/priv/www/js/tmpl/federation-upstream.ejs [moved from rabbitmq-server/deps/rabbitmq_federation_management/priv/www/js/tmpl/federation-upstream.ejs with 100% similarity]
deps/rabbitmq_federation_management/priv/www/js/tmpl/federation-upstreams.ejs [moved from rabbitmq-server/deps/rabbitmq_federation_management/priv/www/js/tmpl/federation-upstreams.ejs with 100% similarity]
deps/rabbitmq_federation_management/priv/www/js/tmpl/federation.ejs [moved from rabbitmq-server/deps/rabbitmq_federation_management/priv/www/js/tmpl/federation.ejs with 100% similarity]
deps/rabbitmq_federation_management/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_federation_management/src/rabbit_federation_mgmt.erl [moved from rabbitmq-server/deps/rabbitmq_federation_management/src/rabbit_federation_mgmt.erl with 100% similarity]
deps/rabbitmq_federation_management/src/rabbitmq_federation_management.app.src [moved from rabbitmq-server/deps/rabbitmq_federation_management/src/rabbitmq_federation_management.app.src with 61% similarity]
deps/rabbitmq_jms_topic_exchange/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_management/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_jms_topic_exchange/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_management/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_jms_topic_exchange/LICENSE [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/LICENSE with 100% similarity]
deps/rabbitmq_jms_topic_exchange/LICENSES.txt [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/LICENSES.txt with 100% similarity]
deps/rabbitmq_jms_topic_exchange/Makefile [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/Makefile with 82% similarity]
deps/rabbitmq_jms_topic_exchange/README.md [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/README.md with 100% similarity]
deps/rabbitmq_jms_topic_exchange/erlang.mk [new file with mode: 0644]
deps/rabbitmq_jms_topic_exchange/include/rabbit_jms_topic_exchange.hrl [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/include/rabbit_jms_topic_exchange.hrl with 56% similarity]
deps/rabbitmq_jms_topic_exchange/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_jms_topic_exchange/src/rabbit_jms_topic_exchange.erl [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/src/rabbit_jms_topic_exchange.erl with 93% similarity]
deps/rabbitmq_jms_topic_exchange/src/rabbitmq_jms_topic_exchange.app.src [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/src/rabbitmq_jms_topic_exchange.app.src with 63% similarity]
deps/rabbitmq_jms_topic_exchange/src/sjx_evaluator.erl [moved from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/src/sjx_evaluator.erl with 100% similarity]
deps/rabbitmq_management/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_management_agent/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_management/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_management_agent/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_management/LICENSE [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE with 100% similarity]
deps/rabbitmq_management/LICENSE-APACHE2-ExplorerCanvas [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-APACHE2-ExplorerCanvas with 100% similarity]
deps/rabbitmq_management/LICENSE-BSD-base64js [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-BSD-base64js with 100% similarity]
deps/rabbitmq_management/LICENSE-MIT-EJS10 [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-MIT-EJS10 with 100% similarity]
deps/rabbitmq_management/LICENSE-MIT-Flot [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-MIT-Flot with 100% similarity]
deps/rabbitmq_management/LICENSE-MIT-Sammy060 [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-MIT-Sammy060 with 100% similarity]
deps/rabbitmq_management/LICENSE-MIT-jQuery164 [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-MIT-jQuery164 with 100% similarity]
deps/rabbitmq_management/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_management/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_management/Makefile [moved from rabbitmq-server/deps/rabbitmq_management/Makefile with 85% similarity]
deps/rabbitmq_management/README.md [moved from rabbitmq-server/deps/rabbitmq_management/README.md with 100% similarity]
deps/rabbitmq_management/bin/rabbitmqadmin [moved from rabbitmq-server/deps/rabbitmq_management/bin/rabbitmqadmin with 100% similarity]
deps/rabbitmq_management/erlang.mk [new file with mode: 0644]
deps/rabbitmq_management/include/rabbit_mgmt.hrl [moved from rabbitmq-server/deps/rabbitmq_management/include/rabbit_mgmt.hrl with 100% similarity]
deps/rabbitmq_management/include/rabbit_mgmt_event_collector.hrl [moved from rabbitmq-server/deps/rabbitmq_management/include/rabbit_mgmt_event_collector.hrl with 100% similarity]
deps/rabbitmq_management/include/rabbit_mgmt_metrics.hrl [moved from rabbitmq-server/deps/rabbitmq_management/include/rabbit_mgmt_metrics.hrl with 100% similarity]
deps/rabbitmq_management/include/rabbit_mgmt_test.hrl [moved from rabbitmq-server/deps/rabbitmq_management/include/rabbit_mgmt_test.hrl with 100% similarity]
deps/rabbitmq_management/license_info [moved from rabbitmq-server/deps/rabbitmq_management/license_info with 100% similarity]
deps/rabbitmq_management/priv/www/api/index.html [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/api/index.html with 100% similarity]
deps/rabbitmq_management/priv/www/cli/index.html [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/cli/index.html with 100% similarity]
deps/rabbitmq_management/priv/www/css/evil.css [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/css/evil.css with 100% similarity]
deps/rabbitmq_management/priv/www/css/main.css [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/css/main.css with 100% similarity]
deps/rabbitmq_management/priv/www/doc/stats.html [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/doc/stats.html with 100% similarity]
deps/rabbitmq_management/priv/www/favicon.ico [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/favicon.ico with 100% similarity]
deps/rabbitmq_management/priv/www/img/bg-binary.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/bg-binary.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/bg-green-dark.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/bg-green-dark.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/bg-red-dark.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/bg-red-dark.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/bg-red.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/bg-red.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/bg-yellow-dark.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/bg-yellow-dark.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/collapse.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/collapse.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/expand.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/expand.png with 100% similarity]
deps/rabbitmq_management/priv/www/img/rabbitmqlogo.png [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/img/rabbitmqlogo.png with 100% similarity]
deps/rabbitmq_management/priv/www/index.html [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/index.html with 100% similarity]
deps/rabbitmq_management/priv/www/js/base64.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/base64.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/charts.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/charts.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/dispatcher.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/dispatcher.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/ejs.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/ejs.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/ejs.min.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/ejs.min.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/excanvas.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/excanvas.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/excanvas.min.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/excanvas.min.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/formatters.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/formatters.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/global.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/global.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/help.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/help.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/jquery-1.6.4.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/jquery-1.6.4.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/jquery-1.6.4.min.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/jquery-1.6.4.min.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/jquery.flot.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/jquery.flot.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/jquery.flot.min.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/jquery.flot.min.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/jquery.flot.time.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/jquery.flot.time.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/jquery.flot.time.min.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/jquery.flot.time.min.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/json2.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/json2.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/main.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/main.js with 98% similarity]
deps/rabbitmq_management/priv/www/js/prefs.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/prefs.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/sammy.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/sammy.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/sammy.min.js [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/sammy.min.js with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/404.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/404.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/add-binding.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/add-binding.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/binary.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/binary.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/bindings.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/bindings.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/channel.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/channel.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/channels-list.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/channels-list.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/channels.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/channels.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/cluster-name.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/cluster-name.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/columns-options.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/columns-options.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/connection.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/connection.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/connections.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/connections.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/consumers.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/consumers.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/error-popup.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/error-popup.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/exchange.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/exchange.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/exchanges.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/exchanges.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/import-succeeded.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/import-succeeded.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/layout.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/layout.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/login.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/login.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/memory-bar.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/memory-bar.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/memory-table.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/memory-table.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/memory.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/memory.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/messages.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/messages.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/msg-detail-deliveries.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/msg-detail-deliveries.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/msg-detail-publishes.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/msg-detail-publishes.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/node.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/node.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/overview.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/overview.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/partition.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/partition.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/paths.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/paths.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/permissions.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/permissions.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/policies.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/policies.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/policy.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/policy.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/publish.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/publish.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/queue.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/queue.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/queues.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/queues.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/rate-options.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/rate-options.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/registry.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/registry.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/status.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/status.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/user.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/user.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/users.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/users.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/vhost.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/vhost.ejs with 100% similarity]
deps/rabbitmq_management/priv/www/js/tmpl/vhosts.ejs [moved from rabbitmq-server/deps/rabbitmq_management/priv/www/js/tmpl/vhosts.ejs with 100% similarity]
deps/rabbitmq_management/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_management/src/rabbit_mgmt_app.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_app.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_channel_stats_collector.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_channel_stats_collector.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_cors.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_cors.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_db.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_db.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_dispatcher.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_dispatcher.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_event_collector.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_event_collector.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_event_collector_utils.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_event_collector_utils.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_extension.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_extension.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_format.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_format.erl with 99% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_load_definitions.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_load_definitions.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_queue_stats_collector.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_queue_stats_collector.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_reset_handler.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_reset_handler.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_stats.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_stats.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_stats_gc.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_stats_gc.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_stats_tables.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_stats_tables.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_sup.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_sup.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_sup_sup.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_sup_sup.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_util.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_util.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_aliveness_test.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_aliveness_test.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_binding.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_binding.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_bindings.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_bindings.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_channel.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_channel.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_channels.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_channels.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_channels_vhost.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_channels_vhost.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_cluster_name.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_cluster_name.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_connection.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_connection.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_connection_channels.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_connection_channels.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_connections.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_connections.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_connections_vhost.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_connections_vhost.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_consumers.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_consumers.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_definitions.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_definitions.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange_publish.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange_publish.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_exchanges.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_exchanges.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_extensions.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_extensions.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_healthchecks.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_healthchecks.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_node.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_node.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_node_memory.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_node_memory.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_node_memory_ets.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_node_memory_ets.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_overview.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_overview.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_parameter.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_parameter.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_parameters.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_parameters.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_permission.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_permission.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_permissions.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_permissions.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_permissions_user.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_permissions_user.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_permissions_vhost.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_permissions_vhost.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_policies.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_policies.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_policy.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_policy.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_actions.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_actions.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_get.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_get.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_purge.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_purge.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_queues.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_queues.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_user.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_user.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_users.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_users.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_vhost.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_vhost.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_vhosts.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_vhosts.erl with 100% similarity]
deps/rabbitmq_management/src/rabbit_mgmt_wm_whoami.erl [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_wm_whoami.erl with 100% similarity]
deps/rabbitmq_management/src/rabbitmq_management.app.src [moved from rabbitmq-server/deps/rabbitmq_management/src/rabbitmq_management.app.src with 88% similarity]
deps/rabbitmq_management_agent/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_management_agent/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_management_agent/LICENSE [moved from rabbitmq-server/deps/rabbitmq_management_agent/LICENSE with 100% similarity]
deps/rabbitmq_management_agent/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_management_agent/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_management_agent/Makefile [moved from rabbitmq-server/deps/rabbitmq_management_agent/Makefile with 92% similarity]
deps/rabbitmq_management_agent/erlang.mk [new file with mode: 0644]
deps/rabbitmq_management_agent/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_management_agent/src/rabbit_mgmt_agent_app.erl [moved from rabbitmq-server/deps/rabbitmq_management_agent/src/rabbit_mgmt_agent_app.erl with 100% similarity]
deps/rabbitmq_management_agent/src/rabbit_mgmt_agent_sup.erl [moved from rabbitmq-server/deps/rabbitmq_management_agent/src/rabbit_mgmt_agent_sup.erl with 100% similarity]
deps/rabbitmq_management_agent/src/rabbit_mgmt_db_handler.erl [moved from rabbitmq-server/deps/rabbitmq_management_agent/src/rabbit_mgmt_db_handler.erl with 100% similarity]
deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl [moved from rabbitmq-server/deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl with 100% similarity]
deps/rabbitmq_management_agent/src/rabbitmq_management_agent.app.src [moved from rabbitmq-server/deps/rabbitmq_management_agent/src/rabbitmq_management_agent.app.src with 68% similarity]
deps/rabbitmq_management_visualiser/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_mqtt/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_management_visualiser/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_mqtt/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_management_visualiser/LICENSE [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/LICENSE with 100% similarity]
deps/rabbitmq_management_visualiser/LICENSE-BSD-glMatrix [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/LICENSE-BSD-glMatrix with 100% similarity]
deps/rabbitmq_management_visualiser/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_management_visualiser/Makefile [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/Makefile with 84% similarity]
deps/rabbitmq_management_visualiser/README [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/README with 100% similarity]
deps/rabbitmq_management_visualiser/erlang.mk [new file with mode: 0644]
deps/rabbitmq_management_visualiser/license_info [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/license_info with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/js/visualiser.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/js/visualiser.js with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/index.html [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/index.html with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/js/glMatrix-min.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/js/glMatrix-min.js with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/js/glMatrix.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/js/glMatrix.js with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/js/main.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/js/main.js with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/js/model.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/js/model.js with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/js/octtree.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/js/octtree.js with 100% similarity]
deps/rabbitmq_management_visualiser/priv/www/visualiser/js/physics.js [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/priv/www/visualiser/js/physics.js with 100% similarity]
deps/rabbitmq_management_visualiser/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_management_visualiser/src/rabbit_mgmt_wm_all.erl [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/src/rabbit_mgmt_wm_all.erl with 100% similarity]
deps/rabbitmq_management_visualiser/src/rabbit_visualiser_mgmt.erl [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/src/rabbit_visualiser_mgmt.erl with 100% similarity]
deps/rabbitmq_management_visualiser/src/rabbitmq_management_visualiser.app.src [moved from rabbitmq-server/deps/rabbitmq_management_visualiser/src/rabbitmq_management_visualiser.app.src with 55% similarity]
deps/rabbitmq_mqtt/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_mqtt/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_mqtt/Makefile [moved from rabbitmq-server/deps/rabbitmq_mqtt/Makefile with 70% similarity]
deps/rabbitmq_mqtt/README.md [moved from rabbitmq-server/deps/rabbitmq_mqtt/README.md with 94% similarity]
deps/rabbitmq_mqtt/erlang.mk [new file with mode: 0644]
deps/rabbitmq_mqtt/include/rabbit_mqtt.hrl [moved from rabbitmq-server/deps/rabbitmq_mqtt/include/rabbit_mqtt.hrl with 100% similarity]
deps/rabbitmq_mqtt/include/rabbit_mqtt_frame.hrl [moved from rabbitmq-server/deps/rabbitmq_mqtt/include/rabbit_mqtt_frame.hrl with 100% similarity]
deps/rabbitmq_mqtt/include/rabbit_mqtt_retained_msg_store.hrl [moved from rabbitmq-server/deps/rabbitmq_mqtt/include/rabbit_mqtt_retained_msg_store.hrl with 100% similarity]
deps/rabbitmq_mqtt/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_mqtt/src/rabbit_mqtt.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_collector.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_collector.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_connection_sup.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_connection_sup.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_frame.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_frame.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_processor.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_processor.erl with 94% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_retained_msg_store.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_retained_msg_store.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_retained_msg_store_dets.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_retained_msg_store_dets.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_retained_msg_store_ets.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_retained_msg_store_ets.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_retainer.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_retainer.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_retainer_sup.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_retainer_sup.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_sup.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_sup.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_util.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_util.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbit_mqtt_vhost_event_handler.erl [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_vhost_event_handler.erl with 100% similarity]
deps/rabbitmq_mqtt/src/rabbitmq_mqtt.app.src [moved from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbitmq_mqtt.app.src with 90% similarity]
deps/rabbitmq_recent_history_exchange/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_sharding/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_recent_history_exchange/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_sharding/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_recent_history_exchange/LICENSE.md [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/LICENSE.md with 100% similarity]
deps/rabbitmq_recent_history_exchange/Makefile [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/Makefile with 82% similarity]
deps/rabbitmq_recent_history_exchange/README.md [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/README.md with 100% similarity]
deps/rabbitmq_recent_history_exchange/erlang.mk [new file with mode: 0644]
deps/rabbitmq_recent_history_exchange/etc/rabbit-hare.config [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/etc/rabbit-hare.config with 100% similarity]
deps/rabbitmq_recent_history_exchange/etc/rabbit-test.config [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/etc/rabbit-test.config with 100% similarity]
deps/rabbitmq_recent_history_exchange/include/rabbit_recent_history.hrl [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/include/rabbit_recent_history.hrl with 100% similarity]
deps/rabbitmq_recent_history_exchange/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_recent_history_exchange/src/rabbit_exchange_type_recent_history.erl [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/src/rabbit_exchange_type_recent_history.erl with 100% similarity]
deps/rabbitmq_recent_history_exchange/src/rabbitmq_recent_history_exchange.app.src [moved from rabbitmq-server/deps/rabbitmq_recent_history_exchange/src/rabbitmq_recent_history_exchange.app.src with 69% similarity]
deps/rabbitmq_sharding/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_shovel/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_sharding/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_shovel/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_sharding/LICENSE [moved from rabbitmq-server/deps/rabbitmq_sharding/LICENSE with 100% similarity]
deps/rabbitmq_sharding/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_sharding/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_sharding/LICENSE-MPL2 [moved from rabbitmq-server/deps/rabbitmq_sharding/LICENSE-MPL2 with 100% similarity]
deps/rabbitmq_sharding/Makefile [moved from rabbitmq-server/deps/rabbitmq_sharding/Makefile with 81% similarity]
deps/rabbitmq_sharding/README.extra.md [moved from rabbitmq-server/deps/rabbitmq_sharding/README.extra.md with 100% similarity]
deps/rabbitmq_sharding/README.md [moved from rabbitmq-server/deps/rabbitmq_sharding/README.md with 100% similarity]
deps/rabbitmq_sharding/docs/sharded_queues.png [moved from rabbitmq-server/deps/rabbitmq_sharding/docs/sharded_queues.png with 100% similarity]
deps/rabbitmq_sharding/erlang.mk [new file with mode: 0644]
deps/rabbitmq_sharding/etc/rabbit-hare.config [moved from rabbitmq-server/deps/rabbitmq_sharding/etc/rabbit-hare.config with 100% similarity]
deps/rabbitmq_sharding/etc/rabbit-test.config [moved from rabbitmq-server/deps/rabbitmq_sharding/etc/rabbit-test.config with 100% similarity]
deps/rabbitmq_sharding/etc/rkey.sh [moved from rabbitmq-server/deps/rabbitmq_sharding/etc/rkey.sh with 100% similarity]
deps/rabbitmq_sharding/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_sharding/src/rabbit_sharding_exchange_decorator.erl [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbit_sharding_exchange_decorator.erl with 100% similarity]
deps/rabbitmq_sharding/src/rabbit_sharding_exchange_type_modulus_hash.erl [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbit_sharding_exchange_type_modulus_hash.erl with 100% similarity]
deps/rabbitmq_sharding/src/rabbit_sharding_interceptor.erl [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbit_sharding_interceptor.erl with 100% similarity]
deps/rabbitmq_sharding/src/rabbit_sharding_policy_validator.erl [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbit_sharding_policy_validator.erl with 100% similarity]
deps/rabbitmq_sharding/src/rabbit_sharding_shard.erl [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbit_sharding_shard.erl with 100% similarity]
deps/rabbitmq_sharding/src/rabbit_sharding_util.erl [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbit_sharding_util.erl with 100% similarity]
deps/rabbitmq_sharding/src/rabbitmq_sharding.app.src [moved from rabbitmq-server/deps/rabbitmq_sharding/src/rabbitmq_sharding.app.src with 68% similarity]
deps/rabbitmq_shovel/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_shovel_management/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_shovel/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_shovel_management/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_shovel/Makefile [new file with mode: 0644]
deps/rabbitmq_shovel/README.md [moved from rabbitmq-server/deps/rabbitmq_shovel/README.md with 100% similarity]
deps/rabbitmq_shovel/erlang.mk [new file with mode: 0644]
deps/rabbitmq_shovel/include/rabbit_shovel.hrl [moved from rabbitmq-server/deps/rabbitmq_shovel/include/rabbit_shovel.hrl with 100% similarity]
deps/rabbitmq_shovel/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_shovel/src/rabbit_shovel.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_config.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_config.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_dyn_worker_sup.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_dyn_worker_sup.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_dyn_worker_sup_sup.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_dyn_worker_sup_sup.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_parameters.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_parameters.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_status.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_status.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_util.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_util.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_worker.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_worker.erl with 92% similarity]
deps/rabbitmq_shovel/src/rabbit_shovel_worker_sup.erl [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_worker_sup.erl with 100% similarity]
deps/rabbitmq_shovel/src/rabbitmq_shovel.app.src [moved from rabbitmq-server/deps/rabbitmq_shovel/src/rabbitmq_shovel.app.src with 81% similarity]
deps/rabbitmq_shovel_management/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_stomp/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_shovel_management/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_stomp/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_shovel_management/Makefile [new file with mode: 0644]
deps/rabbitmq_shovel_management/README.md [moved from rabbitmq-server/deps/rabbitmq_shovel_management/README.md with 100% similarity]
deps/rabbitmq_shovel_management/erlang.mk [new file with mode: 0644]
deps/rabbitmq_shovel_management/priv/www/js/shovel.js [moved from rabbitmq-server/deps/rabbitmq_shovel_management/priv/www/js/shovel.js with 100% similarity]
deps/rabbitmq_shovel_management/priv/www/js/tmpl/dynamic-shovel.ejs [moved from rabbitmq-server/deps/rabbitmq_shovel_management/priv/www/js/tmpl/dynamic-shovel.ejs with 100% similarity]
deps/rabbitmq_shovel_management/priv/www/js/tmpl/dynamic-shovels.ejs [moved from rabbitmq-server/deps/rabbitmq_shovel_management/priv/www/js/tmpl/dynamic-shovels.ejs with 100% similarity]
deps/rabbitmq_shovel_management/priv/www/js/tmpl/shovels.ejs [moved from rabbitmq-server/deps/rabbitmq_shovel_management/priv/www/js/tmpl/shovels.ejs with 100% similarity]
deps/rabbitmq_shovel_management/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl [moved from rabbitmq-server/deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl with 100% similarity]
deps/rabbitmq_shovel_management/src/rabbitmq_shovel_management.app.src [moved from rabbitmq-server/deps/rabbitmq_shovel_management/src/rabbitmq_shovel_management.app.src with 53% similarity]
deps/rabbitmq_stomp/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_top/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_stomp/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_top/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_stomp/Makefile [moved from rabbitmq-server/deps/rabbitmq_stomp/Makefile with 74% similarity]
deps/rabbitmq_stomp/NOTES [moved from rabbitmq-server/deps/rabbitmq_stomp/NOTES with 100% similarity]
deps/rabbitmq_stomp/README.md [moved from rabbitmq-server/deps/rabbitmq_stomp/README.md with 100% similarity]
deps/rabbitmq_stomp/erlang.mk [new file with mode: 0644]
deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_recv.pl [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_recv.pl with 100% similarity]
deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_rpc_client.pl [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_rpc_client.pl with 100% similarity]
deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_rpc_service.pl [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_rpc_service.pl with 100% similarity]
deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_send.pl [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_send.pl with 100% similarity]
deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_send_many.pl [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_send_many.pl with 100% similarity]
deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_slow_recv.pl [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/perl/rabbitmq_stomp_slow_recv.pl with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/cb-receiver.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/cb-receiver.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/cb-sender.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/cb-sender.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/cb-slow-receiver.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/cb-slow-receiver.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/persistent-receiver.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/persistent-receiver.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/persistent-sender.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/persistent-sender.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/topic-broadcast-receiver.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/topic-broadcast-receiver.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/topic-broadcast-with-unsubscribe.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/topic-broadcast-with-unsubscribe.rb with 100% similarity]
deps/rabbitmq_stomp/examples/ruby/topic-sender.rb [moved from rabbitmq-server/deps/rabbitmq_stomp/examples/ruby/topic-sender.rb with 100% similarity]
deps/rabbitmq_stomp/include/rabbit_stomp.hrl [moved from rabbitmq-server/deps/rabbitmq_stomp/include/rabbit_stomp.hrl with 100% similarity]
deps/rabbitmq_stomp/include/rabbit_stomp_frame.hrl [moved from rabbitmq-server/deps/rabbitmq_stomp/include/rabbit_stomp_frame.hrl with 100% similarity]
deps/rabbitmq_stomp/include/rabbit_stomp_headers.hrl [moved from rabbitmq-server/deps/rabbitmq_stomp/include/rabbit_stomp_headers.hrl with 100% similarity]
deps/rabbitmq_stomp/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_stomp/src/rabbit_stomp.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbit_stomp_client_sup.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp_client_sup.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbit_stomp_frame.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp_frame.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbit_stomp_processor.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp_processor.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbit_stomp_reader.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp_reader.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbit_stomp_sup.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp_sup.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbit_stomp_util.erl [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbit_stomp_util.erl with 100% similarity]
deps/rabbitmq_stomp/src/rabbitmq_stomp.app.src [moved from rabbitmq-server/deps/rabbitmq_stomp/src/rabbitmq_stomp.app.src with 79% similarity]
deps/rabbitmq_top/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_tracing/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_top/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_tracing/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_top/Makefile [moved from rabbitmq-server/deps/rabbitmq_top/Makefile with 83% similarity]
deps/rabbitmq_top/README.md [moved from rabbitmq-server/deps/rabbitmq_top/README.md with 100% similarity]
deps/rabbitmq_top/erlang.mk [new file with mode: 0644]
deps/rabbitmq_top/priv/www/js/tmpl/ets_tables.ejs [moved from rabbitmq-server/deps/rabbitmq_top/priv/www/js/tmpl/ets_tables.ejs with 100% similarity]
deps/rabbitmq_top/priv/www/js/tmpl/process.ejs [moved from rabbitmq-server/deps/rabbitmq_top/priv/www/js/tmpl/process.ejs with 100% similarity]
deps/rabbitmq_top/priv/www/js/tmpl/processes.ejs [moved from rabbitmq-server/deps/rabbitmq_top/priv/www/js/tmpl/processes.ejs with 100% similarity]
deps/rabbitmq_top/priv/www/js/top.js [moved from rabbitmq-server/deps/rabbitmq_top/priv/www/js/top.js with 100% similarity]
deps/rabbitmq_top/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_top/src/rabbit_top_app.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_app.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_extension.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_extension.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_sup.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_sup.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_util.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_util.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_wm_ets_tables.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_wm_ets_tables.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_wm_process.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_wm_process.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_wm_processes.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_wm_processes.erl with 100% similarity]
deps/rabbitmq_top/src/rabbit_top_worker.erl [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbit_top_worker.erl with 100% similarity]
deps/rabbitmq_top/src/rabbitmq_top.app.src [moved from rabbitmq-server/deps/rabbitmq_top/src/rabbitmq_top.app.src with 56% similarity]
deps/rabbitmq_tracing/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_trust_store/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_tracing/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_trust_store/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_tracing/Makefile [moved from rabbitmq-server/deps/rabbitmq_tracing/Makefile with 77% similarity]
deps/rabbitmq_tracing/README.md [moved from rabbitmq-server/deps/rabbitmq_tracing/README.md with 100% similarity]
deps/rabbitmq_tracing/erlang.mk [new file with mode: 0644]
deps/rabbitmq_tracing/priv/www/js/tmpl/traces.ejs [moved from rabbitmq-server/deps/rabbitmq_tracing/priv/www/js/tmpl/traces.ejs with 100% similarity]
deps/rabbitmq_tracing/priv/www/js/tracing.js [moved from rabbitmq-server/deps/rabbitmq_tracing/priv/www/js/tracing.js with 100% similarity]
deps/rabbitmq_tracing/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_tracing/src/rabbit_tracing_app.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_app.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_consumer.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_consumer.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_consumer_sup.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_consumer_sup.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_files.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_files.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_mgmt.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_mgmt.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_sup.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_sup.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_traces.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_traces.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_util.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_util.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_wm_file.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_wm_files.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_wm_files.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_wm_trace.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_wm_trace.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbit_tracing_wm_traces.erl [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbit_tracing_wm_traces.erl with 100% similarity]
deps/rabbitmq_tracing/src/rabbitmq_tracing.app.src [moved from rabbitmq-server/deps/rabbitmq_tracing/src/rabbitmq_tracing.app.src with 73% similarity]
deps/rabbitmq_trust_store/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_trust_store/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_trust_store/Makefile [moved from rabbitmq-server/deps/rabbitmq_trust_store/Makefile with 62% similarity]
deps/rabbitmq_trust_store/README.md [moved from rabbitmq-server/deps/rabbitmq_trust_store/README.md with 100% similarity]
deps/rabbitmq_trust_store/erlang.mk [new file with mode: 0644]
deps/rabbitmq_trust_store/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_trust_store/src/rabbit_trust_store.erl [moved from rabbitmq-server/deps/rabbitmq_trust_store/src/rabbit_trust_store.erl with 100% similarity]
deps/rabbitmq_trust_store/src/rabbit_trust_store_app.erl [moved from rabbitmq-server/deps/rabbitmq_trust_store/src/rabbit_trust_store_app.erl with 100% similarity]
deps/rabbitmq_trust_store/src/rabbit_trust_store_sup.erl [moved from rabbitmq-server/deps/rabbitmq_trust_store/src/rabbit_trust_store_sup.erl with 100% similarity]
deps/rabbitmq_trust_store/src/rabbitmq_trust_store.app.src [moved from rabbitmq-server/deps/rabbitmq_trust_store/src/rabbitmq_trust_store.app.src with 90% similarity]
deps/rabbitmq_web_dispatch/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_web_stomp/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_web_dispatch/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_web_stomp/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_web_dispatch/LICENSE [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/LICENSE with 100% similarity]
deps/rabbitmq_web_dispatch/Makefile [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/Makefile with 80% similarity]
deps/rabbitmq_web_dispatch/README.md [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/README.md with 100% similarity]
deps/rabbitmq_web_dispatch/erlang.mk [new file with mode: 0644]
deps/rabbitmq_web_dispatch/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_app.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_app.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_registry.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_registry.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_sup.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_sup.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_util.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_util.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbit_webmachine.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_webmachine.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbit_webmachine_error_handler.erl [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbit_webmachine_error_handler.erl with 100% similarity]
deps/rabbitmq_web_dispatch/src/rabbitmq_web_dispatch.app.src [moved from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbitmq_web_dispatch.app.src with 62% similarity]
deps/rabbitmq_web_stomp/CODE_OF_CONDUCT.md [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/CODE_OF_CONDUCT.md with 100% similarity]
deps/rabbitmq_web_stomp/CONTRIBUTING.md [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/CONTRIBUTING.md with 100% similarity]
deps/rabbitmq_web_stomp/LICENSE [moved from rabbitmq-server/deps/rabbitmq_web_stomp/LICENSE with 100% similarity]
deps/rabbitmq_web_stomp/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_web_stomp/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_web_stomp/Makefile [moved from rabbitmq-server/deps/rabbitmq_web_stomp/Makefile with 81% similarity]
deps/rabbitmq_web_stomp/README.md [moved from rabbitmq-server/deps/rabbitmq_web_stomp/README.md with 100% similarity]
deps/rabbitmq_web_stomp/erlang.mk [new file with mode: 0644]
deps/rabbitmq_web_stomp/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_web_stomp/src/rabbit_ws_app.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_app.erl with 100% similarity]
deps/rabbitmq_web_stomp/src/rabbit_ws_client.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_client.erl with 91% similarity]
deps/rabbitmq_web_stomp/src/rabbit_ws_client_sup.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_client_sup.erl with 100% similarity]
deps/rabbitmq_web_stomp/src/rabbit_ws_handler.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_handler.erl with 100% similarity]
deps/rabbitmq_web_stomp/src/rabbit_ws_sockjs.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_sockjs.erl with 100% similarity]
deps/rabbitmq_web_stomp/src/rabbit_ws_sup.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_sup.erl with 100% similarity]
deps/rabbitmq_web_stomp/src/rabbitmq_web_stomp.app.src [moved from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbitmq_web_stomp.app.src with 80% similarity]
deps/rabbitmq_web_stomp_examples/CODE_OF_CONDUCT.md [new file with mode: 0644]
deps/rabbitmq_web_stomp_examples/CONTRIBUTING.md [new file with mode: 0644]
deps/rabbitmq_web_stomp_examples/LICENSE [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/LICENSE with 100% similarity]
deps/rabbitmq_web_stomp_examples/LICENSE-APL2-Stomp-Websocket [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/LICENSE-APL2-Stomp-Websocket with 100% similarity]
deps/rabbitmq_web_stomp_examples/LICENSE-MPL-RabbitMQ [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/LICENSE-MPL-RabbitMQ with 100% similarity]
deps/rabbitmq_web_stomp_examples/Makefile [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/Makefile with 82% similarity]
deps/rabbitmq_web_stomp_examples/README.md [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/README.md with 100% similarity]
deps/rabbitmq_web_stomp_examples/erlang.mk [new file with mode: 0644]
deps/rabbitmq_web_stomp_examples/priv/bunny.html [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/bunny.html with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/bunny.png [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/bunny.png with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/echo.html [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/echo.html with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/index.html [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/index.html with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/main.css [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/main.css with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/pencil.cur [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/pencil.cur with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/stomp.js [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/stomp.js with 100% similarity]
deps/rabbitmq_web_stomp_examples/priv/temp-queue.html [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/priv/temp-queue.html with 100% similarity]
deps/rabbitmq_web_stomp_examples/rabbitmq-components.mk [new file with mode: 0644]
deps/rabbitmq_web_stomp_examples/src/rabbit_web_stomp_examples_app.erl [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/src/rabbit_web_stomp_examples_app.erl with 100% similarity]
deps/rabbitmq_web_stomp_examples/src/rabbitmq_web_stomp_examples.app.src [moved from rabbitmq-server/deps/rabbitmq_web_stomp_examples/src/rabbitmq_web_stomp_examples.app.src with 63% similarity]
deps/ranch/AUTHORS [moved from rabbitmq-server/deps/ranch/AUTHORS with 100% similarity]
deps/ranch/CHANGELOG.asciidoc [moved from rabbitmq-server/deps/ranch/CHANGELOG.asciidoc with 100% similarity]
deps/ranch/LICENSE [moved from rabbitmq-server/deps/ranch/LICENSE with 100% similarity]
deps/ranch/Makefile [moved from rabbitmq-server/deps/ranch/Makefile with 100% similarity]
deps/ranch/README.asciidoc [moved from rabbitmq-server/deps/ranch/README.asciidoc with 100% similarity]
deps/ranch/appveyor.yml [moved from rabbitmq-server/deps/ranch/appveyor.yml with 100% similarity]
deps/ranch/circle.yml [moved from rabbitmq-server/deps/ranch/circle.yml with 100% similarity]
deps/ranch/doc/src/guide/book.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/book.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/embedded.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/embedded.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/internals.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/internals.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/introduction.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/introduction.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/listeners.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/listeners.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/parsers.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/parsers.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/protocols.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/protocols.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/ssl_auth.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/ssl_auth.asciidoc with 100% similarity]
deps/ranch/doc/src/guide/transports.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/guide/transports.asciidoc with 100% similarity]
deps/ranch/doc/src/manual/ranch.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/manual/ranch.asciidoc with 100% similarity]
deps/ranch/doc/src/manual/ranch_app.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/manual/ranch_app.asciidoc with 100% similarity]
deps/ranch/doc/src/manual/ranch_protocol.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/manual/ranch_protocol.asciidoc with 100% similarity]
deps/ranch/doc/src/manual/ranch_ssl.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/manual/ranch_ssl.asciidoc with 100% similarity]
deps/ranch/doc/src/manual/ranch_tcp.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/manual/ranch_tcp.asciidoc with 100% similarity]
deps/ranch/doc/src/manual/ranch_transport.asciidoc [moved from rabbitmq-server/deps/ranch/doc/src/manual/ranch_transport.asciidoc with 100% similarity]
deps/ranch/erlang.mk [moved from rabbitmq-server/deps/ranch/erlang.mk with 100% similarity]
deps/ranch/examples/tcp_echo/Makefile [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/Makefile with 100% similarity]
deps/ranch/examples/tcp_echo/README.md [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/README.md with 100% similarity]
deps/ranch/examples/tcp_echo/relx.config [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/relx.config with 100% similarity]
deps/ranch/examples/tcp_echo/src/echo_protocol.erl [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/src/echo_protocol.erl with 100% similarity]
deps/ranch/examples/tcp_echo/src/tcp_echo.app.src [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/src/tcp_echo.app.src with 100% similarity]
deps/ranch/examples/tcp_echo/src/tcp_echo_app.erl [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/src/tcp_echo_app.erl with 100% similarity]
deps/ranch/examples/tcp_echo/src/tcp_echo_sup.erl [moved from rabbitmq-server/deps/ranch/examples/tcp_echo/src/tcp_echo_sup.erl with 100% similarity]
deps/ranch/examples/tcp_reverse/Makefile [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/Makefile with 100% similarity]
deps/ranch/examples/tcp_reverse/README.md [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/README.md with 100% similarity]
deps/ranch/examples/tcp_reverse/relx.config [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/relx.config with 100% similarity]
deps/ranch/examples/tcp_reverse/src/reverse_protocol.erl [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/src/reverse_protocol.erl with 100% similarity]
deps/ranch/examples/tcp_reverse/src/tcp_reverse.app.src [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/src/tcp_reverse.app.src with 100% similarity]
deps/ranch/examples/tcp_reverse/src/tcp_reverse_app.erl [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/src/tcp_reverse_app.erl with 100% similarity]
deps/ranch/examples/tcp_reverse/src/tcp_reverse_sup.erl [moved from rabbitmq-server/deps/ranch/examples/tcp_reverse/src/tcp_reverse_sup.erl with 100% similarity]
deps/ranch/src/ranch.app.src [moved from rabbitmq-server/deps/ranch/src/ranch.app.src with 100% similarity]
deps/ranch/src/ranch.erl [moved from rabbitmq-server/deps/ranch/src/ranch.erl with 100% similarity]
deps/ranch/src/ranch_acceptor.erl [moved from rabbitmq-server/deps/ranch/src/ranch_acceptor.erl with 100% similarity]
deps/ranch/src/ranch_acceptors_sup.erl [moved from rabbitmq-server/deps/ranch/src/ranch_acceptors_sup.erl with 100% similarity]
deps/ranch/src/ranch_app.erl [moved from rabbitmq-server/deps/ranch/src/ranch_app.erl with 100% similarity]
deps/ranch/src/ranch_conns_sup.erl [moved from rabbitmq-server/deps/ranch/src/ranch_conns_sup.erl with 100% similarity]
deps/ranch/src/ranch_listener_sup.erl [moved from rabbitmq-server/deps/ranch/src/ranch_listener_sup.erl with 100% similarity]
deps/ranch/src/ranch_protocol.erl [moved from rabbitmq-server/deps/ranch/src/ranch_protocol.erl with 100% similarity]
deps/ranch/src/ranch_server.erl [moved from rabbitmq-server/deps/ranch/src/ranch_server.erl with 100% similarity]
deps/ranch/src/ranch_ssl.erl [moved from rabbitmq-server/deps/ranch/src/ranch_ssl.erl with 100% similarity]
deps/ranch/src/ranch_sup.erl [moved from rabbitmq-server/deps/ranch/src/ranch_sup.erl with 100% similarity]
deps/ranch/src/ranch_tcp.erl [moved from rabbitmq-server/deps/ranch/src/ranch_tcp.erl with 100% similarity]
deps/ranch/src/ranch_transport.erl [moved from rabbitmq-server/deps/ranch/src/ranch_transport.erl with 100% similarity]
deps/sockjs/COPYING [moved from rabbitmq-server/deps/sockjs/COPYING with 100% similarity]
deps/sockjs/Changelog [moved from rabbitmq-server/deps/sockjs/Changelog with 100% similarity]
deps/sockjs/LICENSE-APL2-Rebar [moved from rabbitmq-server/deps/sockjs/LICENSE-APL2-Rebar with 100% similarity]
deps/sockjs/LICENSE-EPL-OTP [moved from rabbitmq-server/deps/sockjs/LICENSE-EPL-OTP with 100% similarity]
deps/sockjs/LICENSE-MIT-Mochiweb [moved from rabbitmq-server/deps/sockjs/LICENSE-MIT-Mochiweb with 100% similarity]
deps/sockjs/LICENSE-MIT-SockJS [moved from rabbitmq-server/deps/sockjs/LICENSE-MIT-SockJS with 100% similarity]
deps/sockjs/Makefile [moved from rabbitmq-server/deps/sockjs/Makefile with 88% similarity]
deps/sockjs/Makefile.orig.mk [moved from rabbitmq-server/deps/sockjs/Makefile.orig.mk with 100% similarity]
deps/sockjs/README.md [moved from rabbitmq-server/deps/sockjs/README.md with 100% similarity]
deps/sockjs/examples/cowboy_echo.erl [moved from rabbitmq-server/deps/sockjs/examples/cowboy_echo.erl with 100% similarity]
deps/sockjs/examples/cowboy_echo_authen_callback.erl [moved from rabbitmq-server/deps/sockjs/examples/cowboy_echo_authen_callback.erl with 100% similarity]
deps/sockjs/examples/cowboy_test_server.erl [moved from rabbitmq-server/deps/sockjs/examples/cowboy_test_server.erl with 100% similarity]
deps/sockjs/examples/echo.html [moved from rabbitmq-server/deps/sockjs/examples/echo.html with 100% similarity]
deps/sockjs/examples/echo_authen_callback.html [moved from rabbitmq-server/deps/sockjs/examples/echo_authen_callback.html with 100% similarity]
deps/sockjs/examples/multiplex/cowboy_multiplex.erl [moved from rabbitmq-server/deps/sockjs/examples/multiplex/cowboy_multiplex.erl with 100% similarity]
deps/sockjs/examples/multiplex/cowboy_multiplex_authen_callback.erl [moved from rabbitmq-server/deps/sockjs/examples/multiplex/cowboy_multiplex_authen_callback.erl with 100% similarity]
deps/sockjs/examples/multiplex/index.html [moved from rabbitmq-server/deps/sockjs/examples/multiplex/index.html with 100% similarity]
deps/sockjs/examples/multiplex/index_authen_callback.html [moved from rabbitmq-server/deps/sockjs/examples/multiplex/index_authen_callback.html with 100% similarity]
deps/sockjs/rebar [moved from rabbitmq-server/deps/sockjs/rebar with 100% similarity]
deps/sockjs/rebar.config [moved from rabbitmq-server/deps/sockjs/rebar.config with 100% similarity]
deps/sockjs/src/mochijson2_fork.erl [moved from rabbitmq-server/deps/sockjs/src/mochijson2_fork.erl with 100% similarity]
deps/sockjs/src/mochinum_fork.erl [moved from rabbitmq-server/deps/sockjs/src/mochinum_fork.erl with 100% similarity]
deps/sockjs/src/sockjs.app.src [moved from rabbitmq-server/deps/sockjs/src/sockjs.app.src with 100% similarity]
deps/sockjs/src/sockjs.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs.erl with 100% similarity]
deps/sockjs/src/sockjs_action.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_action.erl with 100% similarity]
deps/sockjs/src/sockjs_app.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_app.erl with 100% similarity]
deps/sockjs/src/sockjs_cowboy_handler.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_cowboy_handler.erl with 100% similarity]
deps/sockjs/src/sockjs_filters.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_filters.erl with 100% similarity]
deps/sockjs/src/sockjs_handler.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_handler.erl with 100% similarity]
deps/sockjs/src/sockjs_http.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_http.erl with 100% similarity]
deps/sockjs/src/sockjs_internal.hrl [moved from rabbitmq-server/deps/sockjs/src/sockjs_internal.hrl with 100% similarity]
deps/sockjs/src/sockjs_json.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_json.erl with 100% similarity]
deps/sockjs/src/sockjs_multiplex.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_multiplex.erl with 100% similarity]
deps/sockjs/src/sockjs_multiplex_channel.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_multiplex_channel.erl with 100% similarity]
deps/sockjs/src/sockjs_service.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_service.erl with 100% similarity]
deps/sockjs/src/sockjs_session.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_session.erl with 100% similarity]
deps/sockjs/src/sockjs_session_sup.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_session_sup.erl with 100% similarity]
deps/sockjs/src/sockjs_util.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_util.erl with 100% similarity]
deps/sockjs/src/sockjs_ws_handler.erl [moved from rabbitmq-server/deps/sockjs/src/sockjs_ws_handler.erl with 100% similarity]
deps/webmachine/Emakefile [moved from rabbitmq-server/deps/webmachine/Emakefile with 100% similarity]
deps/webmachine/LICENSE [moved from rabbitmq-server/deps/webmachine/LICENSE with 100% similarity]
deps/webmachine/Makefile [moved from rabbitmq-server/deps/webmachine/Makefile with 100% similarity]
deps/webmachine/Makefile.orig.mk [moved from rabbitmq-server/deps/webmachine/Makefile.orig.mk with 100% similarity]
deps/webmachine/README.org [moved from rabbitmq-server/deps/webmachine/README.org with 100% similarity]
deps/webmachine/THANKS [moved from rabbitmq-server/deps/webmachine/THANKS with 100% similarity]
deps/webmachine/demo/Makefile [moved from rabbitmq-server/deps/webmachine/demo/Makefile with 100% similarity]
deps/webmachine/demo/README [moved from rabbitmq-server/deps/webmachine/demo/README with 100% similarity]
deps/webmachine/demo/priv/dispatch.conf [moved from rabbitmq-server/deps/webmachine/demo/priv/dispatch.conf with 100% similarity]
deps/webmachine/demo/rebar.config [moved from rabbitmq-server/deps/webmachine/demo/rebar.config with 100% similarity]
deps/webmachine/demo/src/webmachine_demo.app.src [moved from rabbitmq-server/deps/webmachine/demo/src/webmachine_demo.app.src with 100% similarity]
deps/webmachine/demo/src/webmachine_demo.erl [moved from rabbitmq-server/deps/webmachine/demo/src/webmachine_demo.erl with 100% similarity]
deps/webmachine/demo/src/webmachine_demo_app.erl [moved from rabbitmq-server/deps/webmachine/demo/src/webmachine_demo_app.erl with 100% similarity]
deps/webmachine/demo/src/webmachine_demo_fs_resource.erl [moved from rabbitmq-server/deps/webmachine/demo/src/webmachine_demo_fs_resource.erl with 100% similarity]
deps/webmachine/demo/src/webmachine_demo_resource.erl [moved from rabbitmq-server/deps/webmachine/demo/src/webmachine_demo_resource.erl with 100% similarity]
deps/webmachine/demo/src/webmachine_demo_sup.erl [moved from rabbitmq-server/deps/webmachine/demo/src/webmachine_demo_sup.erl with 100% similarity]
deps/webmachine/demo/start.sh [moved from rabbitmq-server/deps/webmachine/demo/start.sh with 100% similarity]
deps/webmachine/docs/http-headers-status-v3.png [moved from rabbitmq-server/deps/webmachine/docs/http-headers-status-v3.png with 100% similarity]
deps/webmachine/include/webmachine.hrl [moved from rabbitmq-server/deps/webmachine/include/webmachine.hrl with 100% similarity]
deps/webmachine/include/webmachine_logger.hrl [moved from rabbitmq-server/deps/webmachine/include/webmachine_logger.hrl with 100% similarity]
deps/webmachine/include/wm_reqdata.hrl [moved from rabbitmq-server/deps/webmachine/include/wm_reqdata.hrl with 100% similarity]
deps/webmachine/include/wm_reqstate.hrl [moved from rabbitmq-server/deps/webmachine/include/wm_reqstate.hrl with 100% similarity]
deps/webmachine/include/wm_resource.hrl [moved from rabbitmq-server/deps/webmachine/include/wm_resource.hrl with 100% similarity]
deps/webmachine/priv/templates/Makefile [moved from rabbitmq-server/deps/webmachine/priv/templates/Makefile with 100% similarity]
deps/webmachine/priv/templates/README [moved from rabbitmq-server/deps/webmachine/priv/templates/README with 100% similarity]
deps/webmachine/priv/templates/priv/dispatch.conf [moved from rabbitmq-server/deps/webmachine/priv/templates/priv/dispatch.conf with 100% similarity]
deps/webmachine/priv/templates/rebar.config [moved from rabbitmq-server/deps/webmachine/priv/templates/rebar.config with 100% similarity]
deps/webmachine/priv/templates/src/wmskel.app.src [moved from rabbitmq-server/deps/webmachine/priv/templates/src/wmskel.app.src with 100% similarity]
deps/webmachine/priv/templates/src/wmskel.erl [moved from rabbitmq-server/deps/webmachine/priv/templates/src/wmskel.erl with 100% similarity]
deps/webmachine/priv/templates/src/wmskel_app.erl [moved from rabbitmq-server/deps/webmachine/priv/templates/src/wmskel_app.erl with 100% similarity]
deps/webmachine/priv/templates/src/wmskel_resource.erl [moved from rabbitmq-server/deps/webmachine/priv/templates/src/wmskel_resource.erl with 100% similarity]
deps/webmachine/priv/templates/src/wmskel_sup.erl [moved from rabbitmq-server/deps/webmachine/priv/templates/src/wmskel_sup.erl with 100% similarity]
deps/webmachine/priv/templates/start.sh [moved from rabbitmq-server/deps/webmachine/priv/templates/start.sh with 100% similarity]
deps/webmachine/priv/templates/wmskel.template [moved from rabbitmq-server/deps/webmachine/priv/templates/wmskel.template with 100% similarity]
deps/webmachine/priv/trace/http-headers-status-v3.png [moved from rabbitmq-server/deps/webmachine/priv/trace/http-headers-status-v3.png with 100% similarity]
deps/webmachine/priv/trace/wmtrace.css [moved from rabbitmq-server/deps/webmachine/priv/trace/wmtrace.css with 100% similarity]
deps/webmachine/priv/trace/wmtrace.js [moved from rabbitmq-server/deps/webmachine/priv/trace/wmtrace.js with 100% similarity]
deps/webmachine/priv/www/index.html [moved from rabbitmq-server/deps/webmachine/priv/www/index.html with 100% similarity]
deps/webmachine/rebar [moved from rabbitmq-server/deps/webmachine/rebar with 100% similarity]
deps/webmachine/rebar.config [moved from rabbitmq-server/deps/webmachine/rebar.config with 100% similarity]
deps/webmachine/rebar.config.script [moved from rabbitmq-server/deps/webmachine/rebar.config.script with 100% similarity]
deps/webmachine/scripts/new_webmachine.sh [moved from rabbitmq-server/deps/webmachine/scripts/new_webmachine.sh with 100% similarity]
deps/webmachine/src/webmachine.app.src [moved from rabbitmq-server/deps/webmachine/src/webmachine.app.src with 100% similarity]
deps/webmachine/src/webmachine.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine.erl with 100% similarity]
deps/webmachine/src/webmachine_app.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_app.erl with 100% similarity]
deps/webmachine/src/webmachine_decision_core.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_decision_core.erl with 100% similarity]
deps/webmachine/src/webmachine_deps.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_deps.erl with 100% similarity]
deps/webmachine/src/webmachine_dispatcher.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_dispatcher.erl with 100% similarity]
deps/webmachine/src/webmachine_error.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_error.erl with 100% similarity]
deps/webmachine/src/webmachine_error_handler.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_error_handler.erl with 100% similarity]
deps/webmachine/src/webmachine_log.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_log.erl with 100% similarity]
deps/webmachine/src/webmachine_log_handler.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_log_handler.erl with 100% similarity]
deps/webmachine/src/webmachine_logger_watcher.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_logger_watcher.erl with 100% similarity]
deps/webmachine/src/webmachine_logger_watcher_sup.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_logger_watcher_sup.erl with 100% similarity]
deps/webmachine/src/webmachine_mochiweb.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_mochiweb.erl with 100% similarity]
deps/webmachine/src/webmachine_multipart.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_multipart.erl with 100% similarity]
deps/webmachine/src/webmachine_perf_log_handler.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_perf_log_handler.erl with 100% similarity]
deps/webmachine/src/webmachine_request.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_request.erl with 100% similarity]
deps/webmachine/src/webmachine_resource.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_resource.erl with 100% similarity]
deps/webmachine/src/webmachine_router.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_router.erl with 100% similarity]
deps/webmachine/src/webmachine_sup.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_sup.erl with 100% similarity]
deps/webmachine/src/webmachine_util.erl [moved from rabbitmq-server/deps/webmachine/src/webmachine_util.erl with 100% similarity]
deps/webmachine/src/wmtrace_resource.erl [moved from rabbitmq-server/deps/webmachine/src/wmtrace_resource.erl with 100% similarity]
deps/webmachine/src/wrq.erl [moved from rabbitmq-server/deps/webmachine/src/wrq.erl with 100% similarity]
deps/webmachine/start-dev.sh [moved from rabbitmq-server/deps/webmachine/start-dev.sh with 100% similarity]
deps/webmachine/start.sh [moved from rabbitmq-server/deps/webmachine/start.sh with 100% similarity]
deps/webmachine/www/blogs.html [moved from rabbitmq-server/deps/webmachine/www/blogs.html with 100% similarity]
deps/webmachine/www/contact.html [moved from rabbitmq-server/deps/webmachine/www/contact.html with 100% similarity]
deps/webmachine/www/css/style-1c.css [moved from rabbitmq-server/deps/webmachine/www/css/style-1c.css with 100% similarity]
deps/webmachine/www/css/style.css [moved from rabbitmq-server/deps/webmachine/www/css/style.css with 100% similarity]
deps/webmachine/www/debugging.html [moved from rabbitmq-server/deps/webmachine/www/debugging.html with 100% similarity]
deps/webmachine/www/diagram.html [moved from rabbitmq-server/deps/webmachine/www/diagram.html with 100% similarity]
deps/webmachine/www/dispatcher.html [moved from rabbitmq-server/deps/webmachine/www/dispatcher.html with 100% similarity]
deps/webmachine/www/docs.html [moved from rabbitmq-server/deps/webmachine/www/docs.html with 100% similarity]
deps/webmachine/www/example_resources.html [moved from rabbitmq-server/deps/webmachine/www/example_resources.html with 100% similarity]
deps/webmachine/www/favicon.ico [moved from rabbitmq-server/deps/webmachine/www/favicon.ico with 100% similarity]
deps/webmachine/www/images/WM200-crop.png [moved from rabbitmq-server/deps/webmachine/www/images/WM200-crop.png with 100% similarity]
deps/webmachine/www/images/basho-landscape.gif [moved from rabbitmq-server/deps/webmachine/www/images/basho-landscape.gif with 100% similarity]
deps/webmachine/www/images/basic-trace-decision-tab.png [moved from rabbitmq-server/deps/webmachine/www/images/basic-trace-decision-tab.png with 100% similarity]
deps/webmachine/www/images/basic-trace-labeled.png [moved from rabbitmq-server/deps/webmachine/www/images/basic-trace-labeled.png with 100% similarity]
deps/webmachine/www/images/basic-trace-request-tab.png [moved from rabbitmq-server/deps/webmachine/www/images/basic-trace-request-tab.png with 100% similarity]
deps/webmachine/www/images/basic-trace-response-tab.png [moved from rabbitmq-server/deps/webmachine/www/images/basic-trace-response-tab.png with 100% similarity]
deps/webmachine/www/images/bg.gif [moved from rabbitmq-server/deps/webmachine/www/images/bg.gif with 100% similarity]
deps/webmachine/www/images/blankbox.gif [moved from rabbitmq-server/deps/webmachine/www/images/blankbox.gif with 100% similarity]
deps/webmachine/www/images/chash.gif [moved from rabbitmq-server/deps/webmachine/www/images/chash.gif with 100% similarity]
deps/webmachine/www/images/easy-ops.gif [moved from rabbitmq-server/deps/webmachine/www/images/easy-ops.gif with 100% similarity]
deps/webmachine/www/images/gossip4.gif [moved from rabbitmq-server/deps/webmachine/www/images/gossip4.gif with 100% similarity]
deps/webmachine/www/images/halfblankbox.gif [moved from rabbitmq-server/deps/webmachine/www/images/halfblankbox.gif with 100% similarity]
deps/webmachine/www/images/http-headers-status-v3.png [moved from rabbitmq-server/deps/webmachine/www/images/http-headers-status-v3.png with 100% similarity]
deps/webmachine/www/images/more.gif [moved from rabbitmq-server/deps/webmachine/www/images/more.gif with 100% similarity]
deps/webmachine/www/images/site.gif [moved from rabbitmq-server/deps/webmachine/www/images/site.gif with 100% similarity]
deps/webmachine/www/images/splash250.gif [moved from rabbitmq-server/deps/webmachine/www/images/splash250.gif with 100% similarity]
deps/webmachine/www/images/vclock.gif [moved from rabbitmq-server/deps/webmachine/www/images/vclock.gif with 100% similarity]
deps/webmachine/www/index.html [moved from rabbitmq-server/deps/webmachine/www/index.html with 100% similarity]
deps/webmachine/www/intros.html [moved from rabbitmq-server/deps/webmachine/www/intros.html with 100% similarity]
deps/webmachine/www/mechanics.html [moved from rabbitmq-server/deps/webmachine/www/mechanics.html with 100% similarity]
deps/webmachine/www/quickstart.html [moved from rabbitmq-server/deps/webmachine/www/quickstart.html with 100% similarity]
deps/webmachine/www/reftrans.html [moved from rabbitmq-server/deps/webmachine/www/reftrans.html with 100% similarity]
deps/webmachine/www/reqdata.html [moved from rabbitmq-server/deps/webmachine/www/reqdata.html with 100% similarity]
deps/webmachine/www/resources.html [moved from rabbitmq-server/deps/webmachine/www/resources.html with 100% similarity]
deps/webmachine/www/streambody.html [moved from rabbitmq-server/deps/webmachine/www/streambody.html with 100% similarity]
erlang.mk [new file with mode: 0644]
git-revisions.txt [new file with mode: 0644]
rabbitmq-components.mk [new file with mode: 0644]
rabbitmq-server/deps/amqp_client/erlang.mk [deleted file]
rabbitmq-server/deps/amqp_client/src/rabbit_ct_client_helpers.erl [deleted file]
rabbitmq-server/deps/amqp_client/test/system_SUITE.erl [deleted file]
rabbitmq-server/deps/amqp_client/test/unit_SUITE.erl [deleted file]
rabbitmq-server/deps/cowboy/test/cover.spec [deleted file]
rabbitmq-server/deps/cowboy/test/cowboy_ct_hook.erl [deleted file]
rabbitmq-server/deps/cowboy/test/cowboy_error_h.erl [deleted file]
rabbitmq-server/deps/cowboy/test/cowboy_test.erl [deleted file]
rabbitmq-server/deps/cowboy/test/eunit_SUITE.erl [deleted file]
rabbitmq-server/deps/cowboy/test/handlers/input_crash_h.erl [deleted file]
rabbitmq-server/deps/cowboy/test/handlers/long_polling_h.erl [deleted file]
rabbitmq-server/deps/cowboy/test/handlers/loop_handler_body_h.erl [deleted file]
rabbitmq-server/deps/cowboy/test/handlers/loop_handler_timeout_h.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_body_qs.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_chunked.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_echo_body.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_errors.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_handler.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_init_shutdown.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_loop_stream_recv.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_multipart.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_multipart_stream.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_req_attr.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_set_resp.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_stream_body.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_streamed.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_empty_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_expires.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_expires_binary.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_forbidden_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_missing_callbacks.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_nodelete_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_param_all.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_patch_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_post_charset_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_postonly_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_resource_etags.erl [deleted file]
rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_simple_resource.erl [deleted file]
rabbitmq-server/deps/cowboy/test/loop_handler_SUITE.erl [deleted file]
rabbitmq-server/deps/cowboy/test/spdy_SUITE.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/client.json [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_echo.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_echo_timer.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_init_shutdown.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_send_many.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_timeout_cancel.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_timeout_hibernate.erl [deleted file]
rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_upgrade_with_opts.erl [deleted file]
rabbitmq-server/deps/cowlib/test/eunit_SUITE.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_base64url_tests.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_html_tests.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_http_tests.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_request_tests.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_socket_server_tests.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_test_util.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_test_util.hrl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_tests.erl [deleted file]
rabbitmq-server/deps/mochiweb/test/mochiweb_websocket_tests.erl [deleted file]
rabbitmq-server/deps/rabbit_common/LICENSE [deleted file]
rabbitmq-server/deps/rabbit_common/build.config [deleted file]
rabbitmq-server/deps/rabbit_common/erlang.mk [deleted file]
rabbitmq-server/deps/rabbit_common/mk/rabbitmq-tests.mk [deleted file]
rabbitmq-server/deps/rabbit_common/src/rabbit_ct_broker_helpers.erl [deleted file]
rabbitmq-server/deps/rabbit_common/src/rabbit_ct_helpers.erl [deleted file]
rabbitmq-server/deps/rabbit_common/tools/tls-certs/Makefile [deleted file]
rabbitmq-server/deps/rabbit_common/tools/tls-certs/openssl.cnf [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/dotnet-tests/project.json [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/dotnet-tests/src/testsuite.cs [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/pom.xml [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/FooterTest.java [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/MessageAnnotationsTest.java [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/RoundTripTest.java [deleted file]
rabbitmq-server/deps/rabbitmq_amqp1_0/test/unit_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_auth_backend_ldap/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_auth_backend_ldap/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/rabbit_ldap_seed.erl [deleted file]
rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/system_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/unit_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/Makefile [deleted file]
rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/test/rabbit_exchange_type_consistent_hash_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_event_exchange/Makefile [deleted file]
rabbitmq-server/deps/rabbitmq_event_exchange/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_event_exchange/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_event_exchange/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_event_exchange/test/system_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_event_exchange/test/unit_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_federation/Makefile [deleted file]
rabbitmq-server/deps/rabbitmq_federation/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_federation/test/exchange_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_federation/test/queue_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_federation/test/rabbit_federation_test_util.erl [deleted file]
rabbitmq-server/deps/rabbitmq_federation/test/unit_inbroker_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_federation_management/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_federation_management/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_jms_topic_exchange/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_jms_topic_exchange/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_jms_topic_exchange/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/rjms_topic_selector_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/rjms_topic_selector_unit_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/sjx_evaluation_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_management/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_clustering_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_rabbitmqadmin_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_runtime_parameters_util.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_db_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_unit_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_util.erl [deleted file]
rabbitmq-server/deps/rabbitmq_management_agent/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_management_agent/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_management_visualiser/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_management_visualiser/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/Makefile [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/build.properties [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/build.xml [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/java_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/lib/junit.jar [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/processor_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/rabbitmq_mqtt.app [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/reader_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/MqttTest.java [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/rabbit-test.sh [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/setup-rabbit-test.sh [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/tls/MqttSSLTest.java [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/tls/MutualAuth.java [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/src/test.config [deleted file]
rabbitmq-server/deps/rabbitmq_mqtt/test/util_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_recent_history_exchange/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_recent_history_exchange/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_recent_history_exchange/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_recent_history_exchange/test/system_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_sharding/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_sharding/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_sharding/other_plugins [deleted file]
rabbitmq-server/deps/rabbitmq_sharding/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_sharding/test/src/rabbit_hash_exchange_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_sharding/test/src/rabbit_sharding_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_shovel/Makefile [deleted file]
rabbitmq-server/deps/rabbitmq_shovel/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_shovel/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_shovel/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_shovel/test/configuration_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_shovel/test/dynamic_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_shovel_management/Makefile [deleted file]
rabbitmq-server/deps/rabbitmq_shovel_management/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_shovel_management/test/http_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/amqqueue_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/connections_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/frame_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/ack.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/base.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/connect_options.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/destinations.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/errors.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/lifecycle.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/parsing.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/queue_properties.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/redelivered.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/reliability.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/ssl_lifecycle.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_connect_options.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_runner.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_ssl.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_util.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/transactions.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/x_queue_name.py [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/src/rabbit_stomp_client.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/src/rabbit_stomp_publish_test.erl [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/src/test.config [deleted file]
rabbitmq-server/deps/rabbitmq_stomp/test/util_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_top/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_top/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_top/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_tracing/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_tracing/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_tracing/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_tracing/test/rabbit_tracing_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_trust_store/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_trust_store/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_trust_store/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_trust_store/test/system_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_dispatch/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_web_dispatch/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_web_dispatch/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_web_dispatch/test/priv/www/index.html [deleted file]
rabbitmq-server/deps/rabbitmq_web_dispatch/test/rabbit_web_dispatch_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_dispatch/test/rabbit_web_dispatch_unit_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/build.config [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/test/cowboy_websocket_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/test/raw_websocket_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/test/sockjs_websocket_SUITE.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/test/src/rabbit_ws_test_util.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/test/src/rfc6455_client.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp/test/src/stomp.erl [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp_examples/erlang.mk [deleted file]
rabbitmq-server/deps/rabbitmq_web_stomp_examples/rabbitmq-components.mk [deleted file]
rabbitmq-server/deps/ranch/ranch.d [deleted file]
rabbitmq-server/deps/ranch/test/acceptor_SUITE.erl [deleted file]
rabbitmq-server/deps/ranch/test/active_echo_protocol.erl [deleted file]
rabbitmq-server/deps/ranch/test/check_tcp_options.erl [deleted file]
rabbitmq-server/deps/ranch/test/cover.spec [deleted file]
rabbitmq-server/deps/ranch/test/crash_protocol.erl [deleted file]
rabbitmq-server/deps/ranch/test/echo_protocol.erl [deleted file]
rabbitmq-server/deps/ranch/test/notify_and_wait_protocol.erl [deleted file]
rabbitmq-server/deps/ranch/test/ranch_ct_hook.erl [deleted file]
rabbitmq-server/deps/ranch/test/remove_conn_and_wait_protocol.erl [deleted file]
rabbitmq-server/deps/ranch/test/sendfile_SUITE.erl [deleted file]
rabbitmq-server/deps/ranch/test/shutdown_SUITE.erl [deleted file]
rabbitmq-server/deps/ranch/test/supervisor_separate.erl [deleted file]
rabbitmq-server/deps/ranch/test/trap_exit_protocol.erl [deleted file]
rabbitmq-server/deps/webmachine/test/etag_test.erl [deleted file]
rabbitmq-server/erlang.mk [deleted file]
rabbitmq-server/git-revisions.txt [deleted file]
rabbitmq-server/rabbitmq-components.mk [deleted file]
rabbitmq-server/src/pg2_fixed.erl [deleted file]
rabbitmq-server/test/channel_operation_timeout_SUITE.erl [deleted file]
rabbitmq-server/test/channel_operation_timeout_test_queue.erl [deleted file]
rabbitmq-server/test/cluster_rename_SUITE.erl [deleted file]
rabbitmq-server/test/clustering_management_SUITE.erl [deleted file]
rabbitmq-server/test/crashing_queues_SUITE.erl [deleted file]
rabbitmq-server/test/dummy_event_receiver.erl [deleted file]
rabbitmq-server/test/dummy_runtime_parameters.erl [deleted file]
rabbitmq-server/test/dummy_supervisor2.erl [deleted file]
rabbitmq-server/test/dynamic_ha_SUITE.erl [deleted file]
rabbitmq-server/test/eager_sync_SUITE.erl [deleted file]
rabbitmq-server/test/gm_SUITE.erl [deleted file]
rabbitmq-server/test/health_check_SUITE.erl [deleted file]
rabbitmq-server/test/inet_proxy_dist.erl [deleted file]
rabbitmq-server/test/inet_tcp_proxy.erl [deleted file]
rabbitmq-server/test/inet_tcp_proxy_manager.erl [deleted file]
rabbitmq-server/test/lazy_queue_SUITE.erl [deleted file]
rabbitmq-server/test/many_node_ha_SUITE.erl [deleted file]
rabbitmq-server/test/mirrored_supervisor_SUITE.erl [deleted file]
rabbitmq-server/test/mirrored_supervisor_SUITE_gs.erl [deleted file]
rabbitmq-server/test/msg_store_SUITE.erl [deleted file]
rabbitmq-server/test/partitions_SUITE.erl [deleted file]
rabbitmq-server/test/priority_queue_SUITE.erl [deleted file]
rabbitmq-server/test/priority_queue_recovery_SUITE.erl [deleted file]
rabbitmq-server/test/queue_master_location_SUITE.erl [deleted file]
rabbitmq-server/test/rabbit_ha_test_consumer.erl [deleted file]
rabbitmq-server/test/rabbit_ha_test_producer.erl [deleted file]
rabbitmq-server/test/simple_ha_SUITE.erl [deleted file]
rabbitmq-server/test/sup_delayed_restart_SUITE.erl [deleted file]
rabbitmq-server/test/sync_detection_SUITE.erl [deleted file]
rabbitmq-server/test/temp/head_message_timestamp_tests.py [deleted file]
rabbitmq-server/test/temp/rabbitmqadmin.py [deleted file]
rabbitmq-server/test/unit_SUITE.erl [deleted file]
rabbitmq-server/test/unit_inbroker_SUITE.erl [deleted file]
scripts/rabbitmq-script-wrapper [moved from rabbitmq-server/scripts/rabbitmq-script-wrapper with 100% similarity]
scripts/rabbitmq-server-ha.ocf [moved from rabbitmq-server/scripts/rabbitmq-server-ha.ocf with 84% similarity]
scripts/rabbitmq-server.ocf [moved from rabbitmq-server/scripts/rabbitmq-server.ocf with 100% similarity]
scripts/travis_test_ocf_ra.sh [moved from rabbitmq-server/scripts/travis_test_ocf_ra.sh with 100% similarity]
tests/runtests.sh [deleted file]
upgrade/Makefile [new file with mode: 0644]
upgrade/README.md [new file with mode: 0644]
upgrade/config/enabled_plugins [new file with mode: 0644]
upgrade/config/rabbitmq.config [new file with mode: 0644]
upgrade/scripts/upgrade-from-3.5-helpers.sh [new file with mode: 0644]
upgrade/scripts/upgrade-from.sh [new file with mode: 0755]
upgrade/scripts/upgrade-helpers.sh [new file with mode: 0644]
upgrade/scripts/upgrade-to-3.6-helpers.sh [new file with mode: 0644]
upgrade/scripts/upgrade-to-3.7-helpers.sh [new file with mode: 0644]
upgrade/scripts/upgrade-to.sh [new file with mode: 0755]

similarity index 100%
rename from rabbitmq-server/LICENSE
rename to LICENSE
diff --git a/LICENSE-MIT-Erlware-Commons b/LICENSE-MIT-Erlware-Commons
new file mode 100644 (file)
index 0000000..fc89c02
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2011 Erlware, LLC
+
+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.
+
similarity index 100%
rename from rabbitmq-server/LICENSE-MPL2
rename to LICENSE-MPL2
similarity index 59%
rename from rabbitmq-server/Makefile
rename to Makefile
index e211234bf6af9b8831826a749e9d5297ab7ff0df..5558f48fd71a510c2b57bdcb8476878477135310 100644 (file)
+++ b/Makefile
@@ -1,28 +1,37 @@
-PROJECT = rabbit
-VERSION ?= $(call get_app_version,src/$(PROJECT).app.src)
+PROJECT = rabbitmq_server_release
+VERSION ?= 0.0.0
 
 # Release artifacts are put in $(PACKAGES_DIR).
 PACKAGES_DIR ?= $(abspath PACKAGES)
 
-DEPS = ranch $(PLUGINS)
+DEPS = rabbit_common rabbit $(PLUGINS)
 
-define usage_xml_to_erl
-$(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, src/rabbit_%_usage.erl, $(subst -,_,$(1))))
-endef
-
-DOCS_DIR     = docs
-MANPAGES     = $(patsubst %.xml, %, $(wildcard $(DOCS_DIR)/*.[0-9].xml))
-WEB_MANPAGES = $(patsubst %.xml, %.man.xml, $(wildcard $(DOCS_DIR)/*.[0-9].xml) $(DOCS_DIR)/rabbitmq-service.xml $(DOCS_DIR)/rabbitmq-echopid.xml)
-USAGES_XML   = $(DOCS_DIR)/rabbitmqctl.1.xml $(DOCS_DIR)/rabbitmq-plugins.1.xml
-USAGES_ERL   = $(foreach XML, $(USAGES_XML), $(call usage_xml_to_erl, $(XML)))
-
-EXTRA_SOURCES += $(USAGES_ERL)
-
-.DEFAULT_GOAL = all
-$(PROJECT).d:: $(EXTRA_SOURCES)
-
-DEP_PLUGINS = rabbit_common/mk/rabbitmq-build.mk \
-             rabbit_common/mk/rabbitmq-run.mk \
+# List of plugins to include in a RabbitMQ release.
+PLUGINS := rabbitmq_amqp1_0 \
+          rabbitmq_auth_backend_ldap \
+          rabbitmq_auth_mechanism_ssl \
+          rabbitmq_consistent_hash_exchange \
+          rabbitmq_event_exchange \
+          rabbitmq_federation \
+          rabbitmq_federation_management \
+          rabbitmq_jms_topic_exchange \
+          rabbitmq_management \
+          rabbitmq_management_agent \
+          rabbitmq_management_visualiser \
+          rabbitmq_mqtt \
+          rabbitmq_recent_history_exchange \
+          rabbitmq_sharding \
+          rabbitmq_shovel \
+          rabbitmq_shovel_management \
+          rabbitmq_stomp \
+          rabbitmq_top \
+          rabbitmq_tracing \
+          rabbitmq_trust_store \
+          rabbitmq_web_dispatch \
+          rabbitmq_web_stomp \
+          rabbitmq_web_stomp_examples
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-run.mk \
              rabbit_common/mk/rabbitmq-dist.mk \
              rabbit_common/mk/rabbitmq-tools.mk
 
@@ -33,130 +42,8 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-
-# List of plugins to include in a RabbitMQ release.
-DISTRIBUTED_DEPS := rabbitmq_amqp1_0 \
-                   rabbitmq_auth_backend_ldap \
-                   rabbitmq_auth_mechanism_ssl \
-                   rabbitmq_consistent_hash_exchange \
-                   rabbitmq_event_exchange \
-                   rabbitmq_federation \
-                   rabbitmq_federation_management \
-                   rabbitmq_jms_topic_exchange \
-                   rabbitmq_management \
-                   rabbitmq_management_agent \
-                   rabbitmq_management_visualiser \
-                   rabbitmq_mqtt \
-                   rabbitmq_recent_history_exchange \
-                   rabbitmq_sharding \
-                   rabbitmq_shovel \
-                   rabbitmq_shovel_management \
-                   rabbitmq_stomp \
-                   rabbitmq_top \
-                   rabbitmq_tracing \
-                   rabbitmq_trust_store \
-                   rabbitmq_web_dispatch \
-                   rabbitmq_web_stomp \
-                   rabbitmq_web_stomp_examples
-
-ifneq ($(IS_DEP),1)
-ifneq ($(filter source-dist packages package-%,$(MAKECMDGOALS)),)
-DEPS += $(DISTRIBUTED_DEPS)
-endif
-ifneq ($(wildcard git-revisions.txt),)
-DEPS += $(DISTRIBUTED_DEPS)
-endif
-endif
-
-# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now.
-TEST_DEPS := amqp_client meck $(filter-out rabbitmq_test,$(TEST_DEPS))
-
 include erlang.mk
 
-# --------------------------------------------------------------------
-# Compilation.
-# --------------------------------------------------------------------
-
-RMQ_ERLC_OPTS += -I $(DEPS_DIR)/rabbit_common/include
-
-ifdef INSTRUMENT_FOR_QC
-RMQ_ERLC_OPTS += -DINSTR_MOD=gm_qc
-else
-RMQ_ERLC_OPTS += -DINSTR_MOD=gm
-endif
-
-ifdef CREDIT_FLOW_TRACING
-RMQ_ERLC_OPTS += -DCREDIT_FLOW_TRACING=true
-endif
-
-ifndef USE_PROPER_QC
-# PropEr needs to be installed for property checking
-# http://proper.softlab.ntua.gr/
-USE_PROPER_QC := $(shell $(ERL) -eval 'io:format({module, proper} =:= code:ensure_loaded(proper)), halt().')
-RMQ_ERLC_OPTS += $(if $(filter true,$(USE_PROPER_QC)),-Duse_proper_qc)
-endif
-
-clean:: clean-extra-sources
-
-clean-extra-sources:
-       $(gen_verbose) rm -f $(EXTRA_SOURCES)
-
-# --------------------------------------------------------------------
-# Documentation.
-# --------------------------------------------------------------------
-
-# xmlto can not read from standard input, so we mess with a tmp file.
-%: %.xml $(DOCS_DIR)/examples-to-end.xsl
-       $(gen_verbose) xmlto --version | \
-           grep -E '^xmlto version 0\.0\.([0-9]|1[1-8])$$' >/dev/null || \
-           opt='--stringparam man.indent.verbatims=0' ; \
-       xsltproc --novalid $(DOCS_DIR)/examples-to-end.xsl $< > $<.tmp && \
-       xmlto -vv -o $(DOCS_DIR) $$opt man $< 2>&1 | (grep -v '^Note: Writing' || :) && \
-       test -f $@ && \
-       rm $<.tmp
-
-# Use tmp files rather than a pipeline so that we get meaningful errors
-# Do not fold the cp into previous line, it's there to stop the file being
-# generated but empty if we fail
-define usage_dep
-$(call usage_xml_to_erl, $(1)):: $(1) $(DOCS_DIR)/usage.xsl
-       $$(gen_verbose) xsltproc --novalid --stringparam modulename "`basename $$@ .erl`" \
-           $(DOCS_DIR)/usage.xsl $$< > $$@.tmp && \
-       sed -e 's/"/\\"/g' -e 's/%QUOTE%/"/g' $$@.tmp > $$@.tmp2 && \
-       fold -s $$@.tmp2 > $$@.tmp3 && \
-       mv $$@.tmp3 $$@ && \
-       rm $$@.tmp $$@.tmp2
-endef
-
-$(foreach XML,$(USAGES_XML),$(eval $(call usage_dep, $(XML))))
-
-# We rename the file before xmlto sees it since xmlto will use the name of
-# the file to make internal links.
-%.man.xml: %.xml $(DOCS_DIR)/html-to-website-xml.xsl
-       $(gen_verbose) cp $< `basename $< .xml`.xml && \
-           xmlto xhtml-nochunks `basename $< .xml`.xml ; \
-       rm `basename $< .xml`.xml && \
-       cat `basename $< .xml`.html | \
-           xsltproc --novalid $(DOCS_DIR)/remove-namespaces.xsl - | \
-             xsltproc --novalid --stringparam original `basename $<` $(DOCS_DIR)/html-to-website-xml.xsl - | \
-             xmllint --format - > $@ && \
-       rm `basename $< .xml`.html
-
-.PHONY: manpages web-manpages distclean-manpages
-
-docs:: manpages web-manpages
-
-manpages: $(MANPAGES)
-       @:
-
-web-manpages: $(WEB_MANPAGES)
-       @:
-
-distclean:: distclean-manpages
-
-distclean-manpages::
-       $(gen_verbose) rm -f $(MANPAGES) $(WEB_MANPAGES)
-
 # --------------------------------------------------------------------
 # Distribution.
 # --------------------------------------------------------------------
@@ -184,6 +71,7 @@ RSYNC_V = $(RSYNC_V_$(V))
 RSYNC_FLAGS += -a $(RSYNC_V)           \
               --exclude '.sw?' --exclude '.*.sw?'      \
               --exclude '*.beam'                       \
+              --exclude '*.d'                          \
               --exclude '*.pyc'                        \
               --exclude '.git*'                        \
               --exclude '.hg*'                         \
@@ -196,9 +84,13 @@ RSYNC_FLAGS += -a $(RSYNC_V)                \
               --exclude 'MnesiaCore.*'                 \
               --exclude 'cover/'                       \
               --exclude 'deps/'                        \
+              --exclude 'ebin/'                        \
               --exclude '$(notdir $(DEPS_DIR))/'       \
+              --exclude 'logs/'                        \
               --exclude 'plugins/'                     \
               --exclude '$(notdir $(DIST_DIR))/'       \
+              --exclude 'test'                         \
+              --exclude 'xrefr'                        \
               --exclude '/$(notdir $(PACKAGES_DIR))/'  \
               --exclude '/PACKAGES/'                   \
               --exclude '/cowboy/doc/'                 \
@@ -227,17 +119,15 @@ ZIP_V_2 =
 ZIP_V = $(ZIP_V_$(V))
 
 .PHONY: $(SOURCE_DIST)
+.PHONY: clean-source-dist distclean-packages clean-unpacked-source-dist
 
 $(SOURCE_DIST): $(ERLANG_MK_RECURSIVE_DEPS_LIST)
        $(verbose) mkdir -p $(dir $@)
        $(gen_verbose) $(RSYNC) $(RSYNC_FLAGS) ./ $@/
-       $(verbose) sed -E -i.bak \
-               -e 's/[{]vsn[[:blank:]]*,[^}]+}/{vsn, "$(VERSION)"}/' \
-               $@/src/$(PROJECT).app.src && \
-               rm $@/src/$(PROJECT).app.src.bak
+       $(verbose) echo "$(PROJECT) $$(git rev-parse HEAD) $$(git describe --tags --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)" > $@/git-revisions.txt
        $(verbose) cat packaging/common/LICENSE.head > $@/LICENSE
        $(verbose) mkdir -p $@/deps/licensing
-       $(verbose) for dep in $$(cat $(ERLANG_MK_RECURSIVE_DEPS_LIST) | grep -v '/$(PROJECT)$$' | LC_COLLATE=C sort); do \
+       $(verbose) for dep in $$(cat $(ERLANG_MK_RECURSIVE_DEPS_LIST) | LC_COLLATE=C sort); do \
                $(RSYNC) $(RSYNC_FLAGS) \
                 $$dep \
                 $@/deps; \
@@ -254,17 +144,14 @@ $(SOURCE_DIST): $(ERLANG_MK_RECURSIVE_DEPS_LIST)
                        cat "$$dep/license_info" >> $@/LICENSE; \
                fi; \
                find "$$dep" -maxdepth 1 -name 'LICENSE-*' -exec cp '{}' $@/deps/licensing \; ; \
+               (cd $$dep; echo "$$(basename "$$dep") $$(git rev-parse HEAD) $$(git describe --tags --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)") >> $@/git-revisions.txt; \
        done
        $(verbose) cat packaging/common/LICENSE.tail >> $@/LICENSE
        $(verbose) find $@/deps/licensing -name 'LICENSE-*' -exec cp '{}' $@ \;
        $(verbose) for file in $$(find $@ -name '*.app.src'); do \
-               sed -E -i.bak -e 's/[{]vsn[[:blank:]]*,[[:blank:]]*""[[:blank:]]*}/{vsn, "$(VERSION)"}/' $$file; \
+               sed -E -i.bak -e 's/[{]vsn[[:blank:]]*,[[:blank:]]*(""|"0.0.0")[[:blank:]]*}/{vsn, "$(VERSION)"}/' $$file; \
                rm $$file.bak; \
        done
-       $(verbose) echo "$(PROJECT) $$(git rev-parse HEAD) $$(git describe --tags --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)" > $@/git-revisions.txt
-       $(verbose) for dep in $$(cat $(ERLANG_MK_RECURSIVE_DEPS_LIST)); do \
-               (cd $$dep; echo "$$(basename "$$dep") $$(git rev-parse HEAD) $$(git describe --tags --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)") >> $@/git-revisions.txt; \
-       done
 
 # TODO: Fix file timestamps to have reproducible source archives.
 # $(verbose) find $@ -not -name 'git-revisions.txt' -print0 | xargs -0 touch -r $@/git-revisions.txt
@@ -293,17 +180,60 @@ $(SOURCE_DIST).zip: $(SOURCE_DIST)
                find $(notdir $(SOURCE_DIST)) -print0 | LC_COLLATE=C sort -z | \
                xargs -0 $(ZIP) $(ZIP_V) $@
 
-clean:: clean-source-dist
+clean:: clean-source-dist clean-upgrade
+
+clean-upgrade:
+       cd upgrade && make clean
 
 clean-source-dist:
        $(gen_verbose) rm -rf -- $(SOURCE_DIST_BASE)-*
 
+distclean:: distclean-packages distclean-upgrade
+
+distclean-upgrade:
+       cd upgrade && make distclean
+
+distclean-packages:
+       $(gen_verbose) rm -rf -- $(PACKAGES_DIR)
+
+clean-unpacked-source-dist:
+       for d in deps/*; do \
+               if test -f $$d/Makefile; then \
+                       make -C $$d clean || exit $$?; \
+               fi; \
+       done
+
+# --------------------------------------------------------------------
+# Packaging.
+# --------------------------------------------------------------------
+
+.PHONY: packages package-deb \
+       package-rpm package-rpm-fedora package-rpm-suse \
+       package-windows package-standalone-macosx \
+       package-generic-unix
+
+# This variable is exported so sub-make instances know where to find the
+# archive.
+PACKAGES_SOURCE_DIST_FILE ?= $(firstword $(SOURCE_DIST_FILES))
+
+packages package-deb package-rpm package-rpm-fedora \
+package-rpm-suse package-windows package-standalone-macosx \
+package-generic-unix: $(PACKAGES_SOURCE_DIST_FILE)
+       $(verbose) $(MAKE) -C packaging $@ \
+               SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE))
+
 # --------------------------------------------------------------------
 # Installation.
 # --------------------------------------------------------------------
 
-.PHONY: install install-erlapp install-scripts install-bin install-man
-.PHONY: install-windows install-windows-erlapp install-windows-scripts install-windows-docs
+.PHONY: manpages web-manpages distclean-manpages
+
+manpages web-manpages distclean-manpages:
+       $(MAKE) -C $(DEPS_DIR)/rabbit $@ DEPS_DIR=$(DEPS_DIR)
+
+.PHONY: install install-erlapp install-scripts install-bin install-man \
+       install-windows install-windows-erlapp install-windows-scripts \
+       install-windows-docs
 
 DESTDIR ?=
 
@@ -339,19 +269,30 @@ install: install-erlapp install-scripts
 
 install-erlapp: dist
        $(verbose) mkdir -p $(DESTDIR)$(RMQ_ERLAPP_DIR)
-       $(inst_verbose) cp -r include ebin plugins LICENSE* INSTALL \
+       $(inst_verbose) cp -r \
+               LICENSE* \
+               $(DEPS_DIR)/rabbit/ebin \
+               $(DEPS_DIR)/rabbit/INSTALL \
+               $(DIST_DIR) \
                $(DESTDIR)$(RMQ_ERLAPP_DIR)
        $(verbose) echo "Put your EZs here and use rabbitmq-plugins to enable them." \
-               > $(DESTDIR)$(RMQ_ERLAPP_DIR)/plugins/README
+               > $(DESTDIR)$(RMQ_ERLAPP_DIR)/$(notdir $(DIST_DIR))/README
 
+       @# FIXME: Why do we copy headers?
+       $(verbose) cp -r \
+               $(DEPS_DIR)/rabbit/include \
+               $(DESTDIR)$(RMQ_ERLAPP_DIR)
        @# rabbitmq-common provides headers too: copy them to
        @# rabbitmq_server/include.
-       $(verbose) cp -r $(DEPS_DIR)/rabbit_common/include $(DESTDIR)$(RMQ_ERLAPP_DIR)
+       $(verbose) cp -r \
+               $(DEPS_DIR)/rabbit_common/include \
+               $(DESTDIR)$(RMQ_ERLAPP_DIR)
 
 install-scripts:
        $(verbose) mkdir -p $(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin
        $(inst_verbose) for script in $(SCRIPTS); do \
-               cp "scripts/$$script" "$(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin"; \
+               cp "$(DEPS_DIR)/rabbit/scripts/$$script" \
+                       "$(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin"; \
                chmod 0755 "$(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin/$$script"; \
        done
 
@@ -366,11 +307,11 @@ install-bin: install-scripts
        done
 
 install-man: manpages
-       $(inst_verbose) sections=$$(ls -1 docs/*.[1-9] \
+       $(inst_verbose) sections=$$(ls -1 $(DEPS_DIR)/rabbit/docs/*.[1-9] \
                | sed -E 's/.*\.([1-9])$$/\1/' | uniq | sort); \
        for section in $$sections; do \
                mkdir -p $(DESTDIR)$(MANDIR)/man$$section; \
-               for manpage in $(DOCS_DIR)/*.$$section; do \
+               for manpage in $(DEPS_DIR)/rabbit/docs/*.$$section; do \
                        gzip < $$manpage \
                         > $(DESTDIR)$(MANDIR)/man$$section/$$(basename $$manpage).gz; \
                done; \
@@ -380,32 +321,48 @@ install-windows: install-windows-erlapp install-windows-scripts install-windows-
 
 install-windows-erlapp: dist
        $(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)
-       $(inst_verbose) cp -r include ebin plugins LICENSE* INSTALL \
+       $(inst_verbose) cp -r \
+               LICENSE* \
+               $(DEPS_DIR)/rabbit/ebin \
+               $(DEPS_DIR)/rabbit/INSTALL \
+               $(DIST_DIR) \
                $(DESTDIR)$(WINDOWS_PREFIX)
        $(verbose) echo "Put your EZs here and use rabbitmq-plugins.bat to enable them." \
-               > $(DESTDIR)$(WINDOWS_PREFIX)/plugins/README.txt
+               > $(DESTDIR)$(WINDOWS_PREFIX)/$(notdir $(DIST_DIR))/README.txt
        $(verbose) $(UNIX_TO_DOS) $(DESTDIR)$(WINDOWS_PREFIX)/plugins/README.txt
 
-# rabbitmq-common provides headers too: copy them to
-# rabbitmq_server/include.
-       $(verbose) cp -r $(DEPS_DIR)/rabbit_common/include $(DESTDIR)$(WINDOWS_PREFIX)
+       @# FIXME: Why do we copy headers?
+       $(verbose) cp -r \
+               $(DEPS_DIR)/rabbit/include \
+               $(DESTDIR)$(WINDOWS_PREFIX)
+       @# rabbitmq-common provides headers too: copy them to
+       @# rabbitmq_server/include.
+       $(verbose) cp -r \
+               $(DEPS_DIR)/rabbit_common/include \
+               $(DESTDIR)$(WINDOWS_PREFIX)
 
 install-windows-scripts:
        $(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)/sbin
        $(inst_verbose) for script in $(WINDOWS_SCRIPTS); do \
-               cp "scripts/$$script" "$(DESTDIR)$(WINDOWS_PREFIX)/sbin"; \
+               cp "$(DEPS_DIR)/rabbit/scripts/$$script" \
+                       "$(DESTDIR)$(WINDOWS_PREFIX)/sbin"; \
                chmod 0755 "$(DESTDIR)$(WINDOWS_PREFIX)/sbin/$$script"; \
        done
 
 install-windows-docs: install-windows-erlapp
        $(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)/etc
-       $(inst_verbose) xmlto -o . xhtml-nochunks docs/rabbitmq-service.xml
-       $(verbose) elinks -dump -no-references -no-numbering rabbitmq-service.html \
+       $(inst_verbose) xmlto -o . xhtml-nochunks \
+               $(DEPS_DIR)/rabbit/docs/rabbitmq-service.xml
+       $(verbose) elinks -dump -no-references -no-numbering \
+               rabbitmq-service.html \
                > $(DESTDIR)$(WINDOWS_PREFIX)/readme-service.txt
        $(verbose) rm rabbitmq-service.html
-       $(verbose) cp docs/rabbitmq.config.example $(DESTDIR)$(WINDOWS_PREFIX)/etc
-       $(verbose) for file in $(DESTDIR)$(WINDOWS_PREFIX)/readme-service.txt \
-        $(DESTDIR)$(WINDOWS_PREFIX)/LICENSE* $(DESTDIR)$(WINDOWS_PREFIX)/INSTALL \
+       $(verbose) cp $(DEPS_DIR)/rabbit/docs/rabbitmq.config.example \
+               $(DESTDIR)$(WINDOWS_PREFIX)/etc
+       $(verbose) for file in \
+        $(DESTDIR)$(WINDOWS_PREFIX)/readme-service.txt \
+        $(DESTDIR)$(WINDOWS_PREFIX)/LICENSE* \
+        $(DESTDIR)$(WINDOWS_PREFIX)/INSTALL \
         $(DESTDIR)$(WINDOWS_PREFIX)/etc/rabbitmq.config.example; do \
                $(UNIX_TO_DOS) "$$file"; \
                case "$$file" in \
@@ -415,21 +372,5 @@ install-windows-docs: install-windows-erlapp
                esac; \
        done
 
-# --------------------------------------------------------------------
-# Packaging.
-# --------------------------------------------------------------------
-
-.PHONY: packages package-deb \
-       package-rpm package-rpm-fedora package-rpm-suse \
-       package-windows package-standalone-macosx \
-       package-generic-unix
-
-# This variable is exported so sub-make instances know where to find the
-# archive.
-PACKAGES_SOURCE_DIST_FILE ?= $(firstword $(SOURCE_DIST_FILES))
-
-packages package-deb package-rpm package-rpm-fedora \
-package-rpm-suse package-windows package-standalone-macosx \
-package-generic-unix: $(PACKAGES_SOURCE_DIST_FILE)
-       $(verbose) $(MAKE) -C packaging $@ \
-               SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE))
+test-upgrade:
+       $(MAKE) -C upgrade
index a97770229426d99a99575c7e9884c69262b68e8d..9afbc7c0dc6f0e13f7b36beb532976c7308298ca 100644 (file)
-rabbitmq-server (3.6.5-1~u14.04+mos1) mos9.0; urgency=medium
+rabbitmq-server (3.6.6-1) unstable; urgency=low
 
-  * New upstream release.
+  * New Upstream Release
+
+ -- Michael Klishin <michael@rabbitmq.com>  Mon, 21 Nov 2016 10:36:28 +0000
+
+rabbitmq-server (3.6.5-1) unstable; urgency=low
+
+  * New Upstream Release
+
+ -- Michael Klishin <michael@rabbitmq.com>  Fri, 05 Aug 2016 14:20:47 +0100
+
+rabbitmq-server (3.6.4-1) unstable; urgency=low
+
+  * New Upstream Release
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Thu, 11 Aug 2016 13:45:00 +0300
+ -- Michael Klishin <michael@rabbitmq.com>  Fri, 29 Jul 2016 11:40:53 +0100
 
-rabbitmq-server (3.6.1-1~u14.04+mos3) mos9.0; urgency=medium
+rabbitmq-server (3.6.3-1) unstable; urgency=low
 
-  * Autodetect erlang async thread pool size.
+  * New Upstream Release
 
- -- Alexey Lebedeff <binarin@binarin.ru>  Mon, 04 Apr 2016 17:50:00 +0300
+ -- Michael Klishin <michael@rabbitmq.com>  Wed, 06 Jul 2016 19:19:21 +0100
 
-rabbitmq-server (3.6.1-1~u14.04+mos2) mos8.0; urgency=medium
+rabbitmq-server (3.6.2-1) unstable; urgency=low
 
-  * Use HiPE compilation.
+  * New Upstream Release
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Mon, 29 Feb 2016 14:00:50 +0300
+ -- Michael Klishin <michael@rabbitmq.com>  Thu, 19 May 2016 09:20:06 +0100
 
-rabbitmq-server (3.6.1-1~u14.04+mos1) mos8.0; urgency=medium
+rabbitmq-server (3.6.1-1) unstable; urgency=low
 
-  * New upstream release.
+  * New Upstream Release
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Tue, 16 Feb 2016 13:27:12 +0300
+ -- Michael Klishin <michael@rabbitmq.com>  Tue, 01 Mar 2016 13:19:57 +0000
 
-rabbitmq-server (3.5.6-1~u14.04+mos4) mos8.0; urgency=medium
+rabbitmq-server (3.6.0-1) unstable; urgency=low
 
-  * Backport https://github.com/rabbitmq/rabbitmq-common/pull/26
+  * New Upstream Release
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Thu, 24 Dec 2015 14:28:56 +0300
+ -- Michael Klishin <michael@rabbitmq.com>  Tue, 22 Dec 2015 13:21:56 +0000
 
-rabbitmq-server (3.5.6-1~u14.04+mos3) mos8.0; urgency=medium
+rabbitmq-server (3.5.7-1) unstable; urgency=low
 
-  * Backport https://github.com/rabbitmq/rabbitmq-management/pull/84
+  * New Upstream Release
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Fri, 11 Dec 2015 14:31:08 +0300
+ -- Michael Klishin <michael@rabbitmq.com>  Tue, 15 Dec 2015 10:10:46 +0000
 
-rabbitmq-server (3.5.6-1~u14.04+mos2) mos8.0; urgency=medium
+rabbitmq-server (3.5.6-1) unstable; urgency=low
 
-  * Backport https://github.com/rabbitmq/rabbitmq-common/pull/18
+  * New Upstream Release
+
+ -- Michael Klishin <michael@rabbitmq.com>  Wed, 07 Oct 2015 13:31:24 +0100
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Thu, 10 Dec 2015 14:54:05 +0300
+rabbitmq-server (3.5.5-3) unstable; urgency=low
 
-rabbitmq-server (3.5.6-1~u14.04+mos1) mos8.0; urgency=medium
+  * Fix bashism in rabbitmq-script-wrapper
 
-  * New upstream release.
-  * Disable auto-start on package install.
-  * Increase ulimit on number of file descriptors.
+ -- Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>  Thu, 24 Sep 2015 19:18:17 +0100
 
- -- Alexey Lebedeff <alebedev@mirantis.com>  Fri, 16 Oct 2015 13:59:11 +0300
+rabbitmq-server (3.5.5-1) unstable; urgency=low
 
-rabbitmq-server (3.5.4-1) unstable; urgency=medium
+  * New Upstream Release
 
-  * New upstream release.
+ -- Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>  Thu, 24 Sep 2015 10:57:25 +0100
 
- -- James Page <james.page@ubuntu.com>  Tue, 04 Aug 2015 14:52:31 +0200
+rabbitmq-server (3.5.4-1) unstable; urgency=low
 
-rabbitmq-server (3.5.1-2) unstable; urgency=medium
+  * New Upstream Release
 
-  [ Tony Breeds ]
-  * systemd: Ensure that rabbitmq has started before marking service as
-    running (LP: #1449056).
+ -- Michael Klishin <michael@rabbitmq.com>  Tue, 21 Jul 2015 20:25:48 +0100
 
-  [ James Page ]
-  * systemd: Drop use of /etc/default/rabbitmq-server.
+rabbitmq-server (3.5.3-1) unstable; urgency=low
 
- -- James Page <james.page@ubuntu.com>  Tue, 02 Jun 2015 11:40:59 +0100
+  * New Upstream Release
 
-rabbitmq-server (3.5.1-1) unstable; urgency=medium
+ -- Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>  Fri, 22 May 2015 11:04:17 +0100
 
-  * New upstream release.
+rabbitmq-server (3.5.2-1) unstable; urgency=low
 
- -- James Page <james.page@ubuntu.com>  Wed, 13 May 2015 21:35:52 +0100
+  * New Upstream Release
 
-rabbitmq-server (3.4.3-2) unstable; urgency=medium
+ -- Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>  Tue, 12 May 2015 16:21:44 +0100
 
-  * Restore missing changes from 3.4.2-4.
+rabbitmq-server (3.5.1-1) unstable; urgency=low
 
- -- James Page <james.page@ubuntu.com>  Mon, 02 Feb 2015 07:44:33 +0200
+  * New Upstream Release
 
-rabbitmq-server (3.4.3-1) unstable; urgency=medium
+ -- Michael Klishin <michael@rabbitmq.com>  Thu, 02 Apr 2015 10:17:30 +0100
 
-  * New upstream point release.
+rabbitmq-server (3.5.0-1) unstable; urgency=low
 
- -- James Page <james.page@ubuntu.com>  Wed, 28 Jan 2015 16:12:32 +0000
+  * New Upstream Release
 
-rabbitmq-server (3.4.2-4) unstable; urgency=medium
+ -- Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>  Wed, 11 Mar 2015 13:56:19 +0000
 
-  * Re-added /usr/lib/erlang/lib /var/lib/rabbitmq/mnesia and
-    /var/log/rabbitmq which I removed form the package by mistake on the last
-    upload.
+rabbitmq-server (3.4.4-1) unstable; urgency=low
 
- -- Thomas Goirand <zigo@debian.org>  Wed, 28 Jan 2015 13:11:02 +0000
+  * New Upstream Release
 
-rabbitmq-server (3.4.2-3) unstable; urgency=medium
+ -- Michael Klishin <michael@rabbitmq.com>  Wed, 11 Feb 2015 12:05:01 +0000
 
-  * Removes debian/README which is useless (Closes: #703021).
-  * Provides a default /etc/rabbitmq/rabbitmq-env.conf (Closes: #543638).
+rabbitmq-server (3.4.3-1) unstable; urgency=low
 
- -- Thomas Goirand <zigo@debian.org>  Tue, 27 Jan 2015 15:08:08 +0100
+  * New Upstream Release
 
-rabbitmq-server (3.4.2-2) unstable; urgency=medium
+ -- Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>  Tue, 06 Jan 2015 15:58:45 +0000
 
-  * d/rabbitmq-server.dirs: Restore missing /etc/rabbitmq directory
-    (LP: #1410155).
+rabbitmq-server (3.4.2-1) unstable; urgency=low
 
- -- James Page <james.page@ubuntu.com>  Tue, 13 Jan 2015 09:53:47 +0000
+  * New Upstream Release
 
-rabbitmq-server (3.4.2-1) unstable; urgency=medium
+ -- Simon MacMullen <simon@rabbitmq.com>  Wed, 26 Nov 2014 12:11:12 +0000
 
-  [ James Page ]
-  * New upstream point release.
-  * d/control: Update for new maintainer information, add VCS repository
-    locations.
-  * d/source/format: Switch packaging to source format 3.0 (quilt).
-  * d/compat,control: Bump debhelper compat level to 9.
-  * d/*: wrap-and-sort.
-  * d/*: Move to standard debhelper, drop use of cdbs.
-  * d/rules,control,rabbitmq-server.service: Add systemd service
-    configuration.
-  * d/control: Bumped Standards-Version 3.9.6, no changes.
+rabbitmq-server (3.4.1-1) unstable; urgency=low
 
-  [ Thomas Goirand ]
-  * d/copyright: Rewrote as format 1.0.
+  * New Upstream Release
 
- -- James Page <james.page@ubuntu.com>  Fri, 19 Dec 2014 11:09:20 +0000
+ -- Simon MacMullen <simon@rabbitmq.com>  Wed, 29 Oct 2014 13:31:10 +0000
 
-rabbitmq-server (3.4.1-1) unstable; urgency=high
+rabbitmq-server (3.4.0-1) unstable; urgency=low
 
-  * New upstream release.
+  * New Upstream Release
 
- -- Blair Hester <bhester@gopivotal.com>  Tue, 04 Nov 2014 07:33:44 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Tue, 21 Oct 2014 14:21:36 +0100
 
 rabbitmq-server (3.3.5-1) unstable; urgency=low
 
-  * New upstream release:
-    - Provides unminimized versions of all bundled Javascript
-      libraries (Closes: #736781).
-  * d/control: Added Blair Hester to Uploaders, dropped Emile Joubert 
-    (thanks for all your work Emile!).
+  * New Upstream Release
+  * Changed Uploaders from Emile Joubert to Blair Hester
 
- -- Blair Hester <bhester@gopivotal.com>  Tue, 12 Aug 2014 11:47:14 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Mon, 11 Aug 2014 12:23:31 +0100
 
 rabbitmq-server (3.3.4-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 24 Jun 2014 18:00:48 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Tue, 24 Jun 2014 12:50:29 +0100
 
 rabbitmq-server (3.3.3-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 17 Jun 2014 16:59:14 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Mon, 16 Jun 2014 13:00:00 +0100
 
-rabbitmq-server (3.3.1-1) unstable; urgency=low
+rabbitmq-server (3.3.2-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 29 Apr 2014 21:05:49 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Mon, 09 Jun 2014 10:25:22 +0100
 
-rabbitmq-server (3.3.0-1) unstable; urgency=low
+rabbitmq-server (3.3.1-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Wed, 02 Apr 2014 16:23:08 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Tue, 29 Apr 2014 11:49:23 +0100
 
-rabbitmq-server (3.2.4-1.1) unstable; urgency=high
+rabbitmq-server (3.3.0-1) unstable; urgency=low
 
-  * Non-maintainer upload.
-  * Bind on 127.0.0.1 by default, to avoid listening on all ipv6 interface with
-    guest/guest as default configured user. Note that this only fixes *new*
-    installation, and that any already existing setup will have to edit the
-    /etc/rabbitmq/rabbitmq-env.conf manually if affected. (Closes: #727607)
-  * Removed useless and deprecated DM-Upload field.
-  * Cleans plugins-src/rabbitmq-server to be able to build twice. Also cleans
-    debian/postrm which is generated from debian/postrm.in and plugins/README.
+  * New Upstream Release
 
- -- Thomas Goirand <zigo@debian.org>  Mon, 31 Mar 2014 06:11:46 +0000
+ -- Simon MacMullen <simon@rabbitmq.com>  Wed, 02 Apr 2014 14:23:14 +0100
 
 rabbitmq-server (3.2.4-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 04 Mar 2014 13:21:45 +0000
+ -- Simon MacMullen <simon@rabbitmq.com>  Mon, 03 Mar 2014 14:50:18 +0000
 
 rabbitmq-server (3.2.3-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 23 Jan 2014 16:49:45 +0000
+ -- Emile Joubert <emile@rabbitmq.com>  Thu, 23 Jan 2014 14:46:37 +0000
 
 rabbitmq-server (3.2.2-1) unstable; urgency=low
 
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Wed, 11 Dec 2013 17:31:14 +0000
-
-rabbitmq-server (3.2.1-1) unstable; urgency=low
-
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Mon, 11 Nov 2013 09:49:42 +0000
+ -- Emile Joubert <emile@rabbitmq.com>  Tue, 10 Dec 2013 16:08:08 +0000
 
 rabbitmq-server (3.2.0-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Wed, 23 Oct 2013 15:42:19 +0100
+ -- Emile Joubert <emile@rabbitmq.com>  Wed, 23 Oct 2013 12:44:10 +0100
 
-rabbitmq-server (3.1.4-1) unstable; urgency=low
+rabbitmq-server (3.1.5-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 07 Aug 2013 15:16:28 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Thu, 15 Aug 2013 11:03:13 +0100
 
 rabbitmq-server (3.1.3-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 27 Jun 2013 14:06:11 +0100
+ -- Tim Watson <tim@rabbitmq.com>  Tue, 25 Jun 2013 15:01:12 +0100
 
 rabbitmq-server (3.1.2-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 25 Jun 2013 11:28:52 +0100
+ -- Tim Watson <tim@rabbitmq.com>  Mon, 24 Jun 2013 11:16:41 +0100
 
 rabbitmq-server (3.1.1-1) unstable; urgency=low
 
-  * New upstream release
+  * Test release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 28 May 2013 11:15:13 +0100
+ -- Tim Watson <tim@rabbitmq.com>  Mon, 20 May 2013 16:21:20 +0100
 
 rabbitmq-server (3.1.0-1) unstable; urgency=low
 
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 02 May 2013 11:19:31 +0100
-
-rabbitmq-server (3.0.4-1) unstable; urgency=low
-
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Wed, 13 Mar 2013 10:53:18 +0000
-
-rabbitmq-server (3.0.4-1) unstable; urgency=low
-
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Wed, 13 Mar 2013 10:53:18 +0000
-
-rabbitmq-server (3.0.3-1) unstable; urgency=low
-
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 07 Mar 2013 10:03:31 +0000
-
-rabbitmq-server (3.0.2-1) unstable; urgency=low
-
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 31 Jan 2013 15:28:12 +0000
+ -- Simon MacMullen <simon@rabbitmq.com>  Wed, 01 May 2013 11:57:58 +0100
 
 rabbitmq-server (3.0.1-1) unstable; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 11 Dec 2012 15:47:52 +0000
+ -- Simon MacMullen <simon@rabbitmq.com>  Tue, 11 Dec 2012 11:29:55 +0000
 
 rabbitmq-server (3.0.0-1) unstable; urgency=low
 
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Mon, 19 Nov 2012 11:42:31 +0000
-
-rabbitmq-server (2.8.7-1) unstable; urgency=low
-
-  * New upstream release
-
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 27 Sep 2012 16:28:21 +0100
-
-rabbitmq-server (2.8.6-1) unstable; urgency=low
-
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Wed, 22 Aug 2012 13:28:21 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Fri, 16 Nov 2012 14:15:29 +0000
 
-rabbitmq-server (2.8.5-1) unstable; urgency=low
+rabbitmq-server (2.7.1-1) natty; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 02 Aug 2012 16:12:21 +0100
+ -- Steve Powell <steve@rabbitmq.com>  Fri, 16 Dec 2011 12:12:36 +0000
 
-rabbitmq-server (2.8.4-1) unstable; urgency=low
+rabbitmq-server (2.7.0-1) natty; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Fri, 22 Jun 2012 17:48:28 +0100
+ -- Steve Powell <steve@rabbitmq.com>  Tue, 08 Nov 2011 16:47:50 +0000
 
-rabbitmq-server (2.8.3-1) unstable; urgency=low
+rabbitmq-server (2.6.1-1) natty; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Thu, 21 Jun 2012 13:38:57 +0100
+ -- Tim <tim@rabbitmq.com>  Fri, 09 Sep 2011 14:38:45 +0100
 
-rabbitmq-server (2.8.2-2) unstable; urgency=low
+rabbitmq-server (2.6.0-1) natty; urgency=low
 
-  * Add version numbers to plugins
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 01 May 2012 10:48:57 +0100
+ -- Tim <tim@rabbitmq.com>  Fri, 26 Aug 2011 16:29:40 +0100
 
-rabbitmq-server (2.8.2-1) unstable; urgency=low
+rabbitmq-server (2.5.1-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Mon, 30 Apr 2012 14:07:32 +0100
+ -- Simon MacMullen <simon@rabbitmq.com>  Mon, 27 Jun 2011 11:21:49 +0100
 
-rabbitmq-server (2.8.1-1) unstable; urgency=low
+rabbitmq-server (2.5.0-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Fri, 23 Mar 2012 10:05:24 +0000
+ --  <jerryk@vmware.com>  Thu, 09 Jun 2011 07:20:29 -0700
 
-rabbitmq-server (2.8.0-1) unstable; urgency=low
+rabbitmq-server (2.4.1-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- Emile Joubert <emile@rabbitmq.com>  Tue, 20 Mar 2012 11:55:10 +0000
+ -- Alexandru Scvortov <alexandru@rabbitmq.com>  Thu, 07 Apr 2011 16:49:22 +0100
 
-rabbitmq-server (2.6.1-2) unstable; urgency=low
+rabbitmq-server (2.4.0-1) lucid; urgency=low
 
-  * Add DM-Upload-Allowed flag to control file to allow Maintainer uploads
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Mon, 19 Mar 2012 21:13:54 +0200
+ -- Alexandru Scvortov <alexandru@rabbitmq.com>  Tue, 22 Mar 2011 17:34:31 +0000
 
-rabbitmq-server (2.6.1-1) unstable; urgency=low
+rabbitmq-server (2.3.1-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Tue, 27 Sep 2011 17:53:57 +0200
+ -- Simon MacMullen <simon@rabbitmq.com>  Thu, 03 Feb 2011 12:43:56 +0000
 
-rabbitmq-server (2.5.0-1) unstable; urgency=low
+rabbitmq-server (2.3.0-1) lucid; urgency=low
 
-  * New upstream release 
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Thu, 16 Jun 2011 09:55:40 +0200
+ -- Simon MacMullen <simon@rabbitmq.com>  Tue, 01 Feb 2011 12:52:16 +0000
 
-rabbitmq-server (2.4.1-1) unstable; urgency=low
+rabbitmq-server (2.2.0-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sat, 09 Apr 2011 09:34:06 +0200
+ -- Rob Harrop <rob@rabbitmq.com>  Mon, 29 Nov 2010 12:24:48 +0000
 
-rabbitmq-server (2.4.0-1) unstable; urgency=low
+rabbitmq-server (2.1.1-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Wed, 23 Mar 2011 21:11:17 +0200
+ -- Vlad Alexandru Ionescu <vlad@rabbitmq.com>  Tue, 19 Oct 2010 17:20:10 +0100
 
-rabbitmq-server (2.3.1-1) unstable; urgency=low
+rabbitmq-server (2.1.0-1) lucid; urgency=low
 
-  * New upstream release, closes: #611253
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sat, 05 Feb 2011 10:21:16 +0200
+ -- Marek Majkowski <marek@rabbitmq.com>  Tue, 14 Sep 2010 14:20:17 +0100
 
-rabbitmq-server (2.2.0-1) unstable; urgency=low
+rabbitmq-server (2.0.0-1) karmic; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Thu, 02 Dec 2010 20:41:53 +0200
+ -- Michael Bridgen <mikeb@rabbitmq.com>  Mon, 23 Aug 2010 14:55:39 +0100
 
-rabbitmq-server (2.1.0-1) unstable; urgency=low
+rabbitmq-server (1.8.1-1) lucid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Mon, 27 Sep 2010 20:28:06 +0200
+ -- Emile Joubert <emile@rabbitmq.com>  Wed, 14 Jul 2010 15:05:24 +0100
 
-rabbitmq-server (2.0.0-2) unstable; urgency=low
+rabbitmq-server (1.8.0-1) intrepid; urgency=low
 
-  * Fix various scripts that were not updated correctly in
-    - the 2.0.0-1 package, closes: #594724
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Thu, 02 Sep 2010 18:01:37 +0200
+ -- Matthew Sackman <matthew@rabbitmq.com>  Tue, 15 Jun 2010 12:48:48 +0100
 
-rabbitmq-server (2.0.0-1) unstable; urgency=low
+rabbitmq-server (1.7.2-1) intrepid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sat, 28 Aug 2010 11:21:48 +0200
+ -- Matthew Sackman <matthew@lshift.net>  Mon, 15 Feb 2010 15:54:47 +0000
 
-rabbitmq-server (1.8.1-1) unstable; urgency=low
+rabbitmq-server (1.7.1-1) intrepid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sun, 01 Aug 2010 15:47:46 +0200
+ -- Matthew Sackman <matthew@lshift.net>  Fri, 22 Jan 2010 14:14:29 +0000
 
-rabbitmq-server (1.8.0-1) unstable; urgency=low
+rabbitmq-server (1.7.0-1) intrepid; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Thu, 24 Jun 2010 18:43:04 +0200
+ -- David Wragg <dpw@lshift.net>  Mon, 05 Oct 2009 13:44:41 +0100
 
-rabbitmq-server (1.7.0-3) unstable; urgency=low
+rabbitmq-server (1.6.0-1) hardy; urgency=low
 
-  * Add missing entries in rabbitmq-server.init
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sun, 25 Oct 2009 10:21:25 +0200
+ -- Matthias Radestock <matthias@lshift.net>  Tue, 16 Jun 2009 15:02:58 +0100
 
-rabbitmq-server (1.7.0-2) unstable; urgency=low
+rabbitmq-server (1.5.5-1) hardy; urgency=low
 
-  * moved debian/init.d to rabbitmq-server.init
-  * included fixes to rabbitmq-script-wrapper
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Wed, 14 Oct 2009 12:23:52 +0200
+ -- Matthias Radestock <matthias@lshift.net>  Tue, 19 May 2009 09:57:54 +0100
 
-rabbitmq-server (1.7.0-1) unstable; urgency=low
+rabbitmq-server (1.5.4-1) hardy; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sat, 10 Oct 2009 13:28:39 +0200
+ -- Matthias Radestock <matthias@lshift.net>  Mon, 06 Apr 2009 09:19:32 +0100
 
-rabbitmq-server (1.6.0-1) unstable; urgency=low
+rabbitmq-server (1.5.3-1) hardy; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Sat, 20 Jun 2009 12:22:17 +0200
+ -- Tony Garnock-Jones <tonyg@lshift.net>  Tue, 24 Feb 2009 18:23:33 +0000
 
-rabbitmq-server (1.5.5-3) unstable; urgency=low
+rabbitmq-server (1.5.2-1) hardy; urgency=low
 
-  *  debian/control: Reduce Erlang dependencies to just
-     erlang-mnesia and erlang-os-mon, closes: #532867
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Tue, 16 Jun 2009 14:15:20 +0200
+ -- Tony Garnock-Jones <tonyg@lshift.net>  Mon, 23 Feb 2009 16:03:38 +0000
 
-rabbitmq-server (1.5.5-2) unstable; urgency=low
+rabbitmq-server (1.5.1-1) hardy; urgency=low
 
-  * Include updates to debian package by rabbit team:
-    - quiet log rotate 
-    - update build-depends and depends for new erlang packages
-    - debian/watch file
-    - add rabbitmq-script-wrapper
-    - update init.d scripts
-    - clean /etc/rabbitmq in postrm
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Wed, 03 Jun 2009 12:23:50 +0200
+ -- Simon MacMullen <simon@lshift.net>  Mon, 19 Jan 2009 15:46:13 +0000
 
-rabbitmq-server (1.5.5-1) unstable; urgency=low
+rabbitmq-server (1.5.0-1) testing; urgency=low
 
-  * New upstream release
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Tue, 02 Jun 2009 12:53:32 +0200
+ -- Matthias Radestock <matthias@lshift.net>  Wed, 17 Dec 2008 18:23:47 +0000
 
-rabbitmq-server (1.5.4-4) unstable; urgency=low
+rabbitmq-server (1.4.0-1) testing; urgency=low
 
-  * Add new dependency on erlang-os-mon to work with new erlang packages in
-    debian
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Mon, 11 May 2009 21:20:04 +0200
+ -- Tony Garnock-Jones <tonyg@lshift.net>  Thu, 24 Jul 2008 13:21:48 +0100
 
-rabbitmq-server (1.5.4-3) unstable; urgency=low
+rabbitmq-server (1.3.0-1) testing; urgency=low
 
-  * Previous partial upload failed
+  * New Upstream Release
 
- -- John Leuner <jewel@debian.org>  Fri, 10 Apr 2009 20:25:51 +0200
+ -- Adrien Pierard <adrien@lshift.net>  Mon, 03 Mar 2008 15:34:38 +0000
 
-rabbitmq-server (1.5.4-2) unstable; urgency=low
+rabbitmq-server (1.2.0-2) testing; urgency=low
 
-  * Fix incorrect changed-by field in .changes file
+  * Fixed rabbitmqctl wrapper script
 
- -- John Leuner <jewel@debian.org>  Fri, 10 Apr 2009 19:40:04 +0200
+ -- Simon MacMullen <simon@lshift.net>  Fri, 05 Oct 2007 11:55:00 +0100
 
-rabbitmq-server (1.5.4-1) unstable; urgency=low
+rabbitmq-server (1.2.0-1) testing; urgency=low
 
   * New upstream release
 
- -- John Leuner <jewel@debian.org>  Fri, 10 Apr 2009 17:54:21 +0200
-
-rabbitmq-server (1.5.0-5) unstable; urgency=low
-
-  * Include the full license for amqp-0.8.json in debian/copyright
+ -- Simon MacMullen <simon@lshift.net>  Wed, 26 Sep 2007 11:49:26 +0100
 
- -- John Leuner <jewel@debian.org>  Fri, 27 Feb 2009 16:16:54 +0200
+rabbitmq-server (1.1.1-1) testing; urgency=low
 
-rabbitmq-server (1.5.0-4) unstable; urgency=low
+  * New upstream release
 
-  * Clarify and explicitly list the license and copyright for
-    codegen/amqp-0.8.json
-       
-  * Explicitly list the authors and copyright for the rest of the codebase
-    at the top of debian/copyright
-       
-  * Clarify the copyright of the files in src/tcp_* . The rabbitmq authors have
-    confirmed that they are the original authors of this code and that the
-    files at http://code.google.com/p/cacherl/ were taken without their
-    knowledge from the rabbitmq project. (Comparing the commit dates in version
-    control shows that cacherl is newer)
+ -- Simon MacMullen <simon@lshift.net>  Wed, 29 Aug 2007 12:03:15 +0100
 
- -- John Leuner <jewel@debian.org>  Wed, 25 Feb 2009 13:10:15 +0200
+rabbitmq-server (1.1.0-alpha-2) testing; urgency=low
 
-rabbitmq-server (1.5.0-3) unstable; urgency=low
+  * Fixed erlang-nox dependency
 
-  * Previous changelog entry had an incorrect Maintainer name
+ -- Simon MacMullen <simon@lshift.net>  Thu, 02 Aug 2007 11:27:13 +0100
 
- -- John Leuner <jewel@debian.org>  Wed, 28 Jan 2009 16:45:33 +0200
+rabbitmq-server (1.1.0-alpha-1) testing; urgency=low
 
-rabbitmq-server (1.5.0-2) unstable; urgency=low
+  * New upstream release
 
-  * Reupload package to unstable. Mistakenly uploaded to testing last time, closes: #507902
+ -- Simon MacMullen <simon@lshift.net>  Fri, 20 Jul 2007 18:17:33 +0100
 
- -- John Leuner <jewel@debian.org>  Mon, 19 Jan 2009 17:38:43 +0200
+rabbitmq-server (1.0.0-alpha-1) unstable; urgency=low
 
-rabbitmq-server (1.5.0-1) testing; urgency=low
+  * Initial release
 
-  * New Upstream Release
-  * First Debian upload, closes: #507902
+ -- Tony Garnock-Jones <tonyg@shortstop.lshift.net>  Wed, 31 Jan 2007 19:06:33 +0000
 
- -- John Leuner <jewel@debian.org>  Wed, 17 Dec 2008 18:23:47 +0000
index 0f7d53fd1cab8f3d68eaec1c8e92ab52662c2ce1..050051ba3f79db1292009fc44f1d78b7da74a01d 100644 (file)
@@ -1,33 +1,24 @@
 Source: rabbitmq-server
 Section: net
 Priority: extra
-Maintainer: PKG OpenStack <openstack-devel@lists.alioth.debian.org>
-Uploaders: James Page <james.page@ubuntu.com>, Thomas Goirand <zigo@debian.org>
-Build-Depends: debhelper (>= 9~),
-               dh-systemd (>= 1.5),
-               erlang-dev,
-               erlang-nox (>= 1:18.1),
-               erlang-src (>= 1:18.1),
-               python-simplejson,
-               rsync,
-               unzip,
-               xmlto,
-               xsltproc,
-               zip
-Standards-Version: 3.9.6
-Vcs-Browser: http://anonscm.debian.org/gitweb/?p=openstack/rabbitmq-server.git
-Vcs-Git: git://anonscm.debian.org/openstack/rabbitmq-server.git
-Homepage: http://www.rabbitmq.com/
+Maintainer: RabbitMQ Team <info@rabbitmq.com>
+Uploaders: Michael Klishin <michael@rabbitmq.com>,
+ Karl Nilsson <knilsson@rabbitmq.com>,
+ Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+Build-Depends: debhelper (>= 9),
+ dh-systemd (>= 1.5),
+ erlang-dev,
+ python-simplejson,
+ xmlto,
+ xsltproc,
+ erlang-nox (>= 1:16.b.3) | esl-erlang,
+ zip,
+ rsync
+Standards-Version: 3.9.4
 
 Package: rabbitmq-server
 Architecture: all
-Depends: adduser,
-         erlang-nox (>= 1:18.1) | esl-erlang,
-         erlang-base-hipe (>= 1:18.1) | esl-erlang,
-         logrotate,
-         socat,
-         init-system-helpers (>= 1.14)
-Description: AMQP server written in Erlang
- RabbitMQ is an implementation of AMQP, the emerging standard for high
- performance enterprise messaging. The RabbitMQ server is a robust and
- scalable implementation of an AMQP broker.
+Depends: erlang-nox (>= 1:16.b.3) | esl-erlang, adduser, logrotate, socat, init-system-helpers (>= 1.13~)
+Description: Multi-protocol messaging broker
+ RabbitMQ is an open source multi-protocol messaging broker.
+Homepage: http://www.rabbitmq.com/
index 3ce58ffa780c25bfb974d8bcb8063b0bfecb2531..521b903754223817744df3ad838273a55868444e 100644 (file)
 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: RabbitMQ
-Source: http://www.rabbitmq.com/
-
-Files: debian/*
-Copyright: (c) 2007-2013, GoPivotal, Inc.
-           (c) 2007, Tony Garnock-Jones <tonyg@rabbitmq.com>
-           (c) 2014, Blair Hester <bhester@gopivotal.com>
-           (c) 2012-2014, Emile Joubert <emile@rabbitmq.com>
-           (c) 2008-2012, John Leuner <jewel@debian.org>
-           (c) 2014, James Page <james.page@canonical.com>
-           (c) 2014, Thomas Goirand <zigo@debian.org>
-License: MPL-1.1
-
-Files: codegen/amqp-rabbitmq-*.json
-Copyright: (c) 2008-2013, GoPivotal Inc.
-License: Expat
-
-Files: plugins-src/rabbitmq-management/priv/www/js/jquery*.js
-Copyright: (c) 2010 John Resig
-License: Expat
-Comments: Downloaded from http://jquery.com/
-
-Files: plugins-src/rabbitmq-management/priv/www/js/ejs*
- plugins-src/rabbitmq-management/priv/www/js/tmpl
-Copyright: (c) 2007, Edward Benson
-License: Expat
-Comments: downloaded from http://embeddedjs.com/
-
-Files: plugins-src/rabbitmq-management/priv/www/js/sammy*.js
-Copyright: (c) 2008 Aaron Quint, Quirkey NYC, LLC
-License: Expat
-Comments: Downloaded from http://code.quirkey.com/sammy/
-
-Files: plugins-src/rabbitmq-management/priv/www/js/excanvas*.js
-Copyright: (c) 2006, Google Inc
-License: Apache-2.0
-Comments: Downloaded from http://code.google.com/p/explorercanvas/
-
-Files: plugins-src/rabbitmq-management/priv/www/js/jquery.flot*.js
-Copyright: (c) 2007-2013, IOLA and Ole Laursen
-License: Expat
-Comments: Downloaded from http://www.flotcharts.org/
-
-Files: plugins-src/webmachine-wrapper/*
-Copyright: (c) Basho Technologies
-License: Apache-2.0
-Comments: Downloaded from http://webmachine.basho.com/
-
-Files: plugins-src/eldap-wrapper/*
-Copyright: (c) 2010, Torbjorn Tornkvist
-License: Expat
-Comments: Downloaded from https://github.com/etnt/eldap
-
-Files: plugins-src/mochiweb-wrapper/mochiweb-git/*
-Copyright: (c) 2007, Mochi Media, Inc.
-License: Expat
-Comments: Downloaded from http://github.com/mochi/mochiweb/
-
-Files: 
- plugins-src/rabbitmq-management-visualiser/priv/www/visualiser/js/glMatrix*.js
-Copyright: (c) 2011, Brandon Jones
-License: BSD-2-Clause
-Comments: Downloaded from http://code.google.com/p/glmatrix/
+Upstream-Name: rabbitmq-server
+Upstream-Contact: Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+Source: https://github.com/rabbitmq/rabbitmq-server
 
 Files: *
-Copyright: (c) 2007-2014 GoPivotal, Inc.
+Copyright: 2007-2015 Pivotal Software, Inc.
 License: MPL-1.1
 
-License: Expat
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this file (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."
-
-License: BSD-2-Clause
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- .
-  1. Redistributions of source code must retain the above copyright notice,
-     this list of conditions and the following disclaimer.
- .
-  2. Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in the
-     documentation and/or other materials provided with the distribution.
- .
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE."
+Files: src/mochinum.erl deps/rabbit_common/src/mochijson2.erl
+Copyright: 2007 Mochi Media, Inc.
+License: MIT
 
 License: MPL-1.1
- MOZILLA PUBLIC LICENSE Version 1.1
- 1. Definitions.
- .
- 1.0.1. "Commercial Use" means distribution or otherwise making the Covered
- Code available to a third party.
- .
- 1.1. "Contributor" means each entity that creates or contributes to the
- creation of Modifications.
- .
- 1.2. "Contributor Version" means the combination of the Original Code, prior
- Modifications used by a Contributor, and the Modifications made by that
- particular Contributor.
- .
- 1.3. "Covered Code" means the Original Code or Modifications or the
- combination of the Original Code and Modifications, in each case including
- portions thereof.
- .
- 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted
- in the software development community for the electronic transfer of data.
- .
- 1.5. "Executable" means Covered Code in any form other than Source Code.
- .
- 1.6. "Initial Developer" means the individual or entity identified as the
- Initial Developer in the Source Code notice required by Exhibit A.
- .
- 1.7. "Larger Work" means a work which combines Covered Code or portions
- thereof with code not governed by the terms of this License.
- .
- 1.8. "License" means this document.
- .
- 1.8.1. "Licensable" means having the right to grant, to the maximum extent
- possible, whether at the time of the initial grant or subsequently acquired,
- any and all of the rights conveyed herein.
- .
- 1.9. "Modifications" means any addition to or deletion from the substance or
- structure of either the Original Code or any previous Modifications. When
- Covered Code is released as a series of files, a Modification is:
- .
- A. Any addition to or deletion from the contents of a file containing
-    Original Code or previous Modifications.
- .
- B. Any new file that contains any part of the Original Code or previous
-    Modifications.
- .
- 1.10. "Original Code" means Source Code of computer software code which is
- described in the Source Code notice required by Exhibit A as Original Code,
- and which, at the time of its release under this License is not already
- Covered Code governed by this License.
- .
- 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter
- acquired, including without limitation,  method, process, and apparatus
- claims, in any patent Licensable by grantor.
- .
- 1.11. "Source Code" means the preferred form of the Covered Code for making
- modifications to it, including all modules it contains, plus any associated
- interface definition files, scripts used to control compilation and
- installation of an Executable, or source code differential comparisons
- against either the Original Code or another well known, available Covered
- Code of the Contributor's choice. The Source Code can be in a compressed or
- archival form, provided the appropriate decompression or de-archiving
- software is widely available for no charge.
- .
- 1.12. "You" (or "Your")  means an individual or a legal entity exercising
- rights under, and complying with all of the terms of, this License or a
- future version of this License issued under Section 6.1. For legal entities,
- "You" includes any entity which controls, is controlled by, or is under
- common control with You. For purposes of this definition, "control" means (a)
- the power, direct or indirect, to cause the direction or management of such
- entity, whether by contract or otherwise, or (b) ownership of more than fifty
- percent (50%) of the outstanding shares or beneficial ownership of such
- entity.
- .
- 2. Source Code License.
- .
- 2.1. The Initial Developer Grant.
- The Initial Developer hereby grants You a world-wide, royalty-free,
- non-exclusive license, subject to third party intellectual property claims:
- .
- (a) under intellectual property rights (other than patent or
-     trademark) Licensable by Initial Developer to use, reproduce,
-     modify, display, perform, sublicense and distribute the Original
-     Code (or portions thereof) with or without Modifications, and/or
-     as part of a Larger Work; and
- .
- (b) under Patents Claims infringed by the making, using or
-     selling of Original Code, to make, have made, use, practice,
-     sell, and offer for sale, and/or otherwise dispose of the
-     Original Code (or portions thereof).
- .
- (c) the licenses granted in this Section 2.1(a) and (b) are
-     effective on the date Initial Developer first distributes
-     Original Code under the terms of this License.
- .
- (d) Notwithstanding Section 2.1(b) above, no patent license is
-     granted: 1) for code that You delete from the Original Code; 2)
-     separate from the Original Code;  or 3) for infringements caused
-     by: i) the modification of the Original Code or ii) the
-     combination of the Original Code with other software or devices.
- .
- 2.2. Contributor Grant.
- Subject to third party intellectual property claims, each Contributor hereby
- grants You a world-wide, royalty-free, non-exclusive license
- .
- (a) under intellectual property rights (other than patent or
-     trademark) Licensable by Contributor, to use, reproduce, modify,
-     display, perform, sublicense and distribute the Modifications
-     created by such Contributor (or portions thereof) either on an
-     unmodified basis, with other Modifications, as Covered Code
-     and/or as part of a Larger Work; and
- .
- (b) under Patent Claims infringed by the making, using, or
-     selling of  Modifications made by that Contributor either alone
-     and/or in combination with its Contributor Version (or portions
-     of such combination), to make, use, sell, offer for sale, have
-     made, and/or otherwise dispose of: 1) Modifications made by that
-     Contributor (or portions thereof); and 2) the combination of
-     Modifications made by that Contributor with its Contributor
-     Version (or portions of such combination).
- .
- (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
-     effective on the date Contributor first makes Commercial Use of
-     the Covered Code.
- .
- (d) Notwithstanding Section 2.2(b) above, no patent license is
-     granted: 1) for any code that Contributor has deleted from the
-     Contributor Version; 2)  separate from the Contributor Version;
-     3)  for infringements caused by: i) third party modifications of
-     Contributor Version or ii)  the combination of Modifications made
-     by that Contributor with other software  (except as part of the
-     Contributor Version) or other devices; or 4) under Patent Claims
-     infringed by Covered Code in the absence of Modifications made by
-     that Contributor.
- .
- 3. Distribution Obligations.
- .
- 3.1. Application of License.
- .
- The Modifications which You create or to which You contribute are governed by
- the terms of this License, including without limitation Section 2.2. The
- Source Code version of Covered Code may be distributed only under the terms of
- this License or a future version of this License released under Section 6.1,
- and You must include a copy of this License with every copy of the Source Code
- You distribute. You may not offer or impose any terms on any Source Code
- version that alters or restricts the applicable version of this License or the
- recipients' rights hereunder. However, You may include an additional document
- offering the additional rights described in Section 3.5.
- .
- 3.2. Availability of Source Code.
- .
- Any Modification which You create or to which You contribute must be made
- available in Source Code form under the terms of this License either on the
- same media as an Executable version or via an accepted Electronic Distribution
- Mechanism to anyone to whom you made an Executable version available; and if
- made available via Electronic Distribution Mechanism, must remain available
- for at least twelve (12) months after the date it initially became available,
- or at least six (6) months after a subsequent version of that particular
- Modification has been made available to such recipients. You are responsible
- for ensuring that the Source Code version remains available even if the
- Electronic Distribution Mechanism is maintained by a third party.
- .
- 3.3. Description of Modifications.
- .
- You must cause all Covered Code to which You contribute to contain a file
- documenting the changes You made to create that Covered Code and the date of
- any change. You must include a prominent statement that the Modification is
- derived, directly or indirectly, from Original Code provided by the Initial
- Developer and including the name of the Initial Developer in (a) the Source
- Code, and (b) in any notice in an Executable version or related documentation
- in which You describe the origin or ownership of the Covered Code.
- .
- 3.4. Intellectual Property Matters
- .
- (a) Third Party Claims.
- .
- If Contributor has knowledge that a license under a third party's
- intellectual property rights is required to exercise the rights
- granted by such Contributor under Sections 2.1 or 2.2,
- Contributor must include a text file with the Source Code
- distribution titled "LEGAL" which describes the claim and the
- party making the claim in sufficient detail that a recipient will
- know whom to contact. If Contributor obtains such knowledge after
- the Modification is made available as described in Section 3.2,
- Contributor shall promptly modify the LEGAL file in all copies
- Contributor makes available thereafter and shall take other steps
- (such as notifying appropriate mailing lists or newsgroups)
- reasonably calculated to inform those who received the Covered
- Code that new knowledge has been obtained.
- .
- (b) Contributor APIs.
- .
- If Contributor's Modifications include an application programming
- interface and Contributor has knowledge of patent licenses which
- are reasonably necessary to implement that API, Contributor must
- also include this information in the LEGAL file.
- .
- (c) Representations.
- .
- Contributor represents that, except as disclosed pursuant to
- Section 3.4(a) above, Contributor believes that Contributor's
- Modifications are Contributor's original creation(s) and/or
- Contributor has sufficient rights to grant the rights conveyed by
- this License.
- .
- 3.5. Required Notices.
- .
- You must duplicate the notice in Exhibit A in each file of the Source
- Code.  If it is not possible to put such notice in a particular Source
- Code file due to its structure, then You must include such notice in a
- location (such as a relevant directory) where a user would be likely
- to look for such a notice.  If You created one or more Modification(s)
- You may add your name as a Contributor to the notice described in
- Exhibit A.  You must also duplicate this License in any documentation
- for the Source Code where You describe recipients' rights or ownership
- rights relating to Covered Code.  You may choose to offer, and to
- charge a fee for, warranty, support, indemnity or liability
- obligations to one or more recipients of Covered Code. However, You
- may do so only on Your own behalf, and not on behalf of the Initial
- Developer or any Contributor. You must make it absolutely clear than
- any such warranty, support, indemnity or liability obligation is
- offered by You alone, and You hereby agree to indemnify the Initial
- Developer and every Contributor for any liability incurred by the
- Initial Developer or such Contributor as a result of warranty,
- support, indemnity or liability terms You offer.
- .
- 3.6. Distribution of Executable Versions.
- .
- You may distribute Covered Code in Executable form only if the
- requirements of Section 3.1-3.5 have been met for that Covered Code,
- and if You include a notice stating that the Source Code version of
- the Covered Code is available under the terms of this License,
- including a description of how and where You have fulfilled the
- obligations of Section 3.2. The notice must be conspicuously included
- in any notice in an Executable version, related documentation or
- collateral in which You describe recipients' rights relating to the
- Covered Code. You may distribute the Executable version of Covered
- Code or ownership rights under a license of Your choice, which may
- contain terms different from this License, provided that You are in
- compliance with the terms of this License and that the license for the
- Executable version does not attempt to limit or alter the recipient's
- rights in the Source Code version from the rights set forth in this
- License. If You distribute the Executable version under a different
- license You must make it absolutely clear that any terms which differ
- from this License are offered by You alone, not by the Initial
- Developer or any Contributor. You hereby agree to indemnify the
- Initial Developer and every Contributor for any liability incurred by
- the Initial Developer or such Contributor as a result of any such
- terms You offer.
- .
- 3.7. Larger Works.
- .
- You may create a Larger Work by combining Covered Code with other code
- not governed by the terms of this License and distribute the Larger
- Work as a single product. In such a case, You must make sure the
- requirements of this License are fulfilled for the Covered Code.
- .
- 4. Inability to Comply Due to Statute or Regulation.
- .
- If it is impossible for You to comply with any of the terms of this
- License with respect to some or all of the Covered Code due to
- statute, judicial order, or regulation then You must: (a) comply with
- the terms of this License to the maximum extent possible; and (b)
- describe the limitations and the code they affect. Such description
- must be included in the LEGAL file described in Section 3.4 and must
- be included with all distributions of the Source Code. Except to the
- extent prohibited by statute or regulation, such description must be
- sufficiently detailed for a recipient of ordinary skill to be able to
- understand it.
- .
- 5. Application of this License.
- .
- This License applies to code to which the Initial Developer has
- attached the notice in Exhibit A and to related Covered Code.
- .
- 6. Versions of the License.
- .
- 6.1. New Versions.
- .
- Netscape Communications Corporation ("Netscape") may publish revised
- and/or new versions of the License from time to time. Each version
- will be given a distinguishing version number.
- .
- 6.2. Effect of New Versions.
- .
- Once Covered Code has been published under a particular version of the
- License, You may always continue to use it under the terms of that
- version. You may also choose to use such Covered Code under the terms
- of any subsequent version of the License published by Netscape. No one
- other than Netscape has the right to modify the terms applicable to
- Covered Code created under this License.
- .
- 6.3. Derivative Works.
- .
- If You create or use a modified version of this License (which you may
- only do in order to apply it to code which is not already Covered Code
- governed by this License), You must (a) rename Your license so that
- the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
- "MPL", "NPL" or any confusingly similar phrase do not appear in your
- license (except to note that your license differs from this License)
- and (b) otherwise make it clear that Your version of the license
- contains terms which differ from the Mozilla Public License and
- Netscape Public License. (Filling in the name of the Initial
- Developer, Original Code or Contributor in the notice described in
- Exhibit A shall not of themselves be deemed to be modifications of
- this License.)
- .
- 7. DISCLAIMER OF WARRANTY.
- .
- COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
- WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
- DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
- THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
- IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
- YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
- COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
- OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
- ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
- .
- 8. TERMINATION.
- .
- 8.1.  This License and the rights granted hereunder will terminate
- automatically if You fail to comply with terms herein and fail to cure
- such breach within 30 days of becoming aware of the breach. All
- sublicenses to the Covered Code which are properly granted shall
- survive any termination of this License. Provisions which, by their
- nature, must remain in effect beyond the termination of this License
- shall survive.
- .
- 8.2.  If You initiate litigation by asserting a patent infringement
- claim (excluding declatory judgment actions) against Initial Developer
- or a Contributor (the Initial Developer or Contributor against whom
- You file such action is referred to as "Participant")  alleging that:
- .
- (a)  such Participant's Contributor Version directly or indirectly
- infringes any patent, then any and all rights granted by such
- Participant to You under Sections 2.1 and/or 2.2 of this License
- shall, upon 60 days notice from Participant terminate prospectively,
- unless if within 60 days after receipt of notice You either: (i)
- agree in writing to pay Participant a mutually agreeable reasonable
- royalty for Your past and future use of Modifications made by such
- Participant, or (ii) withdraw Your litigation claim with respect to
- the Contributor Version against such Participant.  If within 60 days
- of notice, a reasonable royalty and payment arrangement are not
- mutually agreed upon in writing by the parties or the litigation claim
- is not withdrawn, the rights granted by Participant to You under
- Sections 2.1 and/or 2.2 automatically terminate at the expiration of
- the 60 day notice period specified above.
- .
- (b)  any software, hardware, or device, other than such Participant's
- Contributor Version, directly or indirectly infringes any patent, then
- any rights granted to You by such Participant under Sections 2.1(b)
- and 2.2(b) are revoked effective as of the date You first made, used,
- sold, distributed, or had made, Modifications made by that
- Participant.
- .
- 8.3.  If You assert a patent infringement claim against Participant
- alleging that such Participant's Contributor Version directly or
- indirectly infringes any patent where such claim is resolved (such as
- by license or settlement) prior to the initiation of patent
- infringement litigation, then the reasonable value of the licenses
- granted by such Participant under Sections 2.1 or 2.2 shall be taken
- into account in determining the amount or value of any payment or
- license.
- .
- 8.4.  In the event of termination under Sections 8.1 or 8.2 above,
- all end user license agreements (excluding distributors and resellers)
- which have been validly granted by You or any distributor hereunder
- prior to termination shall survive termination.
- .
- 9. LIMITATION OF LIABILITY.
- .
- UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
- (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
- DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
- OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
- ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
- CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
- WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
- COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
- INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
- LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
- RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
- PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
- EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
- THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
- .
- 10. U.S. GOVERNMENT END USERS.
- .
- The Covered Code is a "commercial item," as that term is defined in
- 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
- software" and "commercial computer software documentation," as such
- terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
- C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
- all U.S. Government End Users acquire Covered Code with only those
- rights set forth herein.
- .
- 11. MISCELLANEOUS.
- .
- This License represents the complete agreement concerning subject
- matter hereof. If any provision of this License is held to be
- unenforceable, such provision shall be reformed only to the extent
- necessary to make it enforceable. This License shall be governed by
- California law provisions (except to the extent applicable law, if
- any, provides otherwise), excluding its conflict-of-law provisions.
- With respect to disputes in which at least one party is a citizen of,
- or an entity chartered or registered to do business in the United
- States of America, any litigation relating to this License shall be
- subject to the jurisdiction of the Federal Courts of the Northern
- District of California, with venue lying in Santa Clara County,
- California, with the losing party responsible for costs, including
- without limitation, court costs and reasonable attorneys' fees and
- expenses. The application of the United Nations Convention on
- Contracts for the International Sale of Goods is expressly excluded.
- Any law or regulation which provides that the language of a contract
- shall be construed against the drafter shall not apply to this
- License.
- .
- 12. RESPONSIBILITY FOR CLAIMS.
- .
- As between Initial Developer and the Contributors, each party is
- responsible for claims and damages arising, directly or indirectly,
- out of its utilization of rights under this License and You agree to
- work with Initial Developer and Contributors to distribute such
- responsibility on an equitable basis. Nothing herein is intended or
- shall be deemed to constitute any admission of liability.
- .
- 13. MULTIPLE-LICENSED CODE.
- .
- Initial Developer may designate portions of the Covered Code as
- "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
- Developer permits you to utilize portions of the Covered Code under
- Your choice of the NPL or the alternative licenses, if any, specified
- by the Initial Developer in the file described in Exhibit A.
- .
- EXHIBIT A -Mozilla Public License.
- .
- The contents of this file are subject to the Mozilla Public License Version
- 1.1 (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.mozilla.org/MPL/
- .
- Software distributed under the License is distributed on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
- the specific language governing rights and limitations under the License.
- .
- The Original Code is RabbitMQ.
- .
- The Initial Developer of the Original Code is GoPivotal, Inc. Copyright (c)
- 2007-2014 GoPivotal, Inc. All rights reserved.
-
-License: Apache-2.0
-  On Debian GNU/Linux system you can find the complete text of the
-  Apache-2.0 license in '/usr/share/common-licenses/Apache-2.0'
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (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.mozilla.org/MPL/
+ .
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License
+ .
+ The Original Code is RabbitMQ
+ .
+ The Initial Developer of the Original Code is Pivotal Software, Inc.
+ Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
+
+License: MIT
+ This is the MIT license
+ .
+ Copyright (c) 2007 Mochi Media, Inc
+ .
+ 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.
diff --git a/debian/dirs b/debian/dirs
new file mode 100644 (file)
index 0000000..625b7d4
--- /dev/null
@@ -0,0 +1,9 @@
+usr/lib/rabbitmq/bin
+usr/lib/erlang/lib
+usr/sbin
+usr/share/man
+var/lib/rabbitmq/mnesia
+var/log/rabbitmq
+etc/logrotate.d
+etc/rabbitmq
+
diff --git a/debian/gbp.conf b/debian/gbp.conf
deleted file mode 100644 (file)
index ee339ed..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-[DEFAULT]
-debian-branch = master
-pristine-tar = True
-
-[buildpackage]
-export-dir = ../build-area/
diff --git a/debian/patches/health-check-rabbit-node-monitor-rmq-pr-915.patch b/debian/patches/health-check-rabbit-node-monitor-rmq-pr-915.patch
deleted file mode 100644 (file)
index 9e3954d..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
---- a/deps/rabbit_common/src/rabbit_health_check.erl
-+++ b/deps/rabbit_common/src/rabbit_health_check.erl
-@@ -35,7 +35,7 @@ node(Node, Timeout) ->
-     rabbit_misc:rpc_call(Node, rabbit_health_check, local, [], Timeout).
- local() ->
--    run_checks([list_channels, list_queues, alarms]).
-+    run_checks([list_channels, list_queues, alarms, rabbit_node_monitor]).
- %%----------------------------------------------------------------------------
- %% Internal functions
-@@ -63,6 +63,16 @@ node_health_check(list_channels) ->
- node_health_check(list_queues) ->
-     health_check_queues(rabbit_vhost:list());
-+node_health_check(rabbit_node_monitor) ->
-+    case rabbit_node_monitor:partitions() of
-+        L when is_list(L) ->
-+            ok;
-+        Other ->
-+            ErrorMsg = io_lib:format("rabbit_node_monitor:partitions/1 unexpected out: ~p",
-+                                     [Other]),
-+            {error_string, ErrorMsg}
-+    end;
-+
- node_health_check(alarms) ->
-     case proplists:get_value(alarms, rabbit:status()) of
-         [] ->
---- a/src/rabbit_autoheal.erl
-+++ b/src/rabbit_autoheal.erl
-@@ -297,6 +297,17 @@ winner_finish(Notify) ->
-     send(leader(), {autoheal_finished, node()}),
-     not_healing.
-+%% XXX This can enter infinite loop, if mnesia was somehow restarted
-+%% outside of our control - i.e. somebody started app back by hand or
-+%% completely restarted node. One possible solution would be something
-+%% like this (but it needs some more pondering and is left for some
-+%% other patch):
-+%% - monitor top-level mnesia supervisors of all losers
-+%% - notify loosers about the fact that they are indeed loosers
-+%% - wait for all monitors to go 'DOWN' (+ maybe some timeout on the whole process)
-+%% - do one round of parallel rpc calls to check whether mnesia is still stoppend on all
-+%%   loosers
-+%% - If everything is still stopped, continue autoheall process. Or cancel it otherwise.
- wait_for_mnesia_shutdown([Node | Rest] = AllNodes) ->
-     case rpc:call(Node, mnesia, system_info, [is_running]) of
-         no ->
---- a/test/health_check_SUITE.erl
-+++ b/test/health_check_SUITE.erl
-@@ -33,6 +33,8 @@
-         ,ignores_remote_alarms/1
-         ,detects_local_alarm/1
-         ,honors_timeout_argument/1
-+        ,detects_stuck_local_node_monitor/1
-+        ,ignores_stuck_remote_node_monitor/1
-         ]).
- all() ->
-@@ -47,6 +49,8 @@ groups() ->
-       ,ignores_remote_alarms
-       ,detects_local_alarm
-       ,honors_timeout_argument
-+      ,detects_stuck_local_node_monitor
-+      ,ignores_stuck_remote_node_monitor
-       ]}].
- init_per_suite(Config) ->
-@@ -123,6 +127,21 @@ detects_local_alarm(Config) ->
-     {match, _} = re:run(Str, "resource alarm.*in effect"),
-     ok.
-+detects_stuck_local_node_monitor(Config) ->
-+    [A|_] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-+    rabbit_ct_broker_helpers:rpc(Config, A, sys, suspend, [rabbit_node_monitor]),
-+    {error, 75, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-+    {match, _} = re:run(Str, "operation node_health_check.*timed out"),
-+    resume_sys_process(Config, A, rabbit_node_monitor),
-+    ok.
-+
-+ignores_stuck_remote_node_monitor(Config) ->
-+    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-+    rabbit_ct_broker_helpers:rpc(Config, A, sys, suspend, [rabbit_node_monitor]),
-+    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, B, ["-t", "5", "node_health_check"]),
-+    resume_sys_process(Config, A, rabbit_node_monitor),
-+    ok.
-+
- honors_timeout_argument(Config) ->
-     [A|_] = open_channel_and_declare_queue_everywhere(Config),
-     QPid = suspend_single_queue(Config, A),
diff --git a/debian/patches/list-only-local-queues-rmq-pr-911.patch b/debian/patches/list-only-local-queues-rmq-pr-911.patch
deleted file mode 100644 (file)
index 45e48d2..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-diff -ur rabbitmq-server.orig/deps/rabbit_common/src/rabbit_amqqueue.erl rabbitmq-server/deps/rabbit_common/src/rabbit_amqqueue.erl
---- rabbitmq-server.orig/deps/rabbit_common/src/rabbit_amqqueue.erl    2016-08-11 16:00:38.352019183 +0300
-+++ rabbitmq-server/deps/rabbit_common/src/rabbit_amqqueue.erl 2016-08-12 13:30:11.356483617 +0300
-@@ -25,7 +25,7 @@
-          check_exclusive_access/2, with_exclusive_access_or_die/3,
-          stat/1, deliver/2, requeue/3, ack/3, reject/4]).
- -export([list/0, list/1, info_keys/0, info/1, info/2, info_all/1, info_all/2,
--         info_all/6, info_local/1]).
-+         info_all/5, info_local/1]).
- -export([list_down/1]).
- -export([force_event_refresh/1, notify_policy_changed/1]).
- -export([consumers/1, consumers_all/1,  consumers_all/3, consumer_info_keys/0]).
-@@ -117,8 +117,9 @@
- -spec info_all(rabbit_types:vhost()) -> [rabbit_types:infos()].
- -spec info_all(rabbit_types:vhost(), rabbit_types:info_keys()) ->
-           [rabbit_types:infos()].
-+-type info_all_filter() :: 'all' | 'online' | 'offline' | 'local'.
- -spec info_all
--        (rabbit_types:vhost(), rabbit_types:info_keys(), boolean(), boolean(),
-+        (rabbit_types:vhost(), rabbit_types:info_keys(), info_all_filter(),
-          reference(), pid()) ->
-             'ok'.
- -spec force_event_refresh(reference()) -> 'ok'.
-@@ -627,15 +628,28 @@
-     map(list(VHostPath), fun (Q) -> info(Q, Items) end) ++
-         map(list_down(VHostPath), fun (Q) -> info_down(Q, Items, down) end).
--info_all(VHostPath, Items, NeedOnline, NeedOffline, Ref, AggregatorPid) ->
--    NeedOnline andalso rabbit_control_misc:emitting_map_with_exit_handler(
--                         AggregatorPid, Ref, fun(Q) -> info(Q, Items) end, list(VHostPath),
--                         continue),
--    NeedOffline andalso rabbit_control_misc:emitting_map_with_exit_handler(
--                          AggregatorPid, Ref, fun(Q) -> info_down(Q, Items, down) end,
--                          list_down(VHostPath),
--                          continue),
--    %% Previous maps are incomplete, finalize emission
-+info_all_partial_emit(VHostPath, Items, all, Ref, AggregatorPid) ->
-+    info_all_partial_emit(VHostPath, Items, online, Ref, AggregatorPid),
-+    info_all_partial_emit(VHostPath, Items, offline, Ref, AggregatorPid);
-+info_all_partial_emit(VHostPath, Items, online, Ref, AggregatorPid) ->
-+    rabbit_control_misc:emitting_map_with_exit_handler(
-+      AggregatorPid, Ref, fun(Q) -> info(Q, Items) end,
-+      list(VHostPath),
-+      continue);
-+info_all_partial_emit(VHostPath, Items, offline, Ref, AggregatorPid) ->
-+    rabbit_control_misc:emitting_map_with_exit_handler(
-+      AggregatorPid, Ref, fun(Q) -> info_down(Q, Items, down) end,
-+      list_down(VHostPath),
-+      continue);
-+info_all_partial_emit(VHostPath, Items, local, Ref, AggregatorPid) ->
-+    rabbit_control_misc:emitting_map_with_exit_handler(
-+      AggregatorPid, Ref, fun(Q) -> info(Q, Items) end,
-+      list_local(VHostPath),
-+      continue).
-+
-+info_all(VHostPath, Items, Filter, Ref, AggregatorPid) ->
-+    info_all_partial_emit(VHostPath, Items, Filter, Ref, AggregatorPid),
-+    %% Previous map(s) are incomplete, finalize emission
-     rabbit_control_misc:emitting_map(AggregatorPid, Ref, fun(_) -> no_op end, []).
- info_local(VHostPath) ->
-diff -ur rabbitmq-server.orig/docs/rabbitmqctl.1.xml rabbitmq-server/docs/rabbitmqctl.1.xml
---- rabbitmq-server.orig/docs/rabbitmqctl.1.xml        2016-08-11 16:00:38.387018772 +0300
-+++ rabbitmq-server/docs/rabbitmqctl.1.xml     2016-08-12 13:29:18.480081969 +0300
-@@ -749,9 +749,7 @@
-         <varlistentry>
-           <term>
--          <cmdsynopsis>
--            <command>authenticate_user</command> <arg choice="req"><replaceable>username</replaceable></arg> <arg choice="req"><replaceable>password</replaceable></arg>
--          </cmdsynopsis>
-+          <cmdsynopsis><command>authenticate_user</command> <arg choice="req"><replaceable>username</replaceable></arg> <arg choice="req"><replaceable>password</replaceable></arg></cmdsynopsis>
-           </term>
-           <listitem>
-             <variablelist>
-@@ -1237,7 +1235,9 @@
-       <variablelist>
-         <varlistentry role="usage-has-option-list">
--          <term><cmdsynopsis><command>list_queues</command> <arg choice="opt">-p <replaceable>vhost</replaceable></arg> <arg choice="opt" role="usage-option-list"><replaceable>queueinfoitem</replaceable> ...</arg></cmdsynopsis></term>
-+          <term>
-+            <cmdsynopsis><command>list_queues</command> <arg choice="opt">-p <replaceable>vhost</replaceable></arg> <group choice="opt"><arg>--offline</arg><arg>--online</arg><arg>--local</arg></group> <arg choice="opt" role="usage-option-list"><replaceable>queueinfoitem</replaceable> ...</arg></cmdsynopsis>
-+          </term>
-           <listitem>
-             <para>
-               Returns queue details. Queue details of the <command>/</command> virtual host
-@@ -1245,6 +1245,41 @@
-               override this default.
-             </para>
-             <para>
-+              Displayed queues can be filtered by their status or
-+              location using one of the following mutually exclusive
-+              options:
-+            </para>
-+            <variablelist>
-+
-+              <varlistentry>
-+                <term><cmdsynopsis><arg choice="opt">--offline</arg></cmdsynopsis></term>
-+                <listitem>
-+                  <para>
-+                    List only those durable queues that are not
-+                    currently running - i.e. they are located on
-+                    inaccessible nodes.
-+                  </para>
-+                </listitem>
-+              </varlistentry>
-+              <varlistentry>
-+                <term><cmdsynopsis><arg choice="opt">--online</arg></cmdsynopsis></term>
-+                <listitem>
-+                  <para>
-+                    List queues that are currently live.
-+                  </para>
-+                </listitem>
-+              </varlistentry>
-+              <varlistentry>
-+                <term><cmdsynopsis><arg choice="opt">--local</arg></cmdsynopsis></term>
-+                <listitem>
-+                  <para>
-+                    List only those queues whose master process is
-+                    located on the current node.
-+                  </para>
-+                </listitem>
-+              </varlistentry>
-+            </variablelist>
-+            <para>
-               The <command>queueinfoitem</command> parameter is used to indicate which queue
-               information items to include in the results. The column order in the
-               results will match the order of the parameters.
-diff -ur rabbitmq-server.orig/docs/usage.xsl rabbitmq-server/docs/usage.xsl
---- rabbitmq-server.orig/docs/usage.xsl        2016-03-31 17:21:29.000000000 +0300
-+++ rabbitmq-server/docs/usage.xsl     2016-08-12 13:29:18.480081969 +0300
-@@ -8,7 +8,7 @@
-               encoding="UTF-8"
-               indent="no"/>
- <xsl:strip-space elements="*"/>
--<xsl:preserve-space elements="cmdsynopsis arg" />
-+<xsl:preserve-space elements="cmdsynopsis arg group" />
- <xsl:template match="/">
- <!-- Pull out cmdsynopsis to show the command usage line. -->%% Generated, do not edit!
-@@ -68,6 +68,14 @@
- <!-- Don't show anything else in command usage -->
- <xsl:template match="text()" mode="command-usage"/>
-+<xsl:template match="group[@choice='opt']">
-+  <xsl:text>[</xsl:text>
-+  <xsl:for-each select="arg">
-+    <xsl:apply-templates/>
-+    <xsl:if test="not(position() = last())"><xsl:text>|</xsl:text></xsl:if>
-+  </xsl:for-each>
-+  <xsl:text>]</xsl:text>
-+</xsl:template>
- <xsl:template match="arg[@choice='opt']">[<xsl:apply-templates/>]</xsl:template>
- <xsl:template match="replaceable">&lt;<xsl:value-of select="."/>&gt;</xsl:template>
-diff -ur rabbitmq-server.orig/include/rabbit_cli.hrl rabbitmq-server/include/rabbit_cli.hrl
---- rabbitmq-server.orig/include/rabbit_cli.hrl        2016-08-11 16:00:38.388018760 +0300
-+++ rabbitmq-server/include/rabbit_cli.hrl     2016-08-12 13:29:18.480081969 +0300
-@@ -29,6 +29,7 @@
- -define(RAM_OPT, "--ram").
- -define(OFFLINE_OPT, "--offline").
- -define(ONLINE_OPT, "--online").
-+-define(LOCAL_OPT, "--local").
- -define(NODE_DEF(Node), {?NODE_OPT, {option, Node}}).
-@@ -46,6 +47,7 @@
- -define(RAM_DEF, {?RAM_OPT, flag}).
- -define(OFFLINE_DEF, {?OFFLINE_OPT, flag}).
- -define(ONLINE_DEF, {?ONLINE_OPT, flag}).
-+-define(LOCAL_DEF, {?LOCAL_OPT, flag}).
- %% Subset of standartized exit codes from sysexits.h, see
- %% https://github.com/rabbitmq/rabbitmq-server/issues/396 for discussion.
-diff -ur rabbitmq-server.orig/src/rabbit_cli.erl rabbitmq-server/src/rabbit_cli.erl
---- rabbitmq-server.orig/src/rabbit_cli.erl    2016-08-11 16:00:38.392018713 +0300
-+++ rabbitmq-server/src/rabbit_cli.erl 2016-08-12 13:29:18.480081969 +0300
-@@ -18,7 +18,7 @@
- -include("rabbit_cli.hrl").
- -export([main/3, start_distribution/0, start_distribution/1,
--         parse_arguments/4, filter_opts/2,
-+         parse_arguments/4, mutually_exclusive_flags/3,
-          rpc_call/4, rpc_call/5, rpc_call/7]).
- %%----------------------------------------------------------------------------
-@@ -42,8 +42,7 @@
-          [{string(), optdef()}], string(), [string()]) ->
-           parse_result().
---spec filter_opts([{option_name(), option_value()}], [option_name()]) ->
--          [boolean()].
-+-spec mutually_exclusive_flags([{option_name(), option_value()}], term(), [{option_name(), term()}]) -> {ok, term()} | {error, string()}.
- -spec rpc_call(node(), atom(), atom(), [any()]) -> any().
- -spec rpc_call(node(), atom(), atom(), [any()], number()) -> any().
-@@ -250,20 +249,22 @@
-         {none, _, _}     -> no_command
-     end.
--%% When we have a set of flags that are used for filtering, we want by
--%% default to include every such option in our output. But if a user
--%% explicitly specified any such flag, we want to include only items
--%% which he has requested.
--filter_opts(CurrentOptionValues, AllOptionNames) ->
--    Explicit = lists:map(fun(OptName) ->
--                                 proplists:get_bool(OptName, CurrentOptionValues)
--                         end,
--                         AllOptionNames),
--    case lists:member(true, Explicit) of
--        true ->
--            Explicit;
--        false ->
--            lists:duplicate(length(AllOptionNames), true)
-+mutually_exclusive_flags(CurrentOptionValues, Default, FlagsAndValues) ->
-+    PresentFlags = lists:filtermap(fun({OptName, _} = _O) ->
-+                                           proplists:get_bool(OptName, CurrentOptionValues)
-+                                   end,
-+                             FlagsAndValues),
-+    case PresentFlags of
-+        [] ->
-+            {ok, Default};
-+        [{_, Value}] ->
-+            {ok, Value};
-+        _ ->
-+            Names = [ [$', N, $']  || {N, _} <- PresentFlags ],
-+            CommaSeparated = string:join(lists:droplast(Names), ", "),
-+            AndOneMore = lists:last(Names),
-+            Msg = io_lib:format("Options ~s and ~s are mutually exclusive", [CommaSeparated, AndOneMore]),
-+            {error, lists:flatten(Msg)}
-     end.
- %%----------------------------------------------------------------------------
-diff -ur rabbitmq-server.orig/src/rabbit_control_main.erl rabbitmq-server/src/rabbit_control_main.erl
---- rabbitmq-server.orig/src/rabbit_control_main.erl   2016-08-11 16:00:38.392018713 +0300
-+++ rabbitmq-server/src/rabbit_control_main.erl        2016-08-12 13:29:18.481081958 +0300
-@@ -74,7 +74,7 @@
-          {clear_policy, [?VHOST_DEF]},
-          {list_policies, [?VHOST_DEF]},
--         {list_queues, [?VHOST_DEF, ?OFFLINE_DEF, ?ONLINE_DEF]},
-+         {list_queues, [?VHOST_DEF, ?OFFLINE_DEF, ?ONLINE_DEF, ?LOCAL_DEF]},
-          {list_exchanges, [?VHOST_DEF]},
-          {list_bindings, [?VHOST_DEF]},
-          {list_connections, [?VHOST_DEF]},
-@@ -632,12 +632,19 @@
-          true);
- action(list_queues, Node, Args, Opts, Inform, Timeout) ->
--    [Online, Offline] = rabbit_cli:filter_opts(Opts, [?ONLINE_OPT, ?OFFLINE_OPT]),
--    Inform("Listing queues", []),
--    VHostArg = list_to_binary(proplists:get_value(?VHOST_OPT, Opts)),
--    ArgAtoms = default_if_empty(Args, [name, messages]),
--    call(Node, {rabbit_amqqueue, info_all, [VHostArg, ArgAtoms, Online, Offline]},
--         ArgAtoms, Timeout);
-+    case rabbit_cli:mutually_exclusive_flags(
-+           Opts, all, [{?ONLINE_OPT, online}
-+                      ,{?OFFLINE_OPT, offline}
-+                      ,{?LOCAL_OPT, local}]) of
-+        {ok, Filter} ->
-+            Inform("Listing queues", []),
-+            VHostArg = list_to_binary(proplists:get_value(?VHOST_OPT, Opts)),
-+            ArgAtoms = default_if_empty(Args, [name, messages]),
-+            call(Node, {rabbit_amqqueue, info_all, [VHostArg, ArgAtoms, Filter]},
-+                 ArgAtoms, Timeout);
-+        {error, ErrStr} ->
-+            {error_string, ErrStr}
-+    end;
- action(list_exchanges, Node, Args, Opts, Inform, Timeout) ->
-     Inform("Listing exchanges", []),
-Only in rabbitmq-server/test: rabbitmqctl_integration_SUITE.erl
-diff -ur rabbitmq-server.orig/test/unit_SUITE.erl rabbitmq-server/test/unit_SUITE.erl
---- rabbitmq-server.orig/test/unit_SUITE.erl   2016-08-11 16:00:38.402018595 +0300
-+++ rabbitmq-server/test/unit_SUITE.erl        2016-08-12 13:29:18.481081958 +0300
-@@ -31,7 +31,7 @@
-     [
-       {parallel_tests, [parallel], [
-           arguments_parser,
--          filtering_flags_parsing,
-+          mutually_exclusive_flags_parsing,
-           {basic_header_handling, [parallel], [
-               write_table_with_invalid_existing_type,
-               invalid_existing_headers,
-@@ -135,26 +135,32 @@
-     true = SortRes(ExpRes) =:= SortRes(Fun(As)).
--filtering_flags_parsing(_Config) ->
--    Cases = [{[], [], []}
--            ,{[{"--online", true}], ["--offline", "--online", "--third-option"], [false, true, false]}
--            ,{[{"--online", true}, {"--third-option", true}, {"--offline", true}], ["--offline", "--online", "--third-option"], [true, true, true]}
--            ,{[], ["--offline", "--online", "--third-option"], [true, true, true]}
--            ],
--    lists:foreach(fun({Vals, Opts, Expect}) ->
--                          case rabbit_cli:filter_opts(Vals, Opts) of
--                              Expect ->
-+mutually_exclusive_flags_parsing(_Config) ->
-+    Spec = [{"--online", online}
-+           ,{"--offline", offline}
-+           ,{"--local", local}],
-+    Default = all,
-+    Cases =[{["--online"], {ok, online}}
-+           ,{[], {ok, Default}}
-+           ,{["--offline"], {ok, offline}}
-+           ,{["--local"], {ok, local}}
-+           ,{["--offline", "--local"], {error, "Options '--offline' and '--local' are mutually exclusive"}}
-+           ,{["--offline", "--online"], {error, "Options '--online' and '--offline' are mutually exclusive"}}
-+           ,{["--offline", "--local", "--online"], {error, "Options '--online', '--offline' and '--local' are mutually exclusive"}}
-+           ],
-+    lists:foreach(fun({Opts, Expected}) ->
-+                          ExpandedOpts = [ {Opt, true} || Opt <- Opts ],
-+                          case rabbit_cli:mutually_exclusive_flags(ExpandedOpts, all, Spec) of
-+                              Expected ->
-                                   ok;
-                               Got ->
--                                  exit({no_match, Got, Expect, {args, Vals, Opts}})
-+                                  exit({no_match, Got, Expected, {opts, Opts}})
-                           end
--                  end,
--                  Cases).
-+                  end, Cases).
- %% -------------------------------------------------------------------
- %% basic_header_handling.
- %% -------------------------------------------------------------------
--
- -define(XDEATH_TABLE,
-         [{<<"reason">>,       longstr,   <<"blah">>},
-          {<<"queue">>,        longstr,   <<"foo.bar.baz">>},
diff --git a/debian/patches/native-code-path.patch b/debian/patches/native-code-path.patch
deleted file mode 100644 (file)
index 131caae..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Только Ð² rabbitmq-server: .pc
-diff -r -u rabbitmq-server-3.6.1/scripts/rabbitmq-server rabbitmq-server/scripts/rabbitmq-server
---- rabbitmq-server-3.6.1/scripts/rabbitmq-server      2016-02-09 15:55:29.000000000 +0300
-+++ rabbitmq-server/scripts/rabbitmq-server    2016-04-04 20:18:01.000000000 +0300
-@@ -141,6 +141,7 @@
-     check_start_params &&
-     RABBITMQ_CONFIG_FILE=$RABBITMQ_CONFIG_FILE \
-     exec ${ERL_DIR}erl \
-+        -pa /var/lib/rabbitmq/native-code \
-         -pa ${RABBITMQ_SERVER_CODE_PATH} ${RABBITMQ_EBIN_ROOT} \
-         ${RABBITMQ_START_RABBIT} \
-         ${RABBITMQ_NAME_TYPE} ${RABBITMQ_NODENAME} \
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644 (file)
index 2154bb5..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-native-code-path.patch
-list-only-local-queues-rmq-pr-911.patch
-health-check-rabbit-node-monitor-rmq-pr-915.patch
old mode 100755 (executable)
new mode 100644 (file)
similarity index 89%
rename from debian/rabbitmq-server.postinst
rename to debian/postinst
index 5fdba49..c83881e
@@ -35,18 +35,12 @@ chown -R rabbitmq:rabbitmq /var/log/rabbitmq
 chmod 750 /var/lib/rabbitmq/mnesia
 chmod -R o-rwx,g-w /var/lib/rabbitmq/mnesia
 
-HIPE_DIRECTORY=/var/lib/rabbitmq/native-code
-
 case "$1" in
     configure)
         if [ -f /etc/rabbitmq/rabbitmq.conf ] && \
            [ ! -f /etc/rabbitmq/rabbitmq-env.conf ]; then
             mv /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/rabbitmq-env.conf
         fi
-        if command -v systemctl > /dev/null; then
-            systemctl start epmd.socket
-        fi
-        rabbitmqctl hipe_compile $HIPE_DIRECTORY
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
index 51acac35e703da86f536f7945e1c7fb02e3cd86d..bde5e308952bfed0aabb86bf525e20d1d2763b7c 100644 (file)
@@ -6,12 +6,4 @@
 # to handle many simultaneous connections. Refer to the system
 # documentation for ulimit (in man bash) for more information.
 #
-# Default value is 1024, but it's absolutely unreasonable default in a
-# modern world, as rabbitmq consumes file descriptors for everything:
-# for client connections, for per-queue files, etc. Its documentation
-# recommends to allow for at least 65536 open file descriptors in
-# production. Values were chosen in
-# https://bugs.launchpad.net/fuel/+bug/1279594
-ulimit -H -n 105472 || true
-ulimit -S -n 102400 || true
-ulimit -H -n 105472 || true
+#ulimit -n 1024
diff --git a/debian/rabbitmq-server.dirs b/debian/rabbitmq-server.dirs
deleted file mode 100644 (file)
index e6127a0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/lib/erlang/lib
-var/lib/rabbitmq/mnesia
-var/log/rabbitmq
diff --git a/debian/rabbitmq-server.docs b/debian/rabbitmq-server.docs
new file mode 100644 (file)
index 0000000..6055402
--- /dev/null
@@ -0,0 +1,2 @@
+deps/rabbit/docs/rabbitmq.config.example
+deps/rabbit/docs/set_rabbitmq_policy.sh.example
old mode 100755 (executable)
new mode 100644 (file)
index e0220b47c3435ef7c8f1f97916b8ddb30e0beed3..f2ca632f1c19e5735e36a9d23e18a5085ca23d54 100644 (file)
@@ -1,4 +1,4 @@
-docs/rabbitmq-env.conf.5
-docs/rabbitmq-plugins.1
-docs/rabbitmq-server.1
-docs/rabbitmqctl.1
+deps/rabbit/docs/rabbitmq-env.conf.5
+deps/rabbit/docs/rabbitmq-plugins.1
+deps/rabbit/docs/rabbitmq-server.1
+deps/rabbit/docs/rabbitmqctl.1
index 90bac921ca1e7d85483b6d4ec8987528591aaf21..1aa6549b64b722e330b1210753f5b2687ed187ef 100644 (file)
@@ -1,10 +1,10 @@
+# systemd unit example
 [Unit]
 Description=RabbitMQ broker
-After=network.target epmd.socket
-Requires=network.target epmd.socket
+After=network.target epmd@0.0.0.0.socket
+Wants=network.target epmd@0.0.0.0.socket
 
 [Service]
-LimitNOFILE=105472
 Type=notify
 User=rabbitmq
 Group=rabbitmq
index b5e42a9fa9628557cd72ec5ab8c7840f3fc3be5a..48510ec8a64ae5d4423e14d081e02d83338f2e37 100755 (executable)
@@ -7,20 +7,14 @@
 DEB_DESTDIR = debian/rabbitmq-server
 VERSION = $(shell dpkg-parsechangelog | awk '/^Version:/ {version=$$0; sub(/Version: /, "", version); sub(/-.*/, "", version); print version;}')
 
+unexport DEPS_DIR
+
 %:
        dh $@ --parallel --with systemd
 
-override_dh_systemd_enable:
-       dh_systemd_enable --no-enable
-
-override_dh_systemd_start:
-       dh_systemd_start --no-start
-
-override_dh_installinit:
-       dh_installinit --noscripts
-
 override_dh_auto_clean:
-       $(MAKE) clean distclean-manpages
+       $(MAKE) clean clean-unpacked-source-dist distclean-manpages
+       rm -rf .erlang.mk
 
 override_dh_auto_build:
        $(MAKE) dist manpages
@@ -34,11 +28,13 @@ override_dh_auto_install: PREFIX = /usr
 override_dh_auto_install: RMQ_ROOTDIR = $(PREFIX)/lib/rabbitmq
 override_dh_auto_install: RMQ_ERLAPP_DIR = $(RMQ_ROOTDIR)/lib/rabbitmq_server-$(VERSION)
 override_dh_auto_install:
-       dh_auto_install
+       dh_auto_install -- VERSION=$(VERSION)
+
+       $(MAKE) install-bin DESTDIR=$(DEB_DESTDIR) VERSION=$(VERSION)
 
-       $(MAKE) install-bin DESTDIR=$(DEB_DESTDIR)
+       sed -e 's|@RABBIT_LIB@|$(RMQ_ERLAPP_DIR)|g' \
+               < debian/postrm.in > debian/postrm
 
-       mkdir -p $(DEB_DESTDIR)$(PREFIX)/sbin
        sed -e 's|@SU_RABBITMQ_SH_C@|su rabbitmq -s /bin/sh -c|' \
                -e 's|@STDOUT_STDERR_REDIRECTION@|> "$$RABBITMQ_LOG_BASE/startup_log" 2> "$$RABBITMQ_LOG_BASE/startup_err"|' \
                < scripts/rabbitmq-script-wrapper \
@@ -56,8 +52,6 @@ override_dh_auto_install:
                $(DEB_DESTDIR)$(PREFIX)/lib/ocf/resource.d/rabbitmq/rabbitmq-server
        install -p -D -m 0755 scripts/rabbitmq-server-ha.ocf \
                $(DEB_DESTDIR)$(PREFIX)/lib/ocf/resource.d/rabbitmq/rabbitmq-server-ha
-       install -p -D -m 0644 docs/set_rabbitmq_policy.sh.example \
-               $(DEB_DESTDIR)$(PREFIX)/lib/ocf/resource.d/rabbitmq/set_rabbitmq_policy.sh.example
 
        rm $(DEB_DESTDIR)$(RMQ_ERLAPP_DIR)/LICENSE* \
                $(DEB_DESTDIR)$(RMQ_ERLAPP_DIR)/INSTALL
index e41153d6127aea21226109334dc2289673df1b2d..b41aff9aedc1003866091af62a3d65c914776e34 100644 (file)
@@ -1,2 +1,4 @@
 version=3
-http://www.rabbitmq.com/releases/rabbitmq-server/v(.*)/rabbitmq-server-(\d.*)\.tar\.gz
+
+http://www.rabbitmq.com/releases/rabbitmq-server/v(.*)/rabbitmq-server-(\d.*)\.tar\.gz \
+       debian uupdate
similarity index 98%
rename from rabbitmq-server/deps/amqp_client/Makefile
rename to deps/amqp_client/Makefile
index daa44befe0762f7284eb8ba86b5141b410430d86..8e7399ffee6154c407fd2d65c846510aab411b6b 100644 (file)
@@ -7,7 +7,8 @@ endif
 # Release artifacts are put in $(PACKAGES_DIR).
 PACKAGES_DIR ?= $(abspath PACKAGES)
 
-TEST_DEPS += rabbit
+DEPS = rabbit_common
+TEST_DEPS = rabbitmq_ct_helpers rabbit
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-build.mk \
              rabbit_common/mk/rabbitmq-dist.mk \
similarity index 97%
rename from rabbitmq-server/deps/rabbitmq_shovel_management/erlang.mk
rename to deps/amqp_client/erlang.mk
index f7ca7bebb76849368b9a6bf56f1bdea9e847604d..6d2a31c974f3a762751bb19a108f2c5ff4abc0ba 100644 (file)
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
 
 ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
 
-ERLANG_MK_VERSION = 2.0.0-pre.2-132-g62d576b
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
 
 # Core configuration.
 
@@ -110,8 +110,8 @@ help::
                "  all           Run deps, app and rel targets in that order" \
                "  app           Compile the project" \
                "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
                "  search q=...  Search for a package in the built-in index" \
                "  rel           Build a release for this project, if applicable" \
                "  docs          Build the documentation for this project" \
@@ -406,14 +406,6 @@ pkg_bootstrap_fetch = git
 pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
 pkg_bootstrap_commit = master
 
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
 PACKAGES += boss_db
 pkg_boss_db_name = boss_db
 pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
@@ -422,6 +414,14 @@ pkg_boss_db_fetch = git
 pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
 pkg_boss_db_commit = master
 
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
 PACKAGES += brod
 pkg_brod_name = brod
 pkg_brod_description = Kafka client in Erlang
@@ -518,6 +518,14 @@ pkg_chronos_fetch = git
 pkg_chronos_repo = https://github.com/lehoff/chronos
 pkg_chronos_commit = master
 
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
 PACKAGES += cl
 pkg_cl_name = cl
 pkg_cl_description = OpenCL binding for Erlang
@@ -558,13 +566,13 @@ pkg_cloudi_service_api_requests_fetch = git
 pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
 pkg_cloudi_service_api_requests_commit = master
 
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
 
 PACKAGES += cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
@@ -574,14 +582,6 @@ pkg_cloudi_service_db_cassandra_fetch = git
 pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_commit = master
 
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
 PACKAGES += cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
@@ -638,6 +638,14 @@ pkg_cloudi_service_db_tokyotyrant_fetch = git
 pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
 pkg_cloudi_service_db_tokyotyrant_commit = master
 
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
 PACKAGES += cloudi_service_filesystem
 pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
 pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
@@ -1030,14 +1038,6 @@ pkg_edown_fetch = git
 pkg_edown_repo = https://github.com/uwiger/edown
 pkg_edown_commit = master
 
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
 PACKAGES += eep_app
 pkg_eep_app_name = eep_app
 pkg_eep_app_description = Embedded Event Processing
@@ -1046,6 +1046,14 @@ pkg_eep_app_fetch = git
 pkg_eep_app_repo = https://github.com/darach/eep-erl
 pkg_eep_app_commit = master
 
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
 PACKAGES += efene
 pkg_efene_name = efene
 pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
@@ -1230,14 +1238,6 @@ pkg_eqm_fetch = git
 pkg_eqm_repo = https://github.com/loucash/eqm
 pkg_eqm_commit = master
 
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
 PACKAGES += eredis_pool
 pkg_eredis_pool_name = eredis_pool
 pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
@@ -1246,6 +1246,14 @@ pkg_eredis_pool_fetch = git
 pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
 pkg_eredis_pool_commit = master
 
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
 PACKAGES += erl_streams
 pkg_erl_streams_name = erl_streams
 pkg_erl_streams_description = Streams in Erlang
@@ -1534,14 +1542,6 @@ pkg_etap_fetch = git
 pkg_etap_repo = https://github.com/ngerakines/etap
 pkg_etap_commit = master
 
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
 PACKAGES += etest_http
 pkg_etest_http_name = etest_http
 pkg_etest_http_description = etest Assertions around HTTP (client-side)
@@ -1550,6 +1550,14 @@ pkg_etest_http_fetch = git
 pkg_etest_http_repo = https://github.com/wooga/etest_http
 pkg_etest_http_commit = master
 
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
 PACKAGES += etoml
 pkg_etoml_name = etoml
 pkg_etoml_description = TOML language erlang parser
@@ -1558,14 +1566,6 @@ pkg_etoml_fetch = git
 pkg_etoml_repo = https://github.com/kalta/etoml
 pkg_etoml_commit = master
 
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
 PACKAGES += eunit_formatters
 pkg_eunit_formatters_name = eunit_formatters
 pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
@@ -1574,6 +1574,14 @@ pkg_eunit_formatters_fetch = git
 pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
 pkg_eunit_formatters_commit = master
 
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
 PACKAGES += euthanasia
 pkg_euthanasia_name = euthanasia
 pkg_euthanasia_description = Merciful killer for your Erlang processes
@@ -1710,14 +1718,6 @@ pkg_fn_fetch = git
 pkg_fn_repo = https://github.com/reiddraper/fn
 pkg_fn_commit = master
 
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
 PACKAGES += folsom_cowboy
 pkg_folsom_cowboy_name = folsom_cowboy
 pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
@@ -1726,6 +1726,14 @@ pkg_folsom_cowboy_fetch = git
 pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
 pkg_folsom_cowboy_commit = master
 
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
 PACKAGES += folsomite
 pkg_folsomite_name = folsomite
 pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
@@ -2086,14 +2094,6 @@ pkg_jesse_fetch = git
 pkg_jesse_repo = https://github.com/for-GET/jesse
 pkg_jesse_commit = master
 
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
 PACKAGES += jiffy_v
 pkg_jiffy_v_name = jiffy_v
 pkg_jiffy_v_description = JSON validation utility
@@ -2102,6 +2102,14 @@ pkg_jiffy_v_fetch = git
 pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
 pkg_jiffy_v_commit = master
 
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
 PACKAGES += jobs
 pkg_jobs_name = jobs
 pkg_jobs_description = a Job scheduler for load regulation
@@ -2118,14 +2126,6 @@ pkg_joxa_fetch = git
 pkg_joxa_repo = https://github.com/joxa/joxa
 pkg_joxa_commit = master
 
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
 PACKAGES += json_rec
 pkg_json_rec_name = json_rec
 pkg_json_rec_description = JSON to erlang record
@@ -2134,6 +2134,14 @@ pkg_json_rec_fetch = git
 pkg_json_rec_repo = https://github.com/justinkirby/json_rec
 pkg_json_rec_commit = master
 
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
 PACKAGES += jsone
 pkg_jsone_name = jsone
 pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
@@ -2174,14 +2182,6 @@ pkg_jsx_fetch = git
 pkg_jsx_repo = https://github.com/talentdeficit/jsx
 pkg_jsx_commit = master
 
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
 PACKAGES += kafka_protocol
 pkg_kafka_protocol_name = kafka_protocol
 pkg_kafka_protocol_description = Kafka protocol Erlang library
@@ -2190,6 +2190,14 @@ pkg_kafka_protocol_fetch = git
 pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
 pkg_kafka_protocol_commit = master
 
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
 PACKAGES += kai
 pkg_kai_name = kai
 pkg_kai_description = DHT storage by Takeshi Inoue
@@ -2286,14 +2294,6 @@ pkg_kvs_fetch = git
 pkg_kvs_repo = https://github.com/synrc/kvs
 pkg_kvs_commit = master
 
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
 PACKAGES += lager_amqp_backend
 pkg_lager_amqp_backend_name = lager_amqp_backend
 pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
@@ -2310,6 +2310,14 @@ pkg_lager_syslog_fetch = git
 pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
 pkg_lager_syslog_commit = master
 
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
 PACKAGES += lambdapad
 pkg_lambdapad_name = lambdapad
 pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
@@ -2566,14 +2574,6 @@ pkg_mixer_fetch = git
 pkg_mixer_repo = https://github.com/chef/mixer
 pkg_mixer_commit = master
 
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
 PACKAGES += mochiweb_xpath
 pkg_mochiweb_xpath_name = mochiweb_xpath
 pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
@@ -2582,6 +2582,14 @@ pkg_mochiweb_xpath_fetch = git
 pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
 pkg_mochiweb_xpath_commit = master
 
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
 PACKAGES += mockgyver
 pkg_mockgyver_name = mockgyver
 pkg_mockgyver_description = A mocking library for Erlang
@@ -3054,14 +3062,6 @@ pkg_quickrand_fetch = git
 pkg_quickrand_repo = https://github.com/okeuday/quickrand
 pkg_quickrand_commit = master
 
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
 PACKAGES += rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
@@ -3070,6 +3070,14 @@ pkg_rabbit_exchange_type_riak_fetch = git
 pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
 pkg_rabbit_exchange_type_riak_commit = master
 
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
 PACKAGES += rack
 pkg_rack_name = rack
 pkg_rack_description = Rack handler for erlang
@@ -3534,14 +3542,6 @@ pkg_stable_fetch = git
 pkg_stable_repo = https://github.com/dvv/stable
 pkg_stable_commit = master
 
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
 PACKAGES += statebox_riak
 pkg_statebox_riak_name = statebox_riak
 pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
@@ -3550,6 +3550,14 @@ pkg_statebox_riak_fetch = git
 pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
 pkg_statebox_riak_commit = master
 
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
 PACKAGES += statman
 pkg_statman_name = statman
 pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
@@ -4131,19 +4139,35 @@ dep_verbose = $(dep_verbose_$(V))
 
 # Core targets.
 
-ifneq ($(SKIP_DEPS),)
-deps::
+ifdef IS_APP
+apps::
 else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               mkdir -p $$dep/ebin; \
+               mkdir -p $$dep/ebin || exit $$?; \
        done
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
        done
 endif
-ifneq ($(IS_DEP),1)
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
        $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
 endif
        $(verbose) mkdir -p $(ERLANG_MK_TMP)
@@ -4672,11 +4696,11 @@ endif
 # Forward-declare variables used in core/deps-tools.mk. This is required
 # in case plugins use them.
 
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
 
 # External plugins.
 
@@ -6112,14 +6136,17 @@ help::
 # Plugin-specific targets.
 
 define filter_opts.erl
-       Opts = binary:split(<<"$1">>, <<"-">>, [global]),
-       Filtered = lists:reverse(lists:foldl(fun
-               (O = <<"pa ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"D ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"I ", _/bits>>, Acc) -> [O|Acc];
-               (_, Acc) -> Acc
-       end, [], Opts)),
-       io:format("~s~n", [[["-", O] || O <- Filtered]]),
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
        halt().
 endef
 
@@ -6136,7 +6163,7 @@ dialyze:
 else
 dialyze: $(DIALYZER_PLT)
 endif
-       $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
@@ -6451,9 +6478,9 @@ endif
 # Configuration.
 
 ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
+       XREFR_ARGS :=
 else
-       XREF_ARGS := -c $(XREF_CONFIG)
+       XREFR_ARGS := -c $(XREF_CONFIG)
 endif
 
 XREFR ?= $(CURDIR)/xrefr
@@ -6605,62 +6632,95 @@ endif
 endif # ifneq ($(COVER_REPORT_DIR),)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
-# Fetch dependencies (without building them).
+# Fetch dependencies recursively (without building them).
 
 .PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
        fetch-shell-deps
 
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
 ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
 else
 # By default, we fetch "normal" dependencies. They are also included no
 # matter the type of requested dependencies.
 #
 # $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
 
 # Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
 # dependencies with a single target.
 ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
 endif
 ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
 endif
 ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
 endif
 ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
 endif
 
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 ifndef IS_APP
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
        done
 endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
        $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
                        if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
                         $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
                        fi \
                fi \
        done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 endif # ifneq ($(SKIP_DEPS),)
 
 # List dependencies recursively.
@@ -6668,108 +6728,11 @@ endif # ifneq ($(SKIP_DEPS),)
 .PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
        list-shell-deps
 
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
 list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
 list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
 list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
 list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
 list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
 
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
 list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
+       $(verbose) cat $^
similarity index 88%
rename from rabbitmq-server/deps/rabbitmq_amqp1_0/rabbitmq-components.mk
rename to deps/amqp_client/rabbitmq-components.mk
index eb9e9e3e030aa3ca626eeabf028b8abe1601733d..05986d82ce9ccb40e04a478f9bfeb242040c9c52 100644 (file)
@@ -5,16 +5,6 @@ ifeq ($(.DEFAULT_GOAL),)
 .DEFAULT_GOAL = all
 endif
 
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
 # --------------------------------------------------------------------
 # RabbitMQ components.
 # --------------------------------------------------------------------
@@ -38,6 +28,7 @@ dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $
 dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
@@ -59,6 +50,7 @@ dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_r
 dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
@@ -98,6 +90,7 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_clusterer \
                      rabbitmq_codegen \
                      rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
                      rabbitmq_delayed_message_exchange \
                      rabbitmq_dotnet_client \
                      rabbitmq_event_exchange \
@@ -119,11 +112,11 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_recent_history_exchange \
                      rabbitmq_routing_node_stamp \
                      rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
                      rabbitmq_sharding \
                      rabbitmq_shovel \
                      rabbitmq_shovel_management \
                      rabbitmq_stomp \
-                     rabbitmq_test \
                      rabbitmq_toke \
                      rabbitmq_top \
                      rabbitmq_tracing \
@@ -246,59 +239,10 @@ list-dist-deps::
 prepare-dist::
        @:
 
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
 # --------------------------------------------------------------------
 # rabbitmq-components.mk checks.
 # --------------------------------------------------------------------
 
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
 # If this project is under the Umbrella project, we override $(DEPS_DIR)
 # to point to the Umbrella's one. We also disable `make distclean` so
 # $(DEPS_DIR) is not accidentally removed.
@@ -312,11 +256,6 @@ endif
 ifeq ($(UNDER_UMBRELLA),1)
 ifneq ($(PROJECT),rabbitmq_public_umbrella)
 DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
 endif
 
 ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
similarity index 93%
rename from rabbitmq-server/deps/amqp_client/src/amqp_client.app.src
rename to deps/amqp_client/src/amqp_client.app.src
index 8d1450107fa416eaa644b96bf06ff8d4c39b55c8..959e58c2ac1f8c4fcffa2d7bbd13da4ffbd36c61 100644 (file)
@@ -1,6 +1,6 @@
 {application, amqp_client,
  [{description, "RabbitMQ AMQP Client"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, [amqp_sup]},
   {env, [{prefer_ipv6, false},
similarity index 99%
rename from rabbitmq-server/deps/amqp_client/src/amqp_network_connection.erl
rename to deps/amqp_client/src/amqp_network_connection.erl
index 91f2f8914342014150afc0a497f5baf37b438ca5..c08e9dbe4f1dd1d56c5be5a4bf515cee1cafcfc0 100644 (file)
@@ -149,7 +149,7 @@ do_connect({Addr, Family},
                           orddict:merge(fun (_, _A, B) -> B end,
                                         orddict:from_list(GlobalSslOpts),
                                         orddict:from_list(SslOpts0)))),
-            case ssl:connect(Sock, SslOpts) of
+            case ssl:connect(Sock, SslOpts, Timeout) of
                 {ok, SslSock} ->
                     try_handshake(AmqpParams, SIF,
                                   State#state{sock = SslSock});
diff --git a/deps/licensing/LICENSE-MIT-Erlware-Commons b/deps/licensing/LICENSE-MIT-Erlware-Commons
new file mode 100644 (file)
index 0000000..fc89c02
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2011 Erlware, LLC
+
+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.
+
diff --git a/deps/mochiweb/LICENSE b/deps/mochiweb/LICENSE
new file mode 100644 (file)
index 0000000..c85b65a
--- /dev/null
@@ -0,0 +1,9 @@
+This is the MIT license.
+
+Copyright (c) 2007 Mochi Media, Inc.
+
+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.
similarity index 100%
rename from rabbitmq-server/INSTALL
rename to deps/rabbit/INSTALL
diff --git a/deps/rabbit/LICENSE b/deps/rabbit/LICENSE
new file mode 100644 (file)
index 0000000..9feecea
--- /dev/null
@@ -0,0 +1,8 @@
+This package, the RabbitMQ server is licensed under the MPL. For the
+MPL, please see LICENSE-MPL-RabbitMQ.
+
+The files `mochijson2.erl' and `mochinum.erl' are (c) 2007 Mochi Media, Inc and
+licensed under a MIT license, see LICENSE-MIT-Mochi.
+
+If you have any questions regarding licensing, please contact us at
+info@rabbitmq.com.
diff --git a/deps/rabbit/LICENSE-MIT-Mochi b/deps/rabbit/LICENSE-MIT-Mochi
new file mode 100644 (file)
index 0000000..c85b65a
--- /dev/null
@@ -0,0 +1,9 @@
+This is the MIT license.
+
+Copyright (c) 2007 Mochi Media, Inc.
+
+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.
diff --git a/deps/rabbit/LICENSE-MPL-RabbitMQ b/deps/rabbit/LICENSE-MPL-RabbitMQ
new file mode 100644 (file)
index 0000000..82c7cf5
--- /dev/null
@@ -0,0 +1,455 @@
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (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.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is RabbitMQ.
+
+     The Initial Developer of the Original Code is Pivotal Software, Inc.
+     Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.''
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
diff --git a/deps/rabbit/Makefile b/deps/rabbit/Makefile
new file mode 100644 (file)
index 0000000..d1ffa56
--- /dev/null
@@ -0,0 +1,118 @@
+PROJECT = rabbit
+VERSION ?= $(call get_app_version,src/$(PROJECT).app.src)
+
+DEPS = ranch rabbit_common
+TEST_DEPS = rabbitmq_ct_helpers amqp_client meck proper
+
+define usage_xml_to_erl
+$(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, src/rabbit_%_usage.erl, $(subst -,_,$(1))))
+endef
+
+DOCS_DIR     = docs
+MANPAGES     = $(patsubst %.xml, %, $(wildcard $(DOCS_DIR)/*.[0-9].xml))
+WEB_MANPAGES = $(patsubst %.xml, %.man.xml, $(wildcard $(DOCS_DIR)/*.[0-9].xml) $(DOCS_DIR)/rabbitmq-service.xml $(DOCS_DIR)/rabbitmq-echopid.xml)
+USAGES_XML   = $(DOCS_DIR)/rabbitmqctl.1.xml $(DOCS_DIR)/rabbitmq-plugins.1.xml
+USAGES_ERL   = $(foreach XML, $(USAGES_XML), $(call usage_xml_to_erl, $(XML)))
+
+EXTRA_SOURCES += $(USAGES_ERL)
+
+.DEFAULT_GOAL = all
+$(PROJECT).d:: $(EXTRA_SOURCES)
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-build.mk \
+             rabbit_common/mk/rabbitmq-run.mk \
+             rabbit_common/mk/rabbitmq-dist.mk \
+             rabbit_common/mk/rabbitmq-tools.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
+
+include rabbitmq-components.mk
+include erlang.mk
+
+# --------------------------------------------------------------------
+# Compilation.
+# --------------------------------------------------------------------
+
+RMQ_ERLC_OPTS += -I $(DEPS_DIR)/rabbit_common/include
+
+ifdef INSTRUMENT_FOR_QC
+RMQ_ERLC_OPTS += -DINSTR_MOD=gm_qc
+else
+RMQ_ERLC_OPTS += -DINSTR_MOD=gm
+endif
+
+ifdef CREDIT_FLOW_TRACING
+RMQ_ERLC_OPTS += -DCREDIT_FLOW_TRACING=true
+endif
+
+ifndef USE_PROPER_QC
+# PropEr needs to be installed for property checking
+# http://proper.softlab.ntua.gr/
+USE_PROPER_QC := $(shell $(ERL) -eval 'io:format({module, proper} =:= code:ensure_loaded(proper)), halt().')
+RMQ_ERLC_OPTS += $(if $(filter true,$(USE_PROPER_QC)),-Duse_proper_qc)
+endif
+
+clean:: clean-extra-sources
+
+clean-extra-sources:
+       $(gen_verbose) rm -f $(EXTRA_SOURCES)
+
+# --------------------------------------------------------------------
+# Documentation.
+# --------------------------------------------------------------------
+
+# xmlto can not read from standard input, so we mess with a tmp file.
+%: %.xml $(DOCS_DIR)/examples-to-end.xsl
+       $(gen_verbose) xmlto --version | \
+           grep -E '^xmlto version 0\.0\.([0-9]|1[1-8])$$' >/dev/null || \
+           opt='--stringparam man.indent.verbatims=0' ; \
+       xsltproc --novalid $(DOCS_DIR)/examples-to-end.xsl $< > $<.tmp && \
+       xmlto -vv -o $(DOCS_DIR) $$opt man $< 2>&1 | (grep -v '^Note: Writing' || :) && \
+       test -f $@ && \
+       rm $<.tmp
+
+# Use tmp files rather than a pipeline so that we get meaningful errors
+# Do not fold the cp into previous line, it's there to stop the file being
+# generated but empty if we fail
+define usage_dep
+$(call usage_xml_to_erl, $(1)):: $(1) $(DOCS_DIR)/usage.xsl
+       $$(gen_verbose) xsltproc --novalid --stringparam modulename "`basename $$@ .erl`" \
+           $(DOCS_DIR)/usage.xsl $$< > $$@.tmp && \
+       sed -e 's/"/\\"/g' -e 's/%QUOTE%/"/g' $$@.tmp > $$@.tmp2 && \
+       fold -s $$@.tmp2 > $$@.tmp3 && \
+       mv $$@.tmp3 $$@ && \
+       rm $$@.tmp $$@.tmp2
+endef
+
+$(foreach XML,$(USAGES_XML),$(eval $(call usage_dep, $(XML))))
+
+# We rename the file before xmlto sees it since xmlto will use the name of
+# the file to make internal links.
+%.man.xml: %.xml $(DOCS_DIR)/html-to-website-xml.xsl
+       $(gen_verbose) cp $< `basename $< .xml`.xml && \
+           xmlto xhtml-nochunks `basename $< .xml`.xml ; \
+       rm `basename $< .xml`.xml && \
+       cat `basename $< .xml`.html | \
+           xsltproc --novalid $(DOCS_DIR)/remove-namespaces.xsl - | \
+             xsltproc --novalid --stringparam original `basename $<` $(DOCS_DIR)/html-to-website-xml.xsl - | \
+             xmllint --format - > $@ && \
+       rm `basename $< .xml`.html
+
+.PHONY: manpages web-manpages distclean-manpages
+
+docs:: manpages web-manpages
+
+manpages: $(MANPAGES)
+       @:
+
+web-manpages: $(WEB_MANPAGES)
+       @:
+
+distclean:: distclean-manpages
+
+distclean-manpages::
+       $(gen_verbose) rm -f $(MANPAGES) $(WEB_MANPAGES)
similarity index 100%
rename from rabbitmq-server/README
rename to deps/rabbit/README
similarity index 74%
rename from rabbitmq-server/README.md
rename to deps/rabbit/README.md
index ae6f9b2d014294ccaeda35f528c49a970a4a2b6e..ae8fd80484fe64916951c39574a4ee77fd95b2c6 100644 (file)
@@ -17,8 +17,9 @@
 
  * [RabbitMQ tutorials](http://www.rabbitmq.com/getstarted.html)
  * [Documentation guides](http://www.rabbitmq.com/documentation.html)
+ * [Documentation Source Code](https://github.com/rabbitmq/rabbitmq-website/)
  * [Client libraries and tools](http://www.rabbitmq.com/devtools.html)
-
+ * [Tutorials Source Code](https://github.com/rabbitmq/rabbitmq-tutorials/)
 
 ## Getting Help
 
@@ -37,9 +38,10 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) and our [development process overview](
 RabbitMQ server is [licensed under the MPL](LICENSE-MPL-RabbitMQ).
 
 
-## Building From Source
+## Building From Source and Packaging
 
-See [building RabbitMQ server from source](http://www.rabbitmq.com/build-server.html).
+ * [Building RabbitMQ Server From Source](http://www.rabbitmq.com/build-server.html)
+ * [Building RabbitMQ Server Packages](http://www.rabbitmq.com/build-server.html)
 
 
 ## Copyright
similarity index 96%
rename from rabbitmq-server/docs/rabbitmq.config.example
rename to deps/rabbit/docs/rabbitmq.config.example
index f7477abe61edc930a48e899f449465f1ad2c5441..f425726721cc11ee0a254dc02cdfe933b74bc5fd 100644 (file)
    %%
    %% {password_hashing_module, rabbit_password_hashing_sha256},
 
+   %% Configuration entry encryption.
+   %% See http://www.rabbitmq.com/configure.html#configuration-encryption
+   %%
+   %% To specify the passphrase in the configuration file:
+   %%
+   %% {config_entry_decoder, [{passphrase, <<"mypassphrase">>}]}
+   %%
+   %% To specify the passphrase in an external file:
+   %%
+   %% {config_entry_decoder, [{passphrase, {file, "/path/to/passphrase/file"}}]}
+   %%
+   %% To make the broker request the passphrase when it starts:
+   %%
+   %% {config_entry_decoder, [{passphrase, prompt}]}
+   %%
+   %% To change encryption settings:
+   %%
+   %% {config_entry_decoder, [{cipher,     aes_cbc256},
+   %%                         {hash,       sha512},
+   %%                         {iterations, 1000}]}
+
    %%
    %% Default User / VHost
    %% ====================
 
    %% Set the default AMQP heartbeat delay (in seconds).
    %%
-   %% {heartbeat, 600},
+   %% {heartbeat, 60},
 
    %% Set the max permissible size of an AMQP frame (in bytes).
    %%
similarity index 94%
rename from rabbitmq-server/docs/rabbitmqctl.1.xml
rename to deps/rabbit/docs/rabbitmqctl.1.xml
index ec864af6cf9f6183001f3cda807cca73e8851c5f..217d2d93ca1fe064deeee0a9b47ba4787c6c3cff 100644 (file)
 
         <varlistentry>
           <term>
-          <cmdsynopsis>
-            <command>authenticate_user</command> <arg choice="req"><replaceable>username</replaceable></arg> <arg choice="req"><replaceable>password</replaceable></arg>
-          </cmdsynopsis>
+          <cmdsynopsis><command>authenticate_user</command> <arg choice="req"><replaceable>username</replaceable></arg> <arg choice="req"><replaceable>password</replaceable></arg></cmdsynopsis>
           </term>
           <listitem>
             <variablelist>
 
       <variablelist>
         <varlistentry role="usage-has-option-list">
-          <term><cmdsynopsis><command>list_queues</command> <arg choice="opt">-p <replaceable>vhost</replaceable></arg> <arg choice="opt" role="usage-option-list"><replaceable>queueinfoitem</replaceable> ...</arg></cmdsynopsis></term>
+          <term>
+            <cmdsynopsis><command>list_queues</command> <arg choice="opt">-p <replaceable>vhost</replaceable></arg> <group choice="opt"><arg>--offline</arg><arg>--online</arg><arg>--local</arg></group> <arg choice="opt" role="usage-option-list"><replaceable>queueinfoitem</replaceable> ...</arg></cmdsynopsis>
+          </term>
           <listitem>
             <para>
               Returns queue details. Queue details of the <command>/</command> virtual host
               are returned if the "-p" flag is absent. The "-p" flag can be used to
               override this default.
             </para>
+            <para>
+              Displayed queues can be filtered by their status or
+              location using one of the following mutually exclusive
+              options:
+              <variablelist>
+                <varlistentry>
+                  <term><cmdsynopsis><arg choice="opt">--offline</arg></cmdsynopsis></term>
+                  <listitem>
+                    <para>
+                      List only those durable queues that are not
+                      currently available (more specifically, their master node isn't).
+                    </para>
+                  </listitem>
+                </varlistentry>
+                <varlistentry>
+                  <term><cmdsynopsis><arg choice="opt">--online</arg></cmdsynopsis></term>
+                  <listitem>
+                    <para>
+                      List queues that are currently available (their master node is).
+                    </para>
+                  </listitem>
+                </varlistentry>
+                <varlistentry>
+                  <term><cmdsynopsis><arg choice="opt">--local</arg></cmdsynopsis></term>
+                  <listitem>
+                    <para>
+                      List only those queues whose master process is
+                      located on the current node.
+                    </para>
+                  </listitem>
+                </varlistentry>
+              </variablelist>
+            </para>
             <para>
               The <command>queueinfoitem</command> parameter is used to indicate which queue
               information items to include in the results. The column order in the
             </variablelist>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <!-- one-line formatting matters for rabbit_ctl_usage.erl code generation -->
+          <term><cmdsynopsis><command>encode</command> <arg choice="opt">--decode</arg> <arg choice="opt"><replaceable>value</replaceable></arg> <arg choice="opt"><replaceable>passphrase</replaceable></arg> <arg choice="opt">--list-ciphers</arg> <arg choice="opt">--list-hashes</arg> <arg choice="opt">--cipher <replaceable>cipher</replaceable></arg> <arg choice="opt">--hash <replaceable>hash</replaceable></arg> <arg choice="opt">--iterations <replaceable>iterations</replaceable></arg></cmdsynopsis>
+          </term>
+          <listitem>
+            <variablelist>
+              <varlistentry>
+                <term><cmdsynopsis><arg choice="opt">--decode</arg></cmdsynopsis></term>
+                <listitem>
+                  <para>
+                  Flag to decrypt the input value.
+                  </para>
+                  <para role="example-prefix">For example:</para>
+                  <screen role="example">rabbitmqctl encode --decode '{encrypted,'&lt;&lt;"..."&gt;&gt;}' mypassphrase</screen>
+                </listitem>
+              </varlistentry>
+              <varlistentry>
+                <term>
+                  <cmdsynopsis>
+                    <arg choice="opt"><replaceable>value</replaceable></arg>
+                    <arg choice="opt"><replaceable>passphrase</replaceable></arg>
+                  </cmdsynopsis>
+                </term>
+                <listitem>
+                  <para>
+                    Value to encrypt/decrypt and passphrase.
+                  </para>
+                  <para role="example-prefix">For example:</para>
+                  <screen role="example">rabbitmqctl encode '&lt;&lt;"guest"&gt;&gt;' mypassphrase</screen>
+                  <screen role="example">rabbitmqctl encode --decode '{encrypted,'&lt;&lt;"..."&gt;&gt;}' mypassphrase</screen>
+                </listitem>
+              </varlistentry>
+              <varlistentry>
+                <term><cmdsynopsis><arg choice="opt">--list-ciphers</arg></cmdsynopsis></term>
+                <listitem>
+                  <para>
+                    Flag to list the supported ciphers.
+                  </para>
+                  <para role="example-prefix">For example:</para>
+                  <screen role="example">rabbitmqctl encode --list-ciphers</screen>
+                </listitem>
+              </varlistentry>
+              <varlistentry>
+                <term><cmdsynopsis><arg choice="opt">--list-hashes</arg></cmdsynopsis></term>
+                <listitem>
+                  <para>
+                    Flag to list the supported hash algorithms.
+                  </para>
+                  <para role="example-prefix">For example:</para>
+                  <screen role="example">rabbitmqctl encode --list-hashes</screen>
+                </listitem>
+              </varlistentry>
+              <varlistentry>
+                <term>
+                  <cmdsynopsis>
+                    <arg choice="opt">--cipher <replaceable>cipher</replaceable></arg>
+                    <arg choice="opt">--hash <replaceable>hash</replaceable></arg>
+                    <arg choice="opt">--iterations <replaceable>iterations</replaceable></arg>
+                  </cmdsynopsis>
+                </term>
+                <listitem>
+                  <para>
+                    Options to specify the encryption settings. They can be used independently.
+                  </para>
+                  <para role="example-prefix">For example:</para>
+                  <screen role="example">
+rabbitmqctl encode --cipher blowfish_cfb64 --hash sha256 --iterations 10000 \
+                   '&lt;&lt;"guest"&gt;&gt;' mypassphrase</screen>
+                </listitem>
+              </varlistentry>
+            </variablelist>
+          </listitem>
+        </varlistentry>
       </variablelist>
     </refsect2>
   </refsect1>
similarity index 90%
rename from rabbitmq-server/docs/usage.xsl
rename to deps/rabbit/docs/usage.xsl
index 586f830327e2b46f4558e64d1802b9805850805a..0d3cb6f235c4ffaedbc79455b139cc7190a3c62f 100644 (file)
@@ -8,7 +8,7 @@
               encoding="UTF-8"
               indent="no"/>
 <xsl:strip-space elements="*"/>
-<xsl:preserve-space elements="cmdsynopsis arg" />
+<xsl:preserve-space elements="cmdsynopsis arg group" />
 
 <xsl:template match="/">
 <!-- Pull out cmdsynopsis to show the command usage line. -->%% Generated, do not edit!
@@ -68,6 +68,14 @@ usage() -> %QUOTE%Usage:
 <!-- Don't show anything else in command usage -->
 <xsl:template match="text()" mode="command-usage"/>
 
+<xsl:template match="group[@choice='opt']">
+  <xsl:text>[</xsl:text>
+  <xsl:for-each select="arg">
+    <xsl:apply-templates/>
+    <xsl:if test="not(position() = last())"><xsl:text>|</xsl:text></xsl:if>
+  </xsl:for-each>
+  <xsl:text>]</xsl:text>
+</xsl:template>
 <xsl:template match="arg[@choice='opt']">[<xsl:apply-templates/>]</xsl:template>
 <xsl:template match="replaceable">&lt;<xsl:value-of select="."/>&gt;</xsl:template>
 
similarity index 97%
rename from rabbitmq-server/deps/rabbitmq_federation/erlang.mk
rename to deps/rabbit/erlang.mk
index f7ca7bebb76849368b9a6bf56f1bdea9e847604d..6d2a31c974f3a762751bb19a108f2c5ff4abc0ba 100644 (file)
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
 
 ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
 
-ERLANG_MK_VERSION = 2.0.0-pre.2-132-g62d576b
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
 
 # Core configuration.
 
@@ -110,8 +110,8 @@ help::
                "  all           Run deps, app and rel targets in that order" \
                "  app           Compile the project" \
                "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
                "  search q=...  Search for a package in the built-in index" \
                "  rel           Build a release for this project, if applicable" \
                "  docs          Build the documentation for this project" \
@@ -406,14 +406,6 @@ pkg_bootstrap_fetch = git
 pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
 pkg_bootstrap_commit = master
 
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
 PACKAGES += boss_db
 pkg_boss_db_name = boss_db
 pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
@@ -422,6 +414,14 @@ pkg_boss_db_fetch = git
 pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
 pkg_boss_db_commit = master
 
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
 PACKAGES += brod
 pkg_brod_name = brod
 pkg_brod_description = Kafka client in Erlang
@@ -518,6 +518,14 @@ pkg_chronos_fetch = git
 pkg_chronos_repo = https://github.com/lehoff/chronos
 pkg_chronos_commit = master
 
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
 PACKAGES += cl
 pkg_cl_name = cl
 pkg_cl_description = OpenCL binding for Erlang
@@ -558,13 +566,13 @@ pkg_cloudi_service_api_requests_fetch = git
 pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
 pkg_cloudi_service_api_requests_commit = master
 
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
 
 PACKAGES += cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
@@ -574,14 +582,6 @@ pkg_cloudi_service_db_cassandra_fetch = git
 pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_commit = master
 
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
 PACKAGES += cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
@@ -638,6 +638,14 @@ pkg_cloudi_service_db_tokyotyrant_fetch = git
 pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
 pkg_cloudi_service_db_tokyotyrant_commit = master
 
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
 PACKAGES += cloudi_service_filesystem
 pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
 pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
@@ -1030,14 +1038,6 @@ pkg_edown_fetch = git
 pkg_edown_repo = https://github.com/uwiger/edown
 pkg_edown_commit = master
 
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
 PACKAGES += eep_app
 pkg_eep_app_name = eep_app
 pkg_eep_app_description = Embedded Event Processing
@@ -1046,6 +1046,14 @@ pkg_eep_app_fetch = git
 pkg_eep_app_repo = https://github.com/darach/eep-erl
 pkg_eep_app_commit = master
 
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
 PACKAGES += efene
 pkg_efene_name = efene
 pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
@@ -1230,14 +1238,6 @@ pkg_eqm_fetch = git
 pkg_eqm_repo = https://github.com/loucash/eqm
 pkg_eqm_commit = master
 
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
 PACKAGES += eredis_pool
 pkg_eredis_pool_name = eredis_pool
 pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
@@ -1246,6 +1246,14 @@ pkg_eredis_pool_fetch = git
 pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
 pkg_eredis_pool_commit = master
 
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
 PACKAGES += erl_streams
 pkg_erl_streams_name = erl_streams
 pkg_erl_streams_description = Streams in Erlang
@@ -1534,14 +1542,6 @@ pkg_etap_fetch = git
 pkg_etap_repo = https://github.com/ngerakines/etap
 pkg_etap_commit = master
 
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
 PACKAGES += etest_http
 pkg_etest_http_name = etest_http
 pkg_etest_http_description = etest Assertions around HTTP (client-side)
@@ -1550,6 +1550,14 @@ pkg_etest_http_fetch = git
 pkg_etest_http_repo = https://github.com/wooga/etest_http
 pkg_etest_http_commit = master
 
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
 PACKAGES += etoml
 pkg_etoml_name = etoml
 pkg_etoml_description = TOML language erlang parser
@@ -1558,14 +1566,6 @@ pkg_etoml_fetch = git
 pkg_etoml_repo = https://github.com/kalta/etoml
 pkg_etoml_commit = master
 
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
 PACKAGES += eunit_formatters
 pkg_eunit_formatters_name = eunit_formatters
 pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
@@ -1574,6 +1574,14 @@ pkg_eunit_formatters_fetch = git
 pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
 pkg_eunit_formatters_commit = master
 
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
 PACKAGES += euthanasia
 pkg_euthanasia_name = euthanasia
 pkg_euthanasia_description = Merciful killer for your Erlang processes
@@ -1710,14 +1718,6 @@ pkg_fn_fetch = git
 pkg_fn_repo = https://github.com/reiddraper/fn
 pkg_fn_commit = master
 
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
 PACKAGES += folsom_cowboy
 pkg_folsom_cowboy_name = folsom_cowboy
 pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
@@ -1726,6 +1726,14 @@ pkg_folsom_cowboy_fetch = git
 pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
 pkg_folsom_cowboy_commit = master
 
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
 PACKAGES += folsomite
 pkg_folsomite_name = folsomite
 pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
@@ -2086,14 +2094,6 @@ pkg_jesse_fetch = git
 pkg_jesse_repo = https://github.com/for-GET/jesse
 pkg_jesse_commit = master
 
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
 PACKAGES += jiffy_v
 pkg_jiffy_v_name = jiffy_v
 pkg_jiffy_v_description = JSON validation utility
@@ -2102,6 +2102,14 @@ pkg_jiffy_v_fetch = git
 pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
 pkg_jiffy_v_commit = master
 
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
 PACKAGES += jobs
 pkg_jobs_name = jobs
 pkg_jobs_description = a Job scheduler for load regulation
@@ -2118,14 +2126,6 @@ pkg_joxa_fetch = git
 pkg_joxa_repo = https://github.com/joxa/joxa
 pkg_joxa_commit = master
 
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
 PACKAGES += json_rec
 pkg_json_rec_name = json_rec
 pkg_json_rec_description = JSON to erlang record
@@ -2134,6 +2134,14 @@ pkg_json_rec_fetch = git
 pkg_json_rec_repo = https://github.com/justinkirby/json_rec
 pkg_json_rec_commit = master
 
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
 PACKAGES += jsone
 pkg_jsone_name = jsone
 pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
@@ -2174,14 +2182,6 @@ pkg_jsx_fetch = git
 pkg_jsx_repo = https://github.com/talentdeficit/jsx
 pkg_jsx_commit = master
 
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
 PACKAGES += kafka_protocol
 pkg_kafka_protocol_name = kafka_protocol
 pkg_kafka_protocol_description = Kafka protocol Erlang library
@@ -2190,6 +2190,14 @@ pkg_kafka_protocol_fetch = git
 pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
 pkg_kafka_protocol_commit = master
 
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
 PACKAGES += kai
 pkg_kai_name = kai
 pkg_kai_description = DHT storage by Takeshi Inoue
@@ -2286,14 +2294,6 @@ pkg_kvs_fetch = git
 pkg_kvs_repo = https://github.com/synrc/kvs
 pkg_kvs_commit = master
 
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
 PACKAGES += lager_amqp_backend
 pkg_lager_amqp_backend_name = lager_amqp_backend
 pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
@@ -2310,6 +2310,14 @@ pkg_lager_syslog_fetch = git
 pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
 pkg_lager_syslog_commit = master
 
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
 PACKAGES += lambdapad
 pkg_lambdapad_name = lambdapad
 pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
@@ -2566,14 +2574,6 @@ pkg_mixer_fetch = git
 pkg_mixer_repo = https://github.com/chef/mixer
 pkg_mixer_commit = master
 
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
 PACKAGES += mochiweb_xpath
 pkg_mochiweb_xpath_name = mochiweb_xpath
 pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
@@ -2582,6 +2582,14 @@ pkg_mochiweb_xpath_fetch = git
 pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
 pkg_mochiweb_xpath_commit = master
 
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
 PACKAGES += mockgyver
 pkg_mockgyver_name = mockgyver
 pkg_mockgyver_description = A mocking library for Erlang
@@ -3054,14 +3062,6 @@ pkg_quickrand_fetch = git
 pkg_quickrand_repo = https://github.com/okeuday/quickrand
 pkg_quickrand_commit = master
 
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
 PACKAGES += rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
@@ -3070,6 +3070,14 @@ pkg_rabbit_exchange_type_riak_fetch = git
 pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
 pkg_rabbit_exchange_type_riak_commit = master
 
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
 PACKAGES += rack
 pkg_rack_name = rack
 pkg_rack_description = Rack handler for erlang
@@ -3534,14 +3542,6 @@ pkg_stable_fetch = git
 pkg_stable_repo = https://github.com/dvv/stable
 pkg_stable_commit = master
 
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
 PACKAGES += statebox_riak
 pkg_statebox_riak_name = statebox_riak
 pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
@@ -3550,6 +3550,14 @@ pkg_statebox_riak_fetch = git
 pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
 pkg_statebox_riak_commit = master
 
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
 PACKAGES += statman
 pkg_statman_name = statman
 pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
@@ -4131,19 +4139,35 @@ dep_verbose = $(dep_verbose_$(V))
 
 # Core targets.
 
-ifneq ($(SKIP_DEPS),)
-deps::
+ifdef IS_APP
+apps::
 else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               mkdir -p $$dep/ebin; \
+               mkdir -p $$dep/ebin || exit $$?; \
        done
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
        done
 endif
-ifneq ($(IS_DEP),1)
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
        $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
 endif
        $(verbose) mkdir -p $(ERLANG_MK_TMP)
@@ -4672,11 +4696,11 @@ endif
 # Forward-declare variables used in core/deps-tools.mk. This is required
 # in case plugins use them.
 
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
 
 # External plugins.
 
@@ -6112,14 +6136,17 @@ help::
 # Plugin-specific targets.
 
 define filter_opts.erl
-       Opts = binary:split(<<"$1">>, <<"-">>, [global]),
-       Filtered = lists:reverse(lists:foldl(fun
-               (O = <<"pa ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"D ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"I ", _/bits>>, Acc) -> [O|Acc];
-               (_, Acc) -> Acc
-       end, [], Opts)),
-       io:format("~s~n", [[["-", O] || O <- Filtered]]),
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
        halt().
 endef
 
@@ -6136,7 +6163,7 @@ dialyze:
 else
 dialyze: $(DIALYZER_PLT)
 endif
-       $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
@@ -6451,9 +6478,9 @@ endif
 # Configuration.
 
 ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
+       XREFR_ARGS :=
 else
-       XREF_ARGS := -c $(XREF_CONFIG)
+       XREFR_ARGS := -c $(XREF_CONFIG)
 endif
 
 XREFR ?= $(CURDIR)/xrefr
@@ -6605,62 +6632,95 @@ endif
 endif # ifneq ($(COVER_REPORT_DIR),)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
-# Fetch dependencies (without building them).
+# Fetch dependencies recursively (without building them).
 
 .PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
        fetch-shell-deps
 
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
 ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
 else
 # By default, we fetch "normal" dependencies. They are also included no
 # matter the type of requested dependencies.
 #
 # $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
 
 # Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
 # dependencies with a single target.
 ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
 endif
 ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
 endif
 ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
 endif
 ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
 endif
 
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 ifndef IS_APP
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
        done
 endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
        $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
                        if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
                         $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
                        fi \
                fi \
        done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 endif # ifneq ($(SKIP_DEPS),)
 
 # List dependencies recursively.
@@ -6668,108 +6728,11 @@ endif # ifneq ($(SKIP_DEPS),)
 .PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
        list-shell-deps
 
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
 list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
 list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
 list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
 list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
 list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
 
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
 list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
+       $(verbose) cat $^
similarity index 76%
rename from rabbitmq-server/include/rabbit_cli.hrl
rename to deps/rabbit/include/rabbit_cli.hrl
index a0d1ecfdd5192873463c081bd8252a8c98dd40a6..53be9fcda07626d009754db2d9592522d79ae8ec 100644 (file)
 -define(RAM_OPT, "--ram").
 -define(OFFLINE_OPT, "--offline").
 -define(ONLINE_OPT, "--online").
+-define(LOCAL_OPT, "--local").
 
+-define(DECODE_OPT, "--decode").
+-define(CIPHER_OPT, "--cipher").
+-define(HASH_OPT, "--hash").
+-define(ITERATIONS_OPT, "--iterations").
+-define(LIST_CIPHERS_OPT, "--list-ciphers").
+-define(LIST_HASHES_OPT, "--list-hashes").
 
 -define(NODE_DEF(Node), {?NODE_OPT, {option, Node}}).
 -define(QUIET_DEF, {?QUIET_OPT, flag}).
 -define(RAM_DEF, {?RAM_OPT, flag}).
 -define(OFFLINE_DEF, {?OFFLINE_OPT, flag}).
 -define(ONLINE_DEF, {?ONLINE_OPT, flag}).
+-define(LOCAL_DEF, {?LOCAL_OPT, flag}).
+-define(DECODE_DEF, {?DECODE_OPT, flag}).
+-define(CIPHER_DEF, {?CIPHER_OPT, {option, atom_to_list(rabbit_pbe:default_cipher())}}).
+-define(HASH_DEF, {?HASH_OPT, {option, atom_to_list(rabbit_pbe:default_hash())}}).
+-define(ITERATIONS_DEF, {?ITERATIONS_OPT, {option, integer_to_list(rabbit_pbe:default_iterations())}}).
+-define(LIST_CIPHERS_DEF, {?LIST_CIPHERS_OPT, flag}).
+-define(LIST_HASHES_DEF, {?LIST_HASHES_OPT, flag}).
+
 
 %% Subset of standartized exit codes from sysexits.h, see
 %% https://github.com/rabbitmq/rabbitmq-server/issues/396 for discussion.
similarity index 88%
rename from rabbitmq-server/deps/amqp_client/rabbitmq-components.mk
rename to deps/rabbit/rabbitmq-components.mk
index eb9e9e3e030aa3ca626eeabf028b8abe1601733d..05986d82ce9ccb40e04a478f9bfeb242040c9c52 100644 (file)
@@ -5,16 +5,6 @@ ifeq ($(.DEFAULT_GOAL),)
 .DEFAULT_GOAL = all
 endif
 
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
 # --------------------------------------------------------------------
 # RabbitMQ components.
 # --------------------------------------------------------------------
@@ -38,6 +28,7 @@ dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $
 dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
@@ -59,6 +50,7 @@ dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_r
 dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
@@ -98,6 +90,7 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_clusterer \
                      rabbitmq_codegen \
                      rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
                      rabbitmq_delayed_message_exchange \
                      rabbitmq_dotnet_client \
                      rabbitmq_event_exchange \
@@ -119,11 +112,11 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_recent_history_exchange \
                      rabbitmq_routing_node_stamp \
                      rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
                      rabbitmq_sharding \
                      rabbitmq_shovel \
                      rabbitmq_shovel_management \
                      rabbitmq_stomp \
-                     rabbitmq_test \
                      rabbitmq_toke \
                      rabbitmq_top \
                      rabbitmq_tracing \
@@ -246,59 +239,10 @@ list-dist-deps::
 prepare-dist::
        @:
 
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
 # --------------------------------------------------------------------
 # rabbitmq-components.mk checks.
 # --------------------------------------------------------------------
 
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
 # If this project is under the Umbrella project, we override $(DEPS_DIR)
 # to point to the Umbrella's one. We also disable `make distclean` so
 # $(DEPS_DIR) is not accidentally removed.
@@ -312,11 +256,6 @@ endif
 ifeq ($(UNDER_UMBRELLA),1)
 ifneq ($(PROJECT),rabbitmq_public_umbrella)
 DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
 endif
 
 ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
similarity index 96%
rename from rabbitmq-server/scripts/rabbitmq-env
rename to deps/rabbit/scripts/rabbitmq-env
index 0fa164cfe147782e0ffc2926f20db8d018932267..8c33e7c0b7ddfadb50d44204e8ea5ccccddf762e 100755 (executable)
@@ -65,8 +65,11 @@ RABBITMQ_HOME="$(rmq_realpath "${RABBITMQ_SCRIPTS_DIR}/..")"
 DEFAULT_SCHEDULER_BIND_TYPE="db"
 [ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE}
 
+DEFAULT_DISTRIBUTION_BUFFER_SIZE=32000
+[ "x" = "x$RABBITMQ_DISTRIBUTION_BUFFER_SIZE" ] && RABBITMQ_DISTRIBUTION_BUFFER_SIZE=${DEFAULT_DISTRIBUTION_BUFFER_SIZE}
+
 ## Common defaults
-SERVER_ERL_ARGS="+P 1048576 +t 5000000 +stbt $RABBITMQ_SCHEDULER_BIND_TYPE "
+SERVER_ERL_ARGS="+P 1048576 +t 5000000 +stbt $RABBITMQ_SCHEDULER_BIND_TYPE +zdbbl $RABBITMQ_DISTRIBUTION_BUFFER_SIZE"
 
 # We save the current value of $RABBITMQ_PID_FILE in case it was set by
 # an init script. If $CONF_ENV_FILE overrides it again, we must ignore
@@ -183,6 +186,8 @@ DEFAULT_NODE_PORT=5672
 [ "x" = "x$RABBITMQ_SERVER_CODE_PATH" ] && RABBITMQ_SERVER_CODE_PATH=${SERVER_CODE_PATH}
 [ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${MNESIA_DIR}
 [ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}
+[ "x" = "x$RABBITMQ_IGNORE_SIGINT" ] && RABBITMQ_IGNORE_SIGINT="true"
+[ "xtrue" = "x$RABBITMQ_IGNORE_SIGINT" ] && RABBITMQ_IGNORE_SIGINT_FLAG="+B i"
 
 rmq_normalize_path_var \
     RABBITMQ_CONFIG_FILE \
similarity index 94%
rename from rabbitmq-server/scripts/rabbitmq-env.bat
rename to deps/rabbit/scripts/rabbitmq-env.bat
index 5f6ae970e93c72284ef8c8c4532a2d8321252122..3c84351d52c6b7e8a6e8095190f811308805f320 100644 (file)
@@ -38,6 +38,14 @@ if "!RABBITMQ_SCHEDULER_BIND_TYPE!"=="" (
     set RABBITMQ_SCHEDULER_BIND_TYPE=!DEFAULT_SCHEDULER_BIND_TYPE!\r
 )\r
 \r
+REM DEFAULT_DISTRIBUTION_BUFFER_SIZE=32000\r
+REM set the VM distribution buffer size\r
+REM [ "x" = "x$RABBITMQ_DISTRIBUTION_BUFFER_SIZE" ] && RABBITMQ_DISTRIBUTION_BUFFER_SIZE=${DEFAULT_DISTRIBUTION_BUFFER_SIZE}\r
+set DEFAULT_DISTRIBUTION_BUFFER_SIZE=32000\r
+if "!RABBITMQ_DISTRIBUTION_BUFFER_SIZE!"=="" (\r
+    set RABBITMQ_DISTRIBUTION_BUFFER_SIZE=!DEFAULT_DISTRIBUTION_BUFFER_SIZE!\r
+)\r
+\r
 REM # warn about old rabbitmq.conf file, if no new one\r
 REM if [ -f /etc/rabbitmq/rabbitmq.conf ] && \\r
 REM    [ ! -f ${CONF_ENV_FILE} ] ; then\r
@@ -46,7 +54,7 @@ REM     echo "location has moved to ${CONF_ENV_FILE}"
 REM fi\r
 \r
 REM Common defaults\r
-set SERVER_ERL_ARGS=+P 1048576 +t 5000000 +stbt !RABBITMQ_SCHEDULER_BIND_TYPE! \r
+set SERVER_ERL_ARGS=+P 1048576 +t 5000000 +stbt !RABBITMQ_SCHEDULER_BIND_TYPE! +zdbbl !RABBITMQ_DISTRIBUTION_BUFFER_SIZE!\r
 \r
 REM ## Get configuration variables from the configure environment file\r
 REM [ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE} || true\r
similarity index 92%
rename from rabbitmq-server/scripts/rabbitmq-server
rename to deps/rabbit/scripts/rabbitmq-server
index 74337311cd116e13fe248e89588f46c4db9db3fa..7b0599e88fc6ad57542b0f8ab21786d72927d7af 100755 (executable)
@@ -62,6 +62,17 @@ RABBITMQ_EBIN_ROOT="${RABBITMQ_HOME}/ebin"
 
 set +e
 
+# `net_kernel:start/1` will fail in `longnames` mode when erlang is
+# unable to determine FQDN of a node (with a dot in it). But `erl`
+# itself has some magic that still allow it to start when you
+# explicitly specify host (a.la `erl -name test@localhost`).
+#
+# It's not possible to communicate with this node, unless it's a
+# connection initiator. But as prelaunch IS an initiator, it doesn't
+# matter what we actually put here. But `localhost` sounds good
+# enough.
+RABBITMQ_PRELAUNCH_NODENAME="rabbitmqprelaunch${$}@localhost"
+
 # NOTIFY_SOCKET is needed here to prevent epmd from impersonating the
 # success of our startup sequence to systemd.
 NOTIFY_SOCKET= \
@@ -72,7 +83,7 @@ RABBITMQ_DIST_PORT=$RABBITMQ_DIST_PORT \
     -noinput \
     -hidden \
     -s rabbit_prelaunch \
-    ${RABBITMQ_NAME_TYPE} rabbitmqprelaunch$$ \
+    ${RABBITMQ_NAME_TYPE} ${RABBITMQ_PRELAUNCH_NODENAME} \
     -extra "${RABBITMQ_NODENAME}"
 
 PRELAUNCH_RESULT=$?
@@ -213,9 +224,8 @@ else
     # When RabbitMQ runs in the foreground but the Erlang shell is
     # disabled, we setup signal handlers to stop RabbitMQ properly. This
     # is at least useful in the case of Docker.
-
     # The Erlang VM should ignore SIGINT.
-    RABBITMQ_SERVER_START_ARGS="${RABBITMQ_SERVER_START_ARGS} +B i"
+    RABBITMQ_SERVER_START_ARGS="${RABBITMQ_SERVER_START_ARGS} ${RABBITMQ_IGNORE_SIGINT_FLAG}"
 
     # Signal handlers. They all stop RabbitMQ properly (using
     # rabbitmqctl stop). Depending on the signal, this script will exit
similarity index 97%
rename from rabbitmq-server/src/gm.erl
rename to deps/rabbit/src/gm.erl
index 176e14537f2d08b1b12ed4748d09605311bead1b..41aa01f04d9546b63525d08d88742821ff648716 100644 (file)
@@ -611,7 +611,7 @@ handle_call({add_on_right, NewMember}, _From,
         handle_callback_result({Result, {ok, Group}, State1})
     catch
         lost_membership ->
-            {stop, normal, State}
+            {stop, shutdown, State}
     end.
 
 %% add_on_right causes a catchup to be sent immediately from the left,
@@ -646,7 +646,7 @@ handle_cast({?TAG, ReqVer, Msg},
             Result, fun handle_msg_true/3, fun handle_msg_false/3, Msg, State1))
     catch
         lost_membership ->
-            {stop, normal, State}
+            {stop, shutdown, State}
     end;
 
 handle_cast({broadcast, _Msg, _SizeHint},
@@ -675,16 +675,21 @@ handle_cast(join, State = #state { self          = Self,
                                    module        = Module,
                                    callback_args = Args,
                                    txn_executor  = TxnFun }) ->
-    View = join_group(Self, GroupName, TxnFun),
-    MembersState =
-        case alive_view_members(View) of
-            [Self] -> blank_member_state();
-            _      -> undefined
-        end,
-    State1 = check_neighbours(State #state { view          = View,
-                                             members_state = MembersState }),
-    handle_callback_result(
-      {Module:joined(Args, get_pids(all_known_members(View))), State1});
+    try
+       View = join_group(Self, GroupName, TxnFun),
+       MembersState =
+           case alive_view_members(View) of
+               [Self] -> blank_member_state();
+               _      -> undefined
+           end,
+       State1 = check_neighbours(State #state { view          = View,
+                                                members_state = MembersState }),
+       handle_callback_result(
+         {Module:joined(Args, get_pids(all_known_members(View))), State1})
+    catch
+        lost_membership ->
+            {stop, shutdown, State}
+    end;
 
 handle_cast({validate_members, OldMembers},
             State = #state { view          = View,
@@ -756,13 +761,18 @@ handle_info({'DOWN', MRef, process, _Pid, Reason},
         end
     catch
         lost_membership ->
-            {stop, normal, State}
-    end.
+            {stop, shutdown, State}
+    end;
+handle_info(_, State) ->
+    %% Discard any unexpected messages, such as late replies from neighbour_call/2
+    %% TODO: For #gm_group{} related info messages, it could be worthwhile to
+    %% change_view/2, as this might reflect an alteration in the gm group, meaning
+    %% we now need to update our state. see rabbitmq-server#914.
+    noreply(State).
 
 terminate(Reason, #state { module = Module, callback_args = Args }) ->
     Module:handle_terminate(Args, Reason).
 
-
 code_change(_OldVsn, State, _Extra) ->
     {ok, State}.
 
@@ -865,7 +875,7 @@ handle_msg({activity, Left, Activity},
           Result, fun activity_true/3, fun activity_false/3, Activity3, State2)
     catch
         lost_membership ->
-            {{stop, normal}, State}
+            {{stop, shutdown}, State}
     end;
 
 handle_msg({activity, _NotLeft, _Activity}, State) ->
@@ -1131,7 +1141,7 @@ record_dead_member_in_group(Self, Member, GroupName, TxnFun, Verify) ->
                             true ->
                                 check_membership(Self, read_group(GroupName));
                             false ->
-                                read_group(GroupName)
+                                check_group(read_group(GroupName))
                         end,
                     case lists:splitwith(
                            fun (Member1) -> Member1 =/= Member end, Members) of
@@ -1165,11 +1175,20 @@ record_new_member_in_group(NewMember, Left, GroupName, TxnFun) ->
                 try
                     Group = #gm_group { members = Members, version = Ver } =
                         check_membership(Left, read_group(GroupName)),
-                    {Prefix, [Left | Suffix]} =
-                        lists:splitwith(fun (M) -> M =/= Left end, Members),
-                    write_group(Group #gm_group {
-                                  members = Prefix ++ [Left, NewMember | Suffix],
-                                  version = Ver + 1 })
+                    case lists:member(NewMember, Members) of
+                        true ->
+                            %% This avois duplicates during partial partitions,
+                            %% as inconsistent views might happen during them
+                            rabbit_log:warning("(~p) GM avoiding duplicate of ~p",
+                                               [self(), NewMember]),
+                            Group;
+                        false ->
+                            {Prefix, [Left | Suffix]} =
+                                lists:splitwith(fun (M) -> M =/= Left end, Members),
+                            write_group(Group #gm_group {
+                                          members = Prefix ++ [Left, NewMember | Suffix],
+                                          version = Ver + 1 })
+                    end
                 catch
                     lost_membership ->
                         %% The transaction must not be abruptly crashed, but
@@ -1593,7 +1612,9 @@ check_membership(Self, #gm_group{members = M} = Group) ->
             Group;
         false ->
             throw(lost_membership)
-    end.
+    end;
+check_membership(_Self, {error, not_found}) ->
+    throw(lost_membership).
 
 check_membership(GroupName) ->
     case dirty_read_group(GroupName) of
@@ -1607,3 +1628,8 @@ check_membership(GroupName) ->
         {error, not_found} ->
             throw(lost_membership)
     end.
+
+check_group({error, not_found}) ->
+    throw(lost_membership);
+check_group(Any) ->
+    Any.
similarity index 91%
rename from rabbitmq-server/src/rabbit.app.src
rename to deps/rabbit/src/rabbit.app.src
index f795e3738379ff96a9b995a8b002015d2338cef1..fe5a4c56f8097ddc98bba501a9d748575a4e6364 100644 (file)
@@ -1,7 +1,7 @@
 {application, rabbit,           %% -*- erlang -*-
  [{description, "RabbitMQ"},
   {id, "RabbitMQ"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, [rabbit_amqqueue_sup,
                 rabbit_log,
          {msg_store_credit_disc_bound, {2000, 500}},
          {msg_store_io_batch_size, 2048},
          %% see rabbitmq-server#143
-         {credit_flow_default_credit, {200, 50}},
+         %% and rabbitmq-server#949
+         {credit_flow_default_credit, {200, 100}},
          %% see rabbitmq-server#248
          %% and rabbitmq-server#667
-         {channel_operation_timeout, 15000}
+         {channel_operation_timeout, 15000},
+         {config_entry_decoder, [
+             {cipher, aes_cbc256},
+             {hash, sha512},
+             {iterations, 1000},
+             {passphrase, undefined}
+         ]},
+         %% rabbitmq-server-973
+         {lazy_queue_explicit_gc_run_operation_threshold, 250}
         ]}]}.
similarity index 91%
rename from rabbitmq-server/src/rabbit.erl
rename to deps/rabbit/src/rabbit.erl
index a86fd97925a68e9f2fa54dea9f3f07322f488c72..1f0df1ad06e20447696112bead7744319a5cff34 100644 (file)
@@ -24,7 +24,7 @@
          start_fhc/0]).
 -export([start/2, stop/1, prep_stop/1]).
 -export([start_apps/1, stop_apps/1]).
--export([log_location/1, config_files/0]). %% for testing and mgmt-agent
+-export([log_location/1, config_files/0, decrypt_config/2]). %% for testing and mgmt-agent
 
 %%---------------------------------------------------------------------------
 %% Boot steps.
@@ -442,6 +442,38 @@ stop_and_halt() ->
 
 start_apps(Apps) ->
     app_utils:load_applications(Apps),
+
+    ConfigEntryDecoder = case application:get_env(rabbit, config_entry_decoder) of
+        undefined ->
+            [];
+        {ok, Val} ->
+            Val
+    end,
+    PassPhrase = case proplists:get_value(passphrase, ConfigEntryDecoder) of
+        prompt ->
+            IoDevice = get_input_iodevice(),
+            io:setopts(IoDevice, [{echo, false}]),
+            PP = lists:droplast(io:get_line(IoDevice,
+                "\nPlease enter the passphrase to unlock encrypted "
+                "configuration entries.\n\nPassphrase: ")),
+            io:setopts(IoDevice, [{echo, true}]),
+            io:format(IoDevice, "~n", []),
+            PP;
+        {file, Filename} ->
+            {ok, File} = file:read_file(Filename),
+            [PP|_] = binary:split(File, [<<"\r\n">>, <<"\n">>]),
+            PP;
+        PP ->
+            PP
+    end,
+    Algo = {
+        proplists:get_value(cipher, ConfigEntryDecoder, rabbit_pbe:default_cipher()),
+        proplists:get_value(hash, ConfigEntryDecoder, rabbit_pbe:default_hash()),
+        proplists:get_value(iterations, ConfigEntryDecoder, rabbit_pbe:default_iterations()),
+        PassPhrase
+    },
+    decrypt_config(Apps, Algo),
+
     OrderedApps = app_utils:app_dependency_order(Apps, false),
     case lists:member(rabbit, Apps) of
         false -> rabbit_boot_steps:run_boot_steps(Apps); %% plugin activation
@@ -450,6 +482,78 @@ start_apps(Apps) ->
     ok = app_utils:start_applications(OrderedApps,
                                       handle_app_error(could_not_start)).
 
+%% This function retrieves the correct IoDevice for requesting
+%% input. The problem with using the default IoDevice is that
+%% the Erlang shell prevents us from getting the input.
+%%
+%% Instead we therefore look for the io process used by the
+%% shell and if it can't be found (because the shell is not
+%% started e.g with -noshell) we use the 'user' process.
+%%
+%% This function will not work when either -oldshell or -noinput
+%% options are passed to erl.
+get_input_iodevice() ->
+    case whereis(user) of
+        undefined -> user;
+        User ->
+            case group:interfaces(User) of
+                [] ->
+                    user;
+                [{user_drv, Drv}] ->
+                    case user_drv:interfaces(Drv) of
+                        [] ->
+                            user;
+                        [{current_group, IoDevice}] ->
+                            IoDevice
+                    end
+            end
+    end.
+
+decrypt_config([], _) ->
+    ok;
+decrypt_config([App|Apps], Algo) ->
+    decrypt_app(App, application:get_all_env(App), Algo),
+    decrypt_config(Apps, Algo).
+
+decrypt_app(_, [], _) ->
+    ok;
+decrypt_app(App, [{Key, Value}|Tail], Algo) ->
+    try begin
+            case decrypt(Value, Algo) of
+                Value ->
+                    ok;
+                NewValue ->
+                    application:set_env(App, Key, NewValue)
+            end
+        end
+    catch
+        exit:{bad_configuration, config_entry_decoder} ->
+            exit({bad_configuration, config_entry_decoder});
+        _:Msg ->
+            rabbit_log:info("Error while decrypting key '~p'. Please check encrypted value, passphrase, and encryption configuration~n", [Key]),
+            exit({decryption_error, {key, Key}, Msg})
+    end,
+    decrypt_app(App, Tail, Algo).
+
+decrypt({encrypted, _}, {_, _, _, undefined}) ->
+    exit({bad_configuration, config_entry_decoder});
+decrypt({encrypted, EncValue}, {Cipher, Hash, Iterations, Password}) ->
+    rabbit_pbe:decrypt_term(Cipher, Hash, Iterations, Password, EncValue);
+decrypt(List, Algo) when is_list(List) ->
+    decrypt_list(List, Algo, []);
+decrypt(Value, _) ->
+    Value.
+
+%% We make no distinction between strings and other lists.
+%% When we receive a string, we loop through each element
+%% and ultimately return the string unmodified, as intended.
+decrypt_list([], _, Acc) ->
+    lists:reverse(Acc);
+decrypt_list([{Key, Value}|Tail], Algo, Acc) when Key =/= encrypted ->
+    decrypt_list(Tail, Algo, [{Key, decrypt(Value, Algo)}|Acc]);
+decrypt_list([Value|Tail], Algo, Acc) ->
+    decrypt_list(Tail, Algo, [decrypt(Value, Algo)|Acc]).
+
 stop_apps(Apps) ->
     ok = app_utils:stop_applications(
            Apps, handle_app_error(error_during_shutdown)),
similarity index 95%
rename from rabbitmq-server/src/rabbit_amqqueue_process.erl
rename to deps/rabbit/src/rabbit_amqqueue_process.erl
index 66df42987cd70196df139ec48a2080a0c2791c0b..bfa868c6517563e4a0f1ea81ce79328480d3cb90 100644 (file)
@@ -85,6 +85,7 @@
             %% e.g. message expiration messages from previously set up timers
             %% that may or may not be still valid
             args_policy_version,
+            mirroring_policy_version = 0,
             %% running | flow | idle
             status
            }).
@@ -1012,7 +1013,17 @@ prioritise_info(Msg, _Len, #q{q = #amqqueue{exclusive_owner = DownPid}}) ->
     end.
 
 handle_call({init, Recover}, From, State) ->
-    init_it(Recover, From, State);
+    try
+       init_it(Recover, From, State)
+    catch
+       {coordinator_not_started, Reason} ->
+           %% The GM can shutdown before the coordinator has started up
+           %% (lost membership or missing group), thus the start_link of
+           %% the coordinator returns {error, shutdown} as rabbit_amqqueue_process
+           %% is trapping exists. The master captures this return value and
+           %% throws the current exception.
+           {stop, Reason, State}
+    end;
 
 handle_call(info, _From, State) ->
     reply(infos(info_keys(), State), State);
@@ -1158,7 +1169,17 @@ handle_call(cancel_sync_mirrors, _From, State) ->
     reply({ok, not_syncing}, State).
 
 handle_cast(init, State) ->
-    init_it({no_barrier, non_clean_shutdown}, none, State);
+    try
+       init_it({no_barrier, non_clean_shutdown}, none, State)
+    catch
+       {coordinator_not_started, Reason} ->
+           %% The GM can shutdown before the coordinator has started up
+           %% (lost membership or missing group), thus the start_link of
+           %% the coordinator returns {error, shutdown} as rabbit_amqqueue_process
+           %% is trapping exists. The master captures this return value and
+           %% throws the current exception.
+           {stop, Reason, State}
+    end;
 
 handle_cast({run_backing_queue, Mod, Fun},
             State = #q{backing_queue = BQ, backing_queue_state = BQS}) ->
@@ -1225,22 +1246,15 @@ handle_cast({set_maximum_since_use, Age}, State) ->
     ok = file_handle_cache:set_maximum_since_use(Age),
     noreply(State);
 
-handle_cast(start_mirroring, State = #q{backing_queue       = BQ,
-                                        backing_queue_state = BQS}) ->
-    %% lookup again to get policy for init_with_existing_bq
-    {ok, Q} = rabbit_amqqueue:lookup(qname(State)),
-    true = BQ =/= rabbit_mirror_queue_master, %% assertion
-    BQ1 = rabbit_mirror_queue_master,
-    BQS1 = BQ1:init_with_existing_bq(Q, BQ, BQS),
-    noreply(State#q{backing_queue       = BQ1,
-                    backing_queue_state = BQS1});
-
-handle_cast(stop_mirroring, State = #q{backing_queue       = BQ,
-                                       backing_queue_state = BQS}) ->
-    BQ = rabbit_mirror_queue_master, %% assertion
-    {BQ1, BQS1} = BQ:stop_mirroring(BQS),
-    noreply(State#q{backing_queue       = BQ1,
-                    backing_queue_state = BQS1});
+handle_cast(update_mirroring, State = #q{q = Q,
+                                         mirroring_policy_version = Version}) ->
+    case needs_update_mirroring(Q, Version) of
+        false ->
+            noreply(State);
+        {Policy, NewVersion} ->
+            State1 = State#q{mirroring_policy_version = NewVersion},
+            noreply(update_mirroring(Policy, State1))
+    end;
 
 handle_cast({credit, ChPid, CTag, Credit, Drain},
             State = #q{consumers           = Consumers,
@@ -1286,7 +1300,13 @@ handle_cast(policy_changed, State = #q{q = #amqqueue{name = Name}}) ->
     %% This also has the side effect of waking us up so we emit a
     %% stats event - so event consumers see the changed policy.
     {ok, Q} = rabbit_amqqueue:lookup(Name),
-    noreply(process_args_policy(State#q{q = Q})).
+    noreply(process_args_policy(State#q{q = Q}));
+
+handle_cast({sync_start, _, _}, State = #q{q = #amqqueue{name = Name}}) ->
+    %% Only a slave should receive this, it means we are a duplicated master
+    rabbit_mirror_queue_misc:log_warning(
+      Name, "Stopping after receiving sync_start from another master", []),
+    stop(State).
 
 handle_info({maybe_expire, Vsn}, State = #q{args_policy_version = Vsn}) ->
     case is_unused(State) of
@@ -1383,3 +1403,54 @@ handle_pre_hibernate(State = #q{backing_queue = BQ,
     {hibernate, stop_rate_timer(State1)}.
 
 format_message_queue(Opt, MQ) -> rabbit_misc:format_message_queue(Opt, MQ).
+
+needs_update_mirroring(Q, Version) ->
+    {ok, UpQ} = rabbit_amqqueue:lookup(Q#amqqueue.name),
+    DBVersion = UpQ#amqqueue.policy_version,
+    case DBVersion > Version of
+        true -> {rabbit_policy:get(<<"ha-mode">>, UpQ), DBVersion};
+        false -> false
+    end.
+
+update_mirroring(Policy, State = #q{backing_queue = BQ}) ->
+    case update_to(Policy, BQ) of
+        start_mirroring ->
+            start_mirroring(State);
+        stop_mirroring ->
+            stop_mirroring(State);
+        ignore ->
+            State;
+        update_ha_mode ->
+            update_ha_mode(State)
+    end.
+
+update_to(undefined, rabbit_mirror_queue_master) ->
+    stop_mirroring;
+update_to(_, rabbit_mirror_queue_master) ->
+    update_ha_mode;
+update_to(undefined, BQ) when BQ =/= rabbit_mirror_queue_master ->
+    ignore;
+update_to(_, BQ) when BQ =/= rabbit_mirror_queue_master ->
+    start_mirroring.
+
+start_mirroring(State = #q{backing_queue       = BQ,
+                           backing_queue_state = BQS}) ->
+    %% lookup again to get policy for init_with_existing_bq
+    {ok, Q} = rabbit_amqqueue:lookup(qname(State)),
+    true = BQ =/= rabbit_mirror_queue_master, %% assertion
+    BQ1 = rabbit_mirror_queue_master,
+    BQS1 = BQ1:init_with_existing_bq(Q, BQ, BQS),
+    State#q{backing_queue       = BQ1,
+            backing_queue_state = BQS1}.
+
+stop_mirroring(State = #q{backing_queue       = BQ,
+                          backing_queue_state = BQS}) ->
+    BQ = rabbit_mirror_queue_master, %% assertion
+    {BQ1, BQS1} = BQ:stop_mirroring(BQS),
+    State#q{backing_queue       = BQ1,
+            backing_queue_state = BQS1}.
+
+update_ha_mode(State) ->
+    {ok, Q} = rabbit_amqqueue:lookup(qname(State)),
+    ok = rabbit_mirror_queue_misc:update_mirrors(Q),
+    State.
similarity index 83%
rename from rabbitmq-server/src/rabbit_autoheal.erl
rename to deps/rabbit/src/rabbit_autoheal.erl
index 5865ba822715057ef216e36e9cb2b9c8230480f6..3adcc09692670c7f6f1688d54f952f30c5f17890 100644 (file)
@@ -180,6 +180,18 @@ node_down(_Node, not_healing) ->
 node_down(Node, {winner_waiting, _, Notify}) ->
     abort([Node], Notify);
 
+node_down(Node, {leader_waiting, Node, _Notify}) ->
+    %% The winner went down, we don't know what to do so we simply abort.
+    rabbit_log:info("Autoheal: aborting - winner ~p went down~n", [Node]),
+    not_healing;
+
+node_down(Node, {leader_waiting, _, _} = St) ->
+    %% If it is a partial partition, the winner might continue with the
+    %% healing process. If it is a full partition, the winner will also
+    %% see it and abort. Let's wait for it.
+    rabbit_log:info("Autoheal: ~p went down, waiting for winner decision ~n", [Node]),
+    St;
+
 node_down(Node, _State) ->
     rabbit_log:info("Autoheal: aborting - ~p went down~n", [Node]),
     not_healing.
@@ -218,14 +230,24 @@ handle_msg({become_winner, Losers},
            not_healing, _Partitions) ->
     rabbit_log:info("Autoheal: I am the winner, waiting for ~p to stop~n",
                     [Losers]),
-    %% The leader said everything was ready - do we agree? If not then
-    %% give up.
-    Down = Losers -- rabbit_node_monitor:alive_rabbit_nodes(Losers),
-    case Down of
-        [] -> [send(L, {winner_is, node()}) || L <- Losers],
-              {winner_waiting, Losers, Losers};
-        _  -> abort(Down, Losers)
-    end;
+    stop_partition(Losers);
+
+handle_msg({become_winner, Losers},
+           {winner_waiting, _, Losers}, _Partitions) ->
+    %% The leader has aborted the healing, might have seen us down but
+    %% we didn't see the same. Let's try again as it is the same partition.
+    rabbit_log:info("Autoheal: I am the winner and received a duplicated "
+                   "request, waiting again for ~p to stop~n", [Losers]),
+    stop_partition(Losers);
+
+handle_msg({become_winner, _},
+           {winner_waiting, _, Losers}, _Partitions) ->
+    %% Something has happened to the leader, it might have seen us down but we
+    %% are still alive. Partitions have changed, cannot continue.
+    rabbit_log:info("Autoheal: I am the winner and received another healing "
+                   "request, partitions have changed to ~p. Aborting ~n", [Losers]),
+    winner_finish(Losers),
+    not_healing;
 
 handle_msg({winner_is, Winner}, State = not_healing,
            _Partitions) ->
@@ -269,6 +291,14 @@ handle_msg({autoheal_finished, Winner}, not_healing, _Partitions)
     %% We are the leader and the winner. The state already transitioned
     %% to "not_healing" at the end of the autoheal process.
     rabbit_log:info("Autoheal finished according to winner ~p~n", [node()]),
+    not_healing;
+
+handle_msg({autoheal_finished, Winner}, not_healing, _Partitions) ->
+    %% We might have seen the winner down during a partial partition and
+    %% transitioned to not_healing. However, the winner was still able
+    %% to finish. Let it pass.
+    rabbit_log:info("Autoheal finished according to winner ~p."
+                   " Unexpected, I might have previously seen the winner down~n", [Winner]),
     not_healing.
 
 %%----------------------------------------------------------------------------
@@ -279,7 +309,9 @@ abort(Down, Notify) ->
     rabbit_log:info("Autoheal: aborting - ~p down~n", [Down]),
     %% Make sure any nodes waiting for us start - it won't necessarily
     %% heal the partition but at least they won't get stuck.
-    winner_finish(Notify).
+    %% If we are executing this, we are not stopping. Thus, don't wait
+    %% for ourselves!
+    winner_finish(Notify -- [node()]).
 
 winner_finish(Notify) ->
     %% There is a race in Mnesia causing a starting loser to hang
@@ -297,21 +329,33 @@ winner_finish(Notify) ->
     send(leader(), {autoheal_finished, node()}),
     not_healing.
 
-wait_for_mnesia_shutdown([Node | Rest] = AllNodes) ->
-    case rpc:call(Node, mnesia, system_info, [is_running]) of
-        no ->
-            wait_for_mnesia_shutdown(Rest);
-        Running when
-        Running =:= yes orelse
-        Running =:= starting orelse
-        Running =:= stopping ->
-            timer:sleep(?MNESIA_STOPPED_PING_INTERNAL),
-            wait_for_mnesia_shutdown(AllNodes);
-        _ ->
-            wait_for_mnesia_shutdown(Rest)
-    end;
-wait_for_mnesia_shutdown([]) ->
-    ok.
+%% This improves the previous implementation, but could still potentially enter an infinity
+%% loop. If it also possible that for when it finishes some of the nodes have been
+%% manually restarted, but we can't do much more (apart from stop them again). So let it
+%% continue and notify all the losers to restart.
+wait_for_mnesia_shutdown(AllNodes) ->
+    Monitors = lists:foldl(fun(Node, Monitors0) ->
+                                  pmon:monitor({mnesia_sup, Node}, Monitors0)
+                          end, pmon:new(), AllNodes),
+    wait_for_supervisors(Monitors).
+
+wait_for_supervisors(Monitors) ->
+    case pmon:is_empty(Monitors) of
+       true ->
+           ok;
+       false ->
+           receive
+               {'DOWN', _MRef, process, {mnesia_sup, _} = I, _Reason} ->
+                   wait_for_supervisors(pmon:erase(I, Monitors))
+           after
+               60000 ->
+                   AliveLosers = [Node || {_, Node} <- pmon:monitored(Monitors)],
+                   rabbit_log:info("Autoheal: mnesia in nodes ~p is still up, sending "
+                                   "winner notification again to these ~n", [AliveLosers]),
+                   [send(L, {winner_is, node()}) || L <- AliveLosers],
+                   wait_for_mnesia_shutdown(AliveLosers)
+           end
+    end.
 
 restart_loser(State, Winner) ->
     rabbit_log:warning(
@@ -391,3 +435,13 @@ fmt_error({remote_down, RemoteDown}) ->
     rabbit_misc:format("Remote nodes disconnected:~n ~p", [RemoteDown]);
 fmt_error({nodes_down, NodesDown}) ->
     rabbit_misc:format("Local nodes down: ~p", [NodesDown]).
+
+stop_partition(Losers) ->
+    %% The leader said everything was ready - do we agree? If not then
+    %% give up.
+    Down = Losers -- rabbit_node_monitor:alive_rabbit_nodes(Losers),
+    case Down of
+        [] -> [send(L, {winner_is, node()}) || L <- Losers],
+              {winner_waiting, Losers, Losers};
+        _  -> abort(Down, Losers)
+    end.
similarity index 85%
rename from rabbitmq-server/src/rabbit_cli.erl
rename to deps/rabbit/src/rabbit_cli.erl
index 6b3548221747797be019c7739501a68064250deb..c0e5c93247b7faedd5775e78b3a12f2c23d21e26 100644 (file)
@@ -18,7 +18,7 @@
 -include("rabbit_cli.hrl").
 
 -export([main/3, start_distribution/0, start_distribution/1,
-         parse_arguments/4, filter_opts/2,
+         parse_arguments/4, mutually_exclusive_flags/3,
          rpc_call/4, rpc_call/5, rpc_call/7]).
 
 %%----------------------------------------------------------------------------
@@ -42,8 +42,7 @@
          [{string(), optdef()}], string(), [string()]) ->
           parse_result().
 
--spec filter_opts([{option_name(), option_value()}], [option_name()]) ->
-          [boolean()].
+-spec mutually_exclusive_flags([{option_name(), option_value()}], term(), [{option_name(), term()}]) -> {ok, term()} | {error, string()}.
 
 -spec rpc_call(node(), atom(), atom(), [any()]) -> any().
 -spec rpc_call(node(), atom(), atom(), [any()], number()) -> any().
@@ -147,7 +146,7 @@ main(ParseFun, DoFun, UsageMod) ->
 start_distribution_anon(0, LastError) ->
     {error, LastError};
 start_distribution_anon(TriesLeft, _) ->
-    NameCandidate = list_to_atom(rabbit_misc:format("rabbitmq-cli-~2..0b", [rand_compat:uniform(100)])),
+    NameCandidate = generate_cli_node_name(),
     case net_kernel:start([NameCandidate, name_type()]) of
         {ok, _} = Result ->
             Result;
@@ -155,7 +154,7 @@ start_distribution_anon(TriesLeft, _) ->
             start_distribution_anon(TriesLeft - 1, Reason)
     end.
 
-%% Tries to start distribution with randonm name choosen from limited list of candidates - to
+%% Tries to start distribution with random name choosen from limited list of candidates - to
 %% prevent atom table pollution on target nodes.
 start_distribution() ->
     rabbit_nodes:ensure_epmd(),
@@ -171,6 +170,22 @@ name_type() ->
         _      -> shortnames
     end.
 
+generate_cli_node_name() ->
+    Base = rabbit_misc:format("rabbitmq-cli-~2..0b", [rand_compat:uniform(100)]),
+    NameAsList =
+        case {name_type(), inet_db:res_option(domain)} of
+            {longnames, []} ->
+                %% Distribution will fail to start if it's unable to
+                %% determine FQDN of a node (with at least one dot in
+                %% a name).
+                %% CLI is always an initiator of connection, so it
+                %% doesn't matter if the name will not resolve.
+                Base ++ "@" ++ inet_db:gethostname() ++ ".no-domain";
+            _ ->
+                Base
+        end,
+    list_to_atom(NameAsList).
+
 usage(Mod) ->
     usage(Mod, ?EX_USAGE).
 
@@ -250,20 +265,22 @@ process_opts(Defs, C, [A | As], Found, KVs, Outs) ->
         {none, _, _}     -> no_command
     end.
 
-%% When we have a set of flags that are used for filtering, we want by
-%% default to include every such option in our output. But if a user
-%% explicitly specified any such flag, we want to include only items
-%% which he has requested.
-filter_opts(CurrentOptionValues, AllOptionNames) ->
-    Explicit = lists:map(fun(OptName) ->
-                                 proplists:get_bool(OptName, CurrentOptionValues)
-                         end,
-                         AllOptionNames),
-    case lists:member(true, Explicit) of
-        true ->
-            Explicit;
-        false ->
-            lists:duplicate(length(AllOptionNames), true)
+mutually_exclusive_flags(CurrentOptionValues, Default, FlagsAndValues) ->
+    PresentFlags = lists:filtermap(fun({OptName, _} = _O) ->
+                                           proplists:get_bool(OptName, CurrentOptionValues)
+                                   end,
+                             FlagsAndValues),
+    case PresentFlags of
+        [] ->
+            {ok, Default};
+        [{_, Value}] ->
+            {ok, Value};
+        _ ->
+            Names = [ [$', N, $']  || {N, _} <- PresentFlags ],
+            CommaSeparated = string:join(lists:droplast(Names), ", "),
+            AndOneMore = lists:last(Names),
+            Msg = io_lib:format("Options ~s and ~s are mutually exclusive", [CommaSeparated, AndOneMore]),
+            {error, lists:flatten(Msg)}
     end.
 
 %%----------------------------------------------------------------------------
similarity index 96%
rename from rabbitmq-server/src/rabbit_control_main.erl
rename to deps/rabbit/src/rabbit_control_main.erl
index ea9d6a2030dc54aee0d7bb991493b5dc10ac327a..8c245892b7cbc23c120b5d860ebe857510db6a98 100644 (file)
@@ -74,7 +74,7 @@
          {clear_policy, [?VHOST_DEF]},
          {list_policies, [?VHOST_DEF]},
 
-         {list_queues, [?VHOST_DEF, ?OFFLINE_DEF, ?ONLINE_DEF]},
+         {list_queues, [?VHOST_DEF, ?OFFLINE_DEF, ?ONLINE_DEF, ?LOCAL_DEF]},
          {list_exchanges, [?VHOST_DEF]},
          {list_bindings, [?VHOST_DEF]},
          {list_connections, [?VHOST_DEF]},
@@ -92,7 +92,8 @@
          {trace_off, [?VHOST_DEF]},
          set_vm_memory_high_watermark,
          set_disk_free_limit,
-         help
+         help,
+         {encode, [?DECODE_DEF, ?CIPHER_DEF, ?HASH_DEF, ?ITERATIONS_DEF, ?LIST_CIPHERS_DEF, ?LIST_HASHES_DEF]}
         ]).
 
 -define(GLOBAL_QUERIES,
         [stop, stop_app, start_app, wait, reset, force_reset, rotate_logs,
          join_cluster, change_cluster_node_type, update_cluster_nodes,
          forget_cluster_node, rename_cluster_node, cluster_status, status,
-         environment, eval, force_boot, help, hipe_compile]).
+         environment, eval, force_boot, help, hipe_compile, encode]).
 
 %% [Command | {Command, DefaultTimeoutInMilliSeconds}]
 -define(COMMANDS_WITH_TIMEOUT,
@@ -579,6 +580,17 @@ action(eval, Node, [Expr], _Opts, _Inform) ->
 action(help, _Node, _Args, _Opts, _Inform) ->
     io:format("~s", [rabbit_ctl_usage:usage()]);
 
+action(encode, _Node, Args, Opts, _Inform) ->
+    ListCiphers = lists:member({?LIST_CIPHERS_OPT, true}, Opts),
+    ListHashes = lists:member({?LIST_HASHES_OPT, true}, Opts),
+    Decode = lists:member({?DECODE_OPT, true}, Opts),
+    Cipher = list_to_atom(proplists:get_value(?CIPHER_OPT, Opts)),
+    Hash = list_to_atom(proplists:get_value(?HASH_OPT, Opts)),
+    Iterations = list_to_integer(proplists:get_value(?ITERATIONS_OPT, Opts)),
+
+    {_, Msg} = rabbit_control_pbe:encode(ListCiphers, ListHashes, Decode, Cipher, Hash, Iterations, Args),
+    io:format(Msg ++ "~n");
+
 action(Command, Node, Args, Opts, Inform) ->
     %% For backward compatibility, run commands accepting a timeout with
     %% the default timeout.
@@ -632,12 +644,19 @@ action(list_user_permissions, Node, Args = [_Username], _Opts, Inform, Timeout)
          true);
 
 action(list_queues, Node, Args, Opts, Inform, Timeout) ->
-    [Online, Offline] = rabbit_cli:filter_opts(Opts, [?ONLINE_OPT, ?OFFLINE_OPT]),
-    Inform("Listing queues", []),
-    VHostArg = list_to_binary(proplists:get_value(?VHOST_OPT, Opts)),
-    ArgAtoms = default_if_empty(Args, [name, messages]),
-    call(Node, {rabbit_amqqueue, info_all, [VHostArg, ArgAtoms, Online, Offline]},
-         ArgAtoms, Timeout);
+    case rabbit_cli:mutually_exclusive_flags(
+           Opts, all, [{?ONLINE_OPT, online}
+                      ,{?OFFLINE_OPT, offline}
+                      ,{?LOCAL_OPT, local}]) of
+        {ok, Filter} ->
+            Inform("Listing queues", []),
+            VHostArg = list_to_binary(proplists:get_value(?VHOST_OPT, Opts)),
+            ArgAtoms = default_if_empty(Args, [name, messages]),
+            call(Node, {rabbit_amqqueue, info_all, [VHostArg, ArgAtoms, Filter]},
+                 ArgAtoms, Timeout);
+        {error, ErrStr} ->
+            {error_string, ErrStr}
+    end;
 
 action(list_exchanges, Node, Args, Opts, Inform, Timeout) ->
     Inform("Listing exchanges", []),
diff --git a/deps/rabbit/src/rabbit_control_pbe.erl b/deps/rabbit/src/rabbit_control_pbe.erl
new file mode 100644 (file)
index 0000000..2fa2c90
--- /dev/null
@@ -0,0 +1,79 @@
+% The contents of this file are subject to the Mozilla Public License
+%% Version 1.1 (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.mozilla.org/MPL/
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and
+%% limitations under the License.
+%%
+%% The Original Code is RabbitMQ.
+%%
+%% The Initial Developer of the Original Code is GoPivotal, Inc.
+%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
+%%
+
+-module(rabbit_control_pbe).
+
+-export([encode/7]).
+
+% for testing purposes
+-export([evaluate_input_as_term/1]).
+
+encode(ListCiphers, _ListHashes, _Decode, _Cipher, _Hash, _Iterations, _Args) when ListCiphers ->
+    {ok, io_lib:format("~p", [rabbit_pbe:supported_ciphers()])};
+
+encode(_ListCiphers, ListHashes, _Decode, _Cipher, _Hash, _Iterations, _Args) when ListHashes ->
+    {ok, io_lib:format("~p", [rabbit_pbe:supported_hashes()])};
+
+encode(_ListCiphers, _ListHashes, Decode, Cipher, Hash, Iterations, Args) ->
+    CipherExists = lists:member(Cipher, rabbit_pbe:supported_ciphers()),
+    HashExists = lists:member(Hash, rabbit_pbe:supported_hashes()),
+    encode_encrypt_decrypt(CipherExists, HashExists, Decode, Cipher, Hash, Iterations, Args).
+
+encode_encrypt_decrypt(CipherExists, _HashExists, _Decode, _Cipher, _Hash, _Iterations, _Args) when CipherExists =:= false ->
+    {error, io_lib:format("The requested cipher is not supported", [])};
+
+encode_encrypt_decrypt(_CipherExists, HashExists, _Decode, _Cipher, _Hash, _Iterations, _Args) when HashExists =:= false ->
+    {error, io_lib:format("The requested hash is not supported", [])};
+
+encode_encrypt_decrypt(_CipherExists, _HashExists, _Decode, _Cipher, _Hash, Iterations, _Args) when Iterations =< 0 ->
+    {error, io_lib:format("The requested number of iterations is incorrect", [])};
+
+encode_encrypt_decrypt(_CipherExists, _HashExists, Decode, Cipher, Hash, Iterations, Args) when length(Args) == 2, Decode =:= false ->
+    [Value, PassPhrase] = Args,
+    try begin
+            TermValue = evaluate_input_as_term(Value),
+            Result = rabbit_pbe:encrypt_term(Cipher, Hash, Iterations, list_to_binary(PassPhrase), TermValue),
+            {ok, io_lib:format("~p", [{encrypted, Result}])}
+        end
+    catch
+        _:Msg -> {error, io_lib:format("Error during cipher operation: ~p", [Msg])}
+    end;
+
+encode_encrypt_decrypt(_CipherExists, _HashExists, Decode, Cipher, Hash, Iterations, Args) when length(Args) == 2, Decode ->
+    [Value, PassPhrase] = Args,
+    try begin
+            TermValue = evaluate_input_as_term(Value),
+            TermToDecrypt = case TermValue of
+                {encrypted, EncryptedTerm} ->
+                    EncryptedTerm;
+                _ ->
+                    TermValue
+            end,
+            Result = rabbit_pbe:decrypt_term(Cipher, Hash, Iterations, list_to_binary(PassPhrase), TermToDecrypt),
+            {ok, io_lib:format("~p", [Result])}
+        end
+    catch
+        _:Msg -> {error, io_lib:format("Error during cipher operation: ~p", [Msg])}
+    end;
+
+encode_encrypt_decrypt(_CipherExists, _HashExists, _Decode, _Cipher, _Hash, _Iterations, _Args) ->
+    {error, io_lib:format("Please provide a value to encode/decode and a passphrase", [])}.
+
+evaluate_input_as_term(Input) ->
+    {ok,Tokens,_EndLine} = erl_scan:string(Input ++ "."),
+    {ok,AbsForm} = erl_parse:parse_exprs(Tokens),
+    {value,TermValue,_Bs} = erl_eval:exprs(AbsForm, erl_eval:new_bindings()),
+    TermValue.
similarity index 96%
rename from rabbitmq-server/src/rabbit_mirror_queue_coordinator.erl
rename to deps/rabbit/src/rabbit_mirror_queue_coordinator.erl
index 221f11f18a01134d9bcb56cb0b53f1c259fe50a3..562f0f0fcfbef67e5f2c95123b9ed30833e0c97b 100644 (file)
@@ -355,13 +355,28 @@ handle_cast({gm_deaths, DeadGMPids},
                                                    DeadPids),
             rabbit_mirror_queue_misc:add_mirrors(QueueName, ExtraNodes, async),
             noreply(State);
+        {ok, _MPid0, DeadPids, _ExtraNodes} ->
+            %% see rabbitmq-server#914;
+            %% Different slave is now master, stop current coordinator normally.
+            %% Initiating queue is now slave and the least we could do is report
+            %% deaths which we 'think' we saw.
+            %% NOTE: Reported deaths here, could be inconsistant.
+            rabbit_mirror_queue_misc:report_deaths(MPid, false, QueueName,
+                                                   DeadPids),
+            {stop, shutdown, State};
         {error, not_found} ->
             {stop, normal, State}
     end;
 
-handle_cast(request_depth, State = #state { depth_fun = DepthFun }) ->
-    ok = DepthFun(),
-    noreply(State);
+handle_cast(request_depth, State = #state { depth_fun = DepthFun,
+                                           q  = #amqqueue { name = QName, pid = MPid }}) ->
+    case rabbit_amqqueue:lookup(QName) of
+       {ok, #amqqueue{ pid = MPid }} ->
+           ok = DepthFun(),
+           noreply(State);
+       _ ->
+           {stop, shutdown, State}
+    end;
 
 handle_cast({ensure_monitoring, Pids}, State = #state { monitors = Mons }) ->
     noreply(State #state { monitors = pmon:monitor_all(Pids, Mons) });
similarity index 93%
rename from rabbitmq-server/src/rabbit_mirror_queue_master.erl
rename to deps/rabbit/src/rabbit_mirror_queue_master.erl
index d78f6180e7ab22f0815c15643e453909306ea01b..d82cdf336abf4f200ae9e8cfad9c131fb87016b8 100644 (file)
@@ -101,35 +101,43 @@ init(Q, Recover, AsyncCallback) ->
     State.
 
 init_with_existing_bq(Q = #amqqueue{name = QName}, BQ, BQS) ->
-    {ok, CPid} = rabbit_mirror_queue_coordinator:start_link(
-                   Q, undefined, sender_death_fun(), depth_fun()),
-    GM = rabbit_mirror_queue_coordinator:get_gm(CPid),
-    Self = self(),
-    ok = rabbit_misc:execute_mnesia_transaction(
-           fun () ->
-                   [Q1 = #amqqueue{gm_pids = GMPids}]
-                       = mnesia:read({rabbit_queue, QName}),
-                   ok = rabbit_amqqueue:store_queue(
-                          Q1#amqqueue{gm_pids = [{GM, Self} | GMPids],
-                                      state   = live})
-           end),
-    {_MNode, SNodes} = rabbit_mirror_queue_misc:suggested_queue_nodes(Q),
-    %% We need synchronous add here (i.e. do not return until the
-    %% slave is running) so that when queue declaration is finished
-    %% all slaves are up; we don't want to end up with unsynced slaves
-    %% just by declaring a new queue. But add can't be synchronous all
-    %% the time as it can be called by slaves and that's
-    %% deadlock-prone.
-    rabbit_mirror_queue_misc:add_mirrors(QName, SNodes, sync),
-    #state { name                = QName,
-             gm                  = GM,
-             coordinator         = CPid,
-             backing_queue       = BQ,
-             backing_queue_state = BQS,
-             seen_status         = dict:new(),
-             confirmed           = [],
-             known_senders       = sets:new(),
-             wait_timeout        = rabbit_misc:get_env(rabbit, slave_wait_timeout, 15000) }.
+    case rabbit_mirror_queue_coordinator:start_link(
+          Q, undefined, sender_death_fun(), depth_fun()) of
+       {ok, CPid} ->
+           GM = rabbit_mirror_queue_coordinator:get_gm(CPid),
+           Self = self(),
+           ok = rabbit_misc:execute_mnesia_transaction(
+                  fun () ->
+                          [Q1 = #amqqueue{gm_pids = GMPids}]
+                              = mnesia:read({rabbit_queue, QName}),
+                          ok = rabbit_amqqueue:store_queue(
+                                 Q1#amqqueue{gm_pids = [{GM, Self} | GMPids],
+                                             state   = live})
+                  end),
+           {_MNode, SNodes} = rabbit_mirror_queue_misc:suggested_queue_nodes(Q),
+           %% We need synchronous add here (i.e. do not return until the
+           %% slave is running) so that when queue declaration is finished
+           %% all slaves are up; we don't want to end up with unsynced slaves
+           %% just by declaring a new queue. But add can't be synchronous all
+           %% the time as it can be called by slaves and that's
+           %% deadlock-prone.
+           rabbit_mirror_queue_misc:add_mirrors(QName, SNodes, sync),
+           #state { name                = QName,
+                    gm                  = GM,
+                    coordinator         = CPid,
+                    backing_queue       = BQ,
+                    backing_queue_state = BQS,
+                    seen_status         = dict:new(),
+                    confirmed           = [],
+                    known_senders       = sets:new(),
+                    wait_timeout        = rabbit_misc:get_env(rabbit, slave_wait_timeout, 15000) };
+       {error, Reason} ->
+           %% The GM can shutdown before the coordinator has started up
+           %% (lost membership or missing group), thus the start_link of
+           %% the coordinator returns {error, shutdown} as rabbit_amqqueue_process
+           % is trapping exists
+           throw({coordinator_not_started, Reason})
+    end.
 
 stop_mirroring(State = #state { coordinator         = CPid,
                                 backing_queue       = BQ,
similarity index 94%
rename from rabbitmq-server/src/rabbit_mirror_queue_misc.erl
rename to deps/rabbit/src/rabbit_mirror_queue_misc.erl
index 83350920e6c9a0c053e6e19b7d7b3eb83f98763f..375a0366dd8dd5fbca7c053e64cc7d24b309bd54 100644 (file)
@@ -20,7 +20,7 @@
 -export([remove_from_queue/3, on_node_up/0, add_mirrors/3,
          report_deaths/4, store_updated_slaves/1,
          initial_queue_node/2, suggested_queue_nodes/1,
-         is_mirrored/1, update_mirrors/2, validate_policy/1,
+         is_mirrored/1, update_mirrors/2, update_mirrors/1, validate_policy/1,
          maybe_auto_sync/1, maybe_drop_master_after_sync/1,
          sync_batch_size/1, log_info/3, log_warning/3]).
 
@@ -76,7 +76,7 @@ remove_from_queue(QueueName, Self, DeadGMPids) ->
     rabbit_misc:execute_mnesia_transaction(
       fun () ->
               %% Someone else could have deleted the queue before we
-              %% get here.
+              %% get here. Or, gm group could've altered. see rabbitmq-server#914
               case mnesia:read({rabbit_queue, QueueName}) of
                   [] -> {error, not_found};
                   [Q = #amqqueue { pid        = QPid,
@@ -90,7 +90,16 @@ remove_from_queue(QueueName, Self, DeadGMPids) ->
                       AlivePids = [Pid || {_GM, Pid} <- AliveGM],
                       Alive     = [Pid || Pid <- [QPid | SPids],
                                           lists:member(Pid, AlivePids)],
-                      {QPid1, SPids1} = promote_slave(Alive),
+                      {QPid1, SPids1} = case Alive of
+                                            [] ->
+                                                %% GM altered, & if all pids are
+                                                %% perceived as dead, rather do
+                                                %% do nothing here, & trust the
+                                                %% promoted slave to have updated
+                                                %% mnesia during the alteration.
+                                                {QPid, SPids};
+                                            _  -> promote_slave(Alive)
+                                        end,
                       Extra =
                           case {{QPid, SPids}, {QPid1, SPids1}} of
                               {Same, Same} ->
@@ -98,7 +107,8 @@ remove_from_queue(QueueName, Self, DeadGMPids) ->
                               _ when QPid =:= QPid1 orelse QPid1 =:= Self ->
                                   %% Either master hasn't changed, so
                                   %% we're ok to update mnesia; or we have
-                                  %% become the master.
+                                  %% become the master. If gm altered,
+                                  %% we have no choice but to proceed.
                                   Q1 = Q#amqqueue{pid        = QPid1,
                                                   slave_pids = SPids1,
                                                   gm_pids    = AliveGM},
@@ -392,15 +402,12 @@ update_mirrors(OldQ = #amqqueue{pid = QPid},
                NewQ = #amqqueue{pid = QPid}) ->
     case {is_mirrored(OldQ), is_mirrored(NewQ)} of
         {false, false} -> ok;
-        {true,  false} -> rabbit_amqqueue:stop_mirroring(QPid);
-        {false,  true} -> rabbit_amqqueue:start_mirroring(QPid);
-        {true,   true} -> update_mirrors0(OldQ, NewQ)
+        _ -> rabbit_amqqueue:update_mirroring(QPid)
     end.
 
-update_mirrors0(OldQ = #amqqueue{name = QName},
-                NewQ = #amqqueue{name = QName}) ->
-    {OldMNode, OldSNodes, _} = actual_queue_nodes(OldQ),
-    {NewMNode, NewSNodes}    = suggested_queue_nodes(NewQ),
+update_mirrors(Q = #amqqueue{name = QName}) ->
+    {OldMNode, OldSNodes, _} = actual_queue_nodes(Q),
+    {NewMNode, NewSNodes}    = suggested_queue_nodes(Q),
     OldNodes = [OldMNode | OldSNodes],
     NewNodes = [NewMNode | NewSNodes],
     %% When a mirror dies, remove_from_queue/2 might have to add new
@@ -414,7 +421,7 @@ update_mirrors0(OldQ = #amqqueue{name = QName},
     drop_mirrors(QName, OldNodes -- NewNodes),
     %% This is for the case where no extra nodes were added but we changed to
     %% a policy requiring auto-sync.
-    maybe_auto_sync(NewQ),
+    maybe_auto_sync(Q),
     ok.
 
 %% The arrival of a newly synced slave may cause the master to die if
similarity index 65%
rename from rabbitmq-server/src/rabbit_mirror_queue_mode_nodes.erl
rename to deps/rabbit/src/rabbit_mirror_queue_mode_nodes.erl
index e63f3403739d6f0be6c0e3de33a816cb3aa4f15c..31c55722a5c533e9e177c868d80feb09508dd547 100644 (file)
 description() ->
     [{description, <<"Mirror queue to specified nodes">>}].
 
-suggested_queue_nodes(Nodes0, MNode, _SNodes, SSNodes, Poss) ->
-    Nodes1 = [list_to_atom(binary_to_list(Node)) || Node <- Nodes0],
+suggested_queue_nodes(PolicyNodes0, CurrentMaster, _SNodes, SSNodes, NodesRunningRabbitMQ) ->
+    PolicyNodes1 = [list_to_atom(binary_to_list(Node)) || Node <- PolicyNodes0],
     %% If the current master is not in the nodes specified, then what we want
     %% to do depends on whether there are any synchronised slaves. If there
     %% are then we can just kill the current master - the admin has asked for
     %% a migration and we should give it to them. If there are not however
     %% then we must keep the master around so as not to lose messages.
-    Nodes = case SSNodes of
-                [] -> lists:usort([MNode | Nodes1]);
-                _  -> Nodes1
-            end,
-    Unavailable = Nodes -- Poss,
-    Available = Nodes -- Unavailable,
-    case Available of
+
+    PolicyNodes = case SSNodes of
+                      [] -> lists:usort([CurrentMaster | PolicyNodes1]);
+                      _  -> PolicyNodes1
+                  end,
+    Unavailable = PolicyNodes -- NodesRunningRabbitMQ,
+    AvailablePolicyNodes = PolicyNodes -- Unavailable,
+    case AvailablePolicyNodes of
         [] -> %% We have never heard of anything? Not much we can do but
               %% keep the master alive.
-              {MNode, []};
-        _  -> case lists:member(MNode, Available) of
-                  true  -> {MNode, Available -- [MNode]};
+              {CurrentMaster, []};
+        _  -> case lists:member(CurrentMaster, AvailablePolicyNodes) of
+                  true  -> {CurrentMaster,
+                            AvailablePolicyNodes -- [CurrentMaster]};
                   false -> %% Make sure the new master is synced! In order to
                            %% get here SSNodes must not be empty.
-                           [NewMNode | _] = SSNodes,
-                           {NewMNode, Available -- [NewMNode]}
+                           SyncPolicyNodes = [Node ||
+                                              Node <- AvailablePolicyNodes,
+                                              lists:member(Node, SSNodes)],
+                           NewMaster = case SyncPolicyNodes of
+                                          [Node | _] -> Node;
+                                          []         -> erlang:hd(SSNodes)
+                                      end,
+                           {NewMaster, AvailablePolicyNodes -- [NewMaster]}
               end
     end.
 
similarity index 97%
rename from rabbitmq-server/src/rabbit_mirror_queue_slave.erl
rename to deps/rabbit/src/rabbit_mirror_queue_slave.erl
index 6f46cdc69881707b65e124470f71f254856634cc..6017e5a02838f30d78c5304de539a122a3eb5ace 100644 (file)
@@ -225,9 +225,15 @@ handle_call({gm_deaths, DeadGMPids}, From,
                 _ ->
                     %% master has changed to not us
                     gen_server2:reply(From, ok),
-                    %% assertion, we don't need to add_mirrors/2 in this
-                    %% branch, see last clause in remove_from_queue/2
-                    [] = ExtraNodes,
+                    %% see rabbitmq-server#914;
+                    %% It's not always guaranteed that we won't have ExtraNodes.
+                    %% If gm alters, master can change to not us with extra nodes,
+                    %% in which case we attempt to add mirrors on those nodes.
+                    case ExtraNodes of
+                        [] -> void;
+                        _  -> rabbit_mirror_queue_misc:add_mirrors(
+                                QName, ExtraNodes, async)
+                    end,
                     %% Since GM is by nature lazy we need to make sure
                     %% there is some traffic when a master dies, to
                     %% make sure all slaves get informed of the
@@ -250,8 +256,21 @@ handle_cast(go, {not_started, Q} = NotStarted) ->
 handle_cast({run_backing_queue, Mod, Fun}, State) ->
     noreply(run_backing_queue(Mod, Fun, State));
 
-handle_cast({gm, Instruction}, State) ->
-    handle_process_result(process_instruction(Instruction, State));
+handle_cast({gm, Instruction}, State = #state{q = #amqqueue { name = QName }}) ->
+    case rabbit_amqqueue:lookup(QName) of
+       {ok, #amqqueue{slave_pids = SPids}} ->
+           case lists:member(self(), SPids) of
+               true ->
+                   handle_process_result(process_instruction(Instruction, State));
+               false ->
+                   %% Potentially a duplicated slave caused by a partial partition,
+                   %% will stop as a new slave could start unaware of our presence
+                   {stop, shutdown, State}
+           end;
+       {error, not_found} ->
+           %% Would not expect this to happen after fixing #953
+           {stop, shutdown, State}
+    end;
 
 handle_cast({deliver, Delivery = #delivery{sender = Sender, flow = Flow}, true},
             State) ->
@@ -295,7 +314,12 @@ handle_cast({set_ram_duration_target, Duration},
             State = #state { backing_queue       = BQ,
                              backing_queue_state = BQS }) ->
     BQS1 = BQ:set_ram_duration_target(Duration, BQS),
-    noreply(State #state { backing_queue_state = BQS1 }).
+    noreply(State #state { backing_queue_state = BQS1 });
+
+handle_cast(policy_changed, State) ->
+    %% During partial partitions, we might end up receiving messages expected by a master
+    %% Ignore them
+    noreply(State).
 
 handle_info(update_ram_duration, State = #state{backing_queue       = BQ,
                                                 backing_queue_state = BQS}) ->
similarity index 98%
rename from rabbitmq-server/src/rabbit_mirror_queue_sync.erl
rename to deps/rabbit/src/rabbit_mirror_queue_sync.erl
index 54f0855fce44ddfef7711e1e5675572e6ba324c4..c438e91a3f5b28e1d3a1b142989a0c33689d322d 100644 (file)
@@ -248,9 +248,15 @@ syncer_loop(Ref, MPid, SPids) ->
             syncer_loop(Ref, MPid, SPids);
         {msgs, Ref, Msgs} ->
             SPids1 = wait_for_credit(SPids),
-            broadcast(SPids1, {sync_msgs, Ref, Msgs}),
-            MPid ! {next, Ref},
-            syncer_loop(Ref, MPid, SPids1);
+            case SPids1 of
+                [] ->
+                    % Die silently because there are no slaves left.
+                    ok;
+                _  ->
+                    broadcast(SPids1, {sync_msgs, Ref, Msgs}),
+                    MPid ! {next, Ref},
+                    syncer_loop(Ref, MPid, SPids1)
+            end;
         {cancel, Ref} ->
             %% We don't tell the slaves we will die - so when we do
             %% they interpret that as a failure, which is what we
similarity index 95%
rename from rabbitmq-server/src/rabbit_node_monitor.erl
rename to deps/rabbit/src/rabbit_node_monitor.erl
index 0322aacfd1511cf6f65d6689da83bdaae1da9b48..bea2a3fa9694eee317c6665a03c2f3fae8cd26cf 100644 (file)
@@ -336,7 +336,17 @@ init([]) ->
     process_flag(trap_exit, true),
     net_kernel:monitor_nodes(true, [nodedown_reason]),
     {ok, _} = mnesia:subscribe(system),
-    {ok, ensure_keepalive_timer(#state{monitors    = pmon:new(),
+    %% If the node has been restarted, Mnesia can trigger a system notification
+    %% before the monitor subscribes to receive them. To avoid autoheal blocking due to
+    %% the inconsistent database event never arriving, we being monitoring all running
+    %% nodes as early as possible. The rest of the monitoring ops will only be triggered
+    %% when notifications arrive.
+    Nodes = possibly_partitioned_nodes(),
+    startup_log(Nodes),
+    Monitors = lists:foldl(fun(Node, Monitors0) ->
+                                  pmon:monitor({rabbit, Node}, Monitors0)
+                          end, pmon:new(), Nodes),
+    {ok, ensure_keepalive_timer(#state{monitors    = Monitors,
                                        subscribers = pmon:new(),
                                        partitions  = [],
                                        guid        = rabbit_guid:gen(),
@@ -486,20 +496,22 @@ handle_cast({partial_partition_disconnect, Other}, State) ->
 %% mnesia propagation.
 handle_cast({node_up, Node, NodeType},
             State = #state{monitors = Monitors}) ->
-    case pmon:is_monitored({rabbit, Node}, Monitors) of
-        true  -> {noreply, State};
-        false -> rabbit_log:info("rabbit on node ~p up~n", [Node]),
-                 {AllNodes, DiscNodes, RunningNodes} = read_cluster_status(),
-                 write_cluster_status({add_node(Node, AllNodes),
-                                       case NodeType of
-                                           disc -> add_node(Node, DiscNodes);
-                                           ram  -> DiscNodes
-                                       end,
-                                       add_node(Node, RunningNodes)}),
-                 ok = handle_live_rabbit(Node),
-                 Monitors1 = pmon:monitor({rabbit, Node}, Monitors),
-                 {noreply, maybe_autoheal(State#state{monitors = Monitors1})}
-    end;
+    rabbit_log:info("rabbit on node ~p up~n", [Node]),
+    {AllNodes, DiscNodes, RunningNodes} = read_cluster_status(),
+    write_cluster_status({add_node(Node, AllNodes),
+                         case NodeType of
+                             disc -> add_node(Node, DiscNodes);
+                             ram  -> DiscNodes
+                         end,
+                         add_node(Node, RunningNodes)}),
+    ok = handle_live_rabbit(Node),
+    Monitors1 = case pmon:is_monitored({rabbit, Node}, Monitors) of
+                   true ->
+                       Monitors;
+                   false ->
+                       pmon:monitor({rabbit, Node}, Monitors)
+               end,
+    {noreply, maybe_autoheal(State#state{monitors = Monitors1})};
 
 handle_cast({joined_cluster, Node, NodeType}, State) ->
     {AllNodes, DiscNodes, RunningNodes} = read_cluster_status(),
@@ -572,7 +584,7 @@ handle_info({mnesia_system_event,
     State1 = case pmon:is_monitored({rabbit, Node}, Monitors) of
                  true  -> State;
                  false -> State#state{
-                            monitors = pmon:monitor({rabbit, Node}, Monitors)}
+                           monitors = pmon:monitor({rabbit, Node}, Monitors)}
              end,
     ok = handle_live_rabbit(Node),
     Partitions1 = lists:usort([Node | Partitions]),
@@ -873,3 +885,12 @@ alive_rabbit_nodes(Nodes) ->
 ping_all() ->
     [net_adm:ping(N) || N <- rabbit_mnesia:cluster_nodes(all)],
     ok.
+
+possibly_partitioned_nodes() ->
+    alive_rabbit_nodes() -- rabbit_mnesia:cluster_nodes(running).
+
+startup_log([]) ->
+    rabbit_log:info("Starting rabbit_node_monitor~n", []);
+startup_log(Nodes) ->
+    rabbit_log:info("Starting rabbit_node_monitor, might be partitioned from ~p~n",
+                   [Nodes]).
diff --git a/deps/rabbit/src/rabbit_pbe.erl b/deps/rabbit/src/rabbit_pbe.erl
new file mode 100644 (file)
index 0000000..f4998d4
--- /dev/null
@@ -0,0 +1,194 @@
+%% The contents of this file are subject to the Mozilla Public License
+%% Version 1.1 (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.mozilla.org/MPL/
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and
+%% limitations under the License.
+%%
+%% The Original Code is RabbitMQ.
+%%
+%% The Initial Developer of the Original Code is GoPivotal, Inc.
+%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
+%%
+
+-module(rabbit_pbe).
+
+-export([supported_ciphers/0, supported_hashes/0, default_cipher/0, default_hash/0, default_iterations/0]).
+-export([encrypt_term/5, decrypt_term/5]).
+-export([encrypt/5, decrypt/5]).
+
+%% Supported ciphers and hashes
+
+supported_ciphers() ->
+    proplists:get_value(ciphers, crypto:supports())
+        -- [aes_ctr, aes_ecb, des_ecb, blowfish_ecb, rc4, aes_gcm].
+
+supported_hashes() ->
+    proplists:get_value(hashs, crypto:supports())
+        -- [md4, ripemd160].
+
+%% Default encryption parameters (keep those in sync with rabbit.app.src)
+default_cipher() ->
+    aes_cbc256.
+
+default_hash() ->
+    sha512.
+
+default_iterations() ->
+    1000.
+
+%% Encryption/decryption of arbitrary Erlang terms.
+
+encrypt_term(Cipher, Hash, Iterations, PassPhrase, Term) ->
+    encrypt(Cipher, Hash, Iterations, PassPhrase, term_to_binary(Term)).
+
+decrypt_term(Cipher, Hash, Iterations, PassPhrase, Base64Binary) ->
+    binary_to_term(decrypt(Cipher, Hash, Iterations, PassPhrase, Base64Binary)).
+
+%% The cipher for encryption is from the list of supported ciphers.
+%% The hash for generating the key from the passphrase is from the list
+%% of supported hashes. See crypto:supports/0 to obtain both lists.
+%% The key is generated by applying the hash N times with N >= 1.
+%%
+%% The encrypt/5 function returns a base64 binary and the decrypt/5
+%% function accepts that same base64 binary.
+
+-spec encrypt(crypto:block_cipher(), crypto:hash_algorithms(),
+    pos_integer(), iodata(), binary()) -> binary().
+encrypt(Cipher, Hash, Iterations, PassPhrase, ClearText) ->
+    Salt = crypto:strong_rand_bytes(16),
+    Ivec = crypto:strong_rand_bytes(iv_length(Cipher)),
+    Key = make_key(Cipher, Hash, Iterations, PassPhrase, Salt),
+    Binary = crypto:block_encrypt(Cipher, Key, Ivec, pad(Cipher, ClearText)),
+    base64:encode(<< Salt/binary, Ivec/binary, Binary/binary >>).
+
+-spec decrypt(crypto:block_cipher(), crypto:hash_algorithms(),
+    pos_integer(), iodata(), binary()) -> binary().
+decrypt(Cipher, Hash, Iterations, PassPhrase, Base64Binary) ->
+    IvLength = iv_length(Cipher),
+    << Salt:16/binary, Ivec:IvLength/binary, Binary/bits >> = base64:decode(Base64Binary),
+    Key = make_key(Cipher, Hash, Iterations, PassPhrase, Salt),
+    unpad(crypto:block_decrypt(Cipher, Key, Ivec, Binary)).
+
+%% Generate a key from a passphrase.
+
+make_key(Cipher, Hash, Iterations, PassPhrase, Salt) ->
+    Key = pbdkdf2(PassPhrase, Salt, Iterations, key_length(Cipher),
+        fun crypto:hmac/4, Hash, hash_length(Hash)),
+    if
+        Cipher =:= des3_cbc; Cipher =:= des3_cbf; Cipher =:= des3_cfb; Cipher =:= des_ede3 ->
+            << A:8/binary, B:8/binary, C:8/binary >> = Key,
+            [A, B, C];
+        true ->
+            Key
+    end.
+
+%% Functions to pad/unpad input to a multiplier of block size.
+
+pad(Cipher, Data) ->
+    BlockSize = block_size(Cipher),
+    N = BlockSize - (byte_size(Data) rem BlockSize),
+    Pad = list_to_binary(lists:duplicate(N, N)),
+    <<Data/binary, Pad/binary>>.
+
+unpad(Data) ->
+    N = binary:last(Data),
+    binary:part(Data, 0, byte_size(Data) - N).
+
+%% These functions are necessary because the current Erlang crypto interface
+%% is lacking interfaces to the following OpenSSL functions:
+%%
+%% * int EVP_MD_size(const EVP_MD *md);
+%% * int EVP_CIPHER_iv_length(const EVP_CIPHER *e);
+%% * int EVP_CIPHER_key_length(const EVP_CIPHER *e);
+%% * int EVP_CIPHER_block_size(const EVP_CIPHER *e);
+
+hash_length(md4) -> 16;
+hash_length(md5) -> 16;
+hash_length(sha) -> 20;
+hash_length(sha224) -> 28;
+hash_length(sha256) -> 32;
+hash_length(sha384) -> 48;
+hash_length(sha512) -> 64.
+
+iv_length(des_cbc) -> 8;
+iv_length(des_cfb) -> 8;
+iv_length(des3_cbc) -> 8;
+iv_length(des3_cbf) -> 8;
+iv_length(des3_cfb) -> 8;
+iv_length(des_ede3) -> 8;
+iv_length(blowfish_cbc) -> 8;
+iv_length(blowfish_cfb64) -> 8;
+iv_length(blowfish_ofb64) -> 8;
+iv_length(rc2_cbc) -> 8;
+iv_length(aes_cbc) -> 16;
+iv_length(aes_cbc128) -> 16;
+iv_length(aes_cfb8) -> 16;
+iv_length(aes_cfb128) -> 16;
+iv_length(aes_cbc256) -> 16;
+iv_length(aes_ige256) -> 32.
+
+key_length(des_cbc) -> 8;
+key_length(des_cfb) -> 8;
+key_length(des3_cbc) -> 24;
+key_length(des3_cbf) -> 24;
+key_length(des3_cfb) -> 24;
+key_length(des_ede3) -> 24;
+key_length(blowfish_cbc) -> 16;
+key_length(blowfish_cfb64) -> 16;
+key_length(blowfish_ofb64) -> 16;
+key_length(rc2_cbc) -> 16;
+key_length(aes_cbc) -> 16;
+key_length(aes_cbc128) -> 16;
+key_length(aes_cfb8) -> 16;
+key_length(aes_cfb128) -> 16;
+key_length(aes_cbc256) -> 32;
+key_length(aes_ige256) -> 16.
+
+block_size(aes_cbc256) -> 32;
+block_size(aes_cbc128) -> 32;
+block_size(aes_ige256) -> 32;
+block_size(aes_cbc) -> 32;
+block_size(_) -> 8.
+
+%% The following was taken from OTP's lib/public_key/src/pubkey_pbe.erl
+%%
+%% This is an undocumented interface to password-based encryption algorithms.
+%% These functions have been copied here to stay compatible with R16B03.
+
+%%--------------------------------------------------------------------
+-spec pbdkdf2(string(), iodata(), integer(), integer(), fun(), atom(), integer())
+            -> binary().
+%%
+%% Description: Implements password based decryption key derive function 2.
+%% Exported mainly for testing purposes.
+%%--------------------------------------------------------------------
+pbdkdf2(Password, Salt, Count, DerivedKeyLen, Prf, PrfHash, PrfOutputLen)->
+    NumBlocks = ceiling(DerivedKeyLen / PrfOutputLen),
+    NumLastBlockOctets = DerivedKeyLen - (NumBlocks - 1) * PrfOutputLen ,
+    blocks(NumBlocks, NumLastBlockOctets, 1, Password, Salt,
+          Count, Prf, PrfHash, PrfOutputLen, <<>>).
+
+blocks(1, N, Index, Password, Salt, Count, Prf, PrfHash, PrfLen, Acc) ->
+    <<XorSum:N/binary, _/binary>> = xor_sum(Password, Salt, Count, Index, Prf, PrfHash, PrfLen),
+    <<Acc/binary, XorSum/binary>>;
+blocks(NumBlocks, N, Index, Password, Salt, Count, Prf, PrfHash, PrfLen, Acc) ->
+    XorSum = xor_sum(Password, Salt, Count, Index, Prf, PrfHash, PrfLen),
+    blocks(NumBlocks -1, N, Index +1, Password, Salt, Count, Prf, PrfHash,
+          PrfLen, <<Acc/binary, XorSum/binary>>).
+
+xor_sum(Password, Salt, Count, Index, Prf, PrfHash, PrfLen) ->
+    Result = Prf(PrfHash, Password, [Salt,<<Index:32/unsigned-big-integer>>], PrfLen),
+    do_xor_sum(Prf, PrfHash, PrfLen, Result, Password, Count-1, Result).
+
+do_xor_sum(_, _, _, _, _, 0, Acc) ->
+    Acc;
+do_xor_sum(Prf, PrfHash, PrfLen, Prev, Password, Count, Acc) ->
+    Result = Prf(PrfHash, Password, Prev, PrfLen),
+    do_xor_sum(Prf, PrfHash, PrfLen, Result, Password, Count-1, crypto:exor(Acc, Result)).
+
+ceiling(Float) ->
+    erlang:round(Float + 0.5).
similarity index 98%
rename from rabbitmq-server/src/rabbit_policy.erl
rename to deps/rabbit/src/rabbit_policy.erl
index eb8cf6332737049c6a2ce609593cb1e38d68f2b9..a9caadf97289ca0e85c2d04c6bc40c0fcda6b701 100644 (file)
@@ -276,7 +276,9 @@ update_queue(Q = #amqqueue{name = QName, policy = OldPolicy}, Policies) ->
         NewPolicy -> case rabbit_amqqueue:update(
                        QName, fun(Q1) ->
                                       rabbit_queue_decorator:set(
-                                        Q1#amqqueue{policy = NewPolicy})
+                                        Q1#amqqueue{policy = NewPolicy,
+                                            policy_version =
+                                            Q1#amqqueue.policy_version + 1 })
                               end) of
                          #amqqueue{} = Q1 -> {Q, Q1};
                          not_found        -> {Q, Q }
similarity index 95%
rename from rabbitmq-server/src/rabbit_upgrade_functions.erl
rename to deps/rabbit/src/rabbit_upgrade_functions.erl
index 67c2a84a0ea118eb60f8066009adaca7afa9dade..8609a0e424846a019df7f7412f60e2352e2ab6a3 100644 (file)
@@ -51,6 +51,7 @@
 -rabbit_upgrade({down_slave_nodes,      mnesia, [queue_decorators]}).
 -rabbit_upgrade({queue_state,           mnesia, [down_slave_nodes]}).
 -rabbit_upgrade({recoverable_slaves,    mnesia, [queue_state]}).
+-rabbit_upgrade({policy_version,        mnesia, [recoverable_slaves]}).
 -rabbit_upgrade({user_password_hashing, mnesia, [hash_passwords]}).
 
 %% -------------------------------------------------------------------
@@ -433,6 +434,24 @@ recoverable_slaves(Table) ->
        sync_slave_pids, recoverable_slaves, policy, gm_pids, decorators,
        state]).
 
+policy_version() ->
+    ok = policy_version(rabbit_queue),
+    ok = policy_version(rabbit_durable_queue).
+
+policy_version(Table) ->
+    transform(
+      Table,
+      fun ({amqqueue, Name, Durable, AutoDelete, ExclusiveOwner, Arguments,
+            Pid, SlavePids, SyncSlavePids, DSN, Policy, GmPids, Decorators,
+            State}) ->
+              {amqqueue, Name, Durable, AutoDelete, ExclusiveOwner, Arguments,
+               Pid, SlavePids, SyncSlavePids, DSN, Policy, GmPids, Decorators,
+               State, 0}
+      end,
+      [name, durable, auto_delete, exclusive_owner, arguments, pid, slave_pids,
+       sync_slave_pids, recoverable_slaves, policy, gm_pids, decorators, state,
+       policy_version]).
+
 %% Prior to 3.6.0, passwords were hashed using MD5, this populates
 %% existing records with said default.  Users created with 3.6.0+ will
 %% have internal_user.hashing_algorithm populated by the internal
similarity index 96%
rename from rabbitmq-server/src/rabbit_variable_queue.erl
rename to deps/rabbit/src/rabbit_variable_queue.erl
index 9ad752a174b4aa227d61f3db9f527e84084bfc37..dd9225614666c163de9e2f6fc4a12d206b79be8e 100644 (file)
           io_batch_size,
 
           %% default queue or lazy queue
-          mode
+          mode,
+          %% number of reduce_memory_usage executions, once it
+          %% reaches a threshold the queue will manually trigger a runtime GC
+               %% see: maybe_execute_gc/1
+          memory_reduction_run_count
         }).
 
 -record(rates, { in, out, ack_in, ack_out, timestamp }).
              disk_write_count      :: non_neg_integer(),
 
              io_batch_size         :: pos_integer(),
-             mode                  :: 'default' | 'lazy' }.
+             mode                  :: 'default' | 'lazy',
+             memory_reduction_run_count :: non_neg_integer()}.
 %% Duplicated from rabbit_backing_queue
 -spec ack([ack()], state()) -> {[rabbit_guid:guid()], state()}.
 
 %% rabbit_amqqueue_process need fairly fresh rates.
 -define(MSGS_PER_RATE_CALC, 100).
 
+
+%% we define the garbage collector threshold
+%% it needs to tune the GC calls inside `reduce_memory_use`
+%% see: rabbitmq-server-973 and `maybe_execute_gc` function
+-define(DEFAULT_EXPLICIT_GC_RUN_OP_THRESHOLD, 250).
+-define(EXPLICIT_GC_RUN_OP_THRESHOLD,
+    case get(explicit_gc_run_operation_threshold) of
+        undefined ->
+            Val = rabbit_misc:get_env(rabbit, lazy_queue_explicit_gc_run_operation_threshold,
+                ?DEFAULT_EXPLICIT_GC_RUN_OP_THRESHOLD),
+            put(explicit_gc_run_operation_threshold, Val),
+            Val;
+        Val       -> Val
+    end).
+
 %%----------------------------------------------------------------------------
 %% Public API
 %%----------------------------------------------------------------------------
@@ -633,25 +653,28 @@ ack([], State) ->
 %% optimisation: this head is essentially a partial evaluation of the
 %% general case below, for the single-ack case.
 ack([SeqId], State) ->
-    {#msg_status { msg_id        = MsgId,
-                   is_persistent = IsPersistent,
-                   msg_in_store  = MsgInStore,
-                   index_on_disk = IndexOnDisk },
-     State1 = #vqstate { index_state       = IndexState,
-                         msg_store_clients = MSCState,
-                         ack_out_counter   = AckOutCount }} =
-        remove_pending_ack(true, SeqId, State),
-    IndexState1 = case IndexOnDisk of
-                      true  -> rabbit_queue_index:ack([SeqId], IndexState);
-                      false -> IndexState
-                  end,
-    case MsgInStore of
-        true  -> ok = msg_store_remove(MSCState, IsPersistent, [MsgId]);
-        false -> ok
-    end,
-    {[MsgId],
-     a(State1 #vqstate { index_state      = IndexState1,
-                         ack_out_counter  = AckOutCount + 1 })};
+    case remove_pending_ack(true, SeqId, State) of
+        {none, _} ->
+            State;
+        {#msg_status { msg_id        = MsgId,
+                       is_persistent = IsPersistent,
+                       msg_in_store  = MsgInStore,
+                       index_on_disk = IndexOnDisk },
+         State1 = #vqstate { index_state       = IndexState,
+                             msg_store_clients = MSCState,
+                             ack_out_counter   = AckOutCount }} ->
+            IndexState1 = case IndexOnDisk of
+                              true  -> rabbit_queue_index:ack([SeqId], IndexState);
+                              false -> IndexState
+                          end,
+            case MsgInStore of
+                true  -> ok = msg_store_remove(MSCState, IsPersistent, [MsgId]);
+                false -> ok
+            end,
+            {[MsgId],
+             a(State1 #vqstate { index_state      = IndexState1,
+                                 ack_out_counter  = AckOutCount + 1 })}
+    end;
 ack(AckTags, State) ->
     {{IndexOnDiskSeqIds, MsgIdsByStore, AllMsgIds},
      State1 = #vqstate { index_state       = IndexState,
@@ -659,8 +682,12 @@ ack(AckTags, State) ->
                          ack_out_counter   = AckOutCount }} =
         lists:foldl(
           fun (SeqId, {Acc, State2}) ->
-                  {MsgStatus, State3} = remove_pending_ack(true, SeqId, State2),
-                  {accumulate_ack(MsgStatus, Acc), State3}
+                  case remove_pending_ack(true, SeqId, State2) of
+                      {none, _} ->
+                          {Acc, State2};
+                      {MsgStatus, State3} ->
+                          {accumulate_ack(MsgStatus, Acc), State3}
+                  end
           end, {accumulate_ack_init(), State}, AckTags),
     IndexState1 = rabbit_queue_index:ack(IndexOnDiskSeqIds, IndexState),
     remove_msgs_by_id(MsgIdsByStore, MSCState),
@@ -939,7 +966,7 @@ convert_to_lazy(State) ->
             %% is not in a proper state for a lazy BQ (unless all
             %% messages have been paged to disk already).
             wait_for_msg_store_credit(),
-            convert_to_lazy(State1)
+            convert_to_lazy(resume(State1))
     end.
 
 wait_for_msg_store_credit() ->
@@ -1330,7 +1357,8 @@ init(IsDurable, IndexState, DeltaCount, DeltaBytes, Terms,
 
       io_batch_size       = IoBatchSize,
 
-      mode                = default },
+      mode                = default,
+      memory_reduction_run_count = 0},
     a(maybe_deltas_to_betas(State)).
 
 blank_rates(Now) ->
@@ -1977,8 +2005,12 @@ lookup_pending_ack(SeqId, #vqstate { ram_pending_ack  = RPA,
 
 %% First parameter = UpdateStats
 remove_pending_ack(true, SeqId, State) ->
-    {MsgStatus, State1} = remove_pending_ack(false, SeqId, State),
-    {MsgStatus, stats({0, -1}, {MsgStatus, none}, State1)};
+    case remove_pending_ack(false, SeqId, State) of
+        {none, _} ->
+            {none, State};
+        {MsgStatus, State1} ->
+            {MsgStatus, stats({0, -1}, {MsgStatus, none}, State1)}
+    end;
 remove_pending_ack(false, SeqId, State = #vqstate{ram_pending_ack  = RPA,
                                                   disk_pending_ack = DPA,
                                                   qi_pending_ack   = QPA}) ->
@@ -1990,9 +2022,13 @@ remove_pending_ack(false, SeqId, State = #vqstate{ram_pending_ack  = RPA,
                               DPA1 = gb_trees:delete(SeqId, DPA),
                               {V, State#vqstate{disk_pending_ack = DPA1}};
                           none ->
-                              QPA1 = gb_trees:delete(SeqId, QPA),
-                              {gb_trees:get(SeqId, QPA),
-                               State#vqstate{qi_pending_ack = QPA1}}
+                              case gb_trees:lookup(SeqId, QPA) of
+                                  {value, V} ->
+                                      QPA1 = gb_trees:delete(SeqId, QPA),
+                                      {V, State#vqstate{qi_pending_ack = QPA1}};
+                                  none ->
+                                      {none, State}
+                              end
                       end
     end.
 
@@ -2143,11 +2179,15 @@ queue_merge([SeqId | Rest] = SeqIds, Q, Front, MsgIds,
                         Limit, PubFun, State);
         {_, _Q1} ->
             %% enqueue from the remaining list of sequence ids
-            {MsgStatus, State1} = msg_from_pending_ack(SeqId, State),
-            {#msg_status { msg_id = MsgId } = MsgStatus1, State2} =
-                PubFun(MsgStatus, State1),
-            queue_merge(Rest, Q, ?QUEUE:in(MsgStatus1, Front), [MsgId | MsgIds],
-                        Limit, PubFun, State2)
+            case msg_from_pending_ack(SeqId, State) of
+                {none, _} ->
+                    queue_merge(Rest, Q, Front, MsgIds, Limit, PubFun, State);
+                {MsgStatus, State1} ->
+                    {#msg_status { msg_id = MsgId } = MsgStatus1, State2} =
+                        PubFun(MsgStatus, State1),
+                    queue_merge(Rest, Q, ?QUEUE:in(MsgStatus1, Front), [MsgId | MsgIds],
+                                Limit, PubFun, State2)
+            end
     end;
 queue_merge(SeqIds, Q, Front, MsgIds,
             _Limit, _PubFun, State) ->
@@ -2156,22 +2196,28 @@ queue_merge(SeqIds, Q, Front, MsgIds,
 delta_merge([], Delta, MsgIds, State) ->
     {Delta, MsgIds, State};
 delta_merge(SeqIds, Delta, MsgIds, State) ->
-    lists:foldl(fun (SeqId, {Delta0, MsgIds0, State0}) ->
-                        {#msg_status { msg_id = MsgId } = MsgStatus, State1} =
-                            msg_from_pending_ack(SeqId, State0),
-                        {_MsgStatus, State2} =
-                            maybe_prepare_write_to_disk(true, true, MsgStatus, State1),
-                        {expand_delta(SeqId, Delta0), [MsgId | MsgIds0],
-                         stats({1, -1}, {MsgStatus, none}, State2)}
+    lists:foldl(fun (SeqId, {Delta0, MsgIds0, State0} = Acc) ->
+                        case msg_from_pending_ack(SeqId, State0) of
+                            {none, _} ->
+                                Acc;
+                        {#msg_status { msg_id = MsgId } = MsgStatus, State1} ->
+                                {_MsgStatus, State2} =
+                                    maybe_prepare_write_to_disk(true, true, MsgStatus, State1),
+                                {expand_delta(SeqId, Delta0), [MsgId | MsgIds0],
+                                 stats({1, -1}, {MsgStatus, none}, State2)}
+                        end
                 end, {Delta, MsgIds, State}, SeqIds).
 
 %% Mostly opposite of record_pending_ack/2
 msg_from_pending_ack(SeqId, State) ->
-    {#msg_status { msg_props = MsgProps } = MsgStatus, State1} =
-        remove_pending_ack(false, SeqId, State),
-    {MsgStatus #msg_status {
-       msg_props = MsgProps #message_properties { needs_confirming = false } },
-     State1}.
+    case remove_pending_ack(false, SeqId, State) of
+        {none, _} ->
+            {none, State};
+        {#msg_status { msg_props = MsgProps } = MsgStatus, State1} ->
+            {MsgStatus #msg_status {
+               msg_props = MsgProps #message_properties { needs_confirming = false } },
+             State1}
+    end.
 
 beta_limit(Q) ->
     case ?QUEUE:peek(Q) of
@@ -2264,6 +2310,14 @@ ifold(Fun, Acc, Its, State) ->
 %% Phase changes
 %%----------------------------------------------------------------------------
 
+maybe_execute_gc(State = #vqstate {memory_reduction_run_count = MRedRunCount}) ->
+    case MRedRunCount >= ?EXPLICIT_GC_RUN_OP_THRESHOLD of
+       true -> garbage_collect(),
+                State#vqstate{memory_reduction_run_count =  0};
+        false ->    State#vqstate{memory_reduction_run_count =  MRedRunCount + 1}
+
+    end.
+
 reduce_memory_use(State = #vqstate { target_ram_count = infinity }) ->
     State;
 reduce_memory_use(State = #vqstate {
@@ -2336,8 +2390,7 @@ reduce_memory_use(State = #vqstate {
             S2 ->
                 push_betas_to_deltas(S2, State1)
         end,
-    garbage_collect(),
-    State3.
+    maybe_execute_gc(State3).
 
 limit_ram_acks(0, State) ->
     {0, ui(State)};
diff --git a/deps/rabbit_common/LICENSE b/deps/rabbit_common/LICENSE
new file mode 100644 (file)
index 0000000..f994905
--- /dev/null
@@ -0,0 +1,8 @@
+This package, the RabbitMQ commons library, is licensed under the MPL. For the
+MPL, please see LICENSE-MPL-RabbitMQ.
+
+The files 'ec_semver.erl' and 'ec_semver_parser.erl' are Copyright (c) 2011
+Erlware, LLC and licensed under a MIT license, see LICENSE-MIT-Erlware-Commons.
+
+If you have any questions regarding licensing, please contact us at
+info@rabbitmq.com.
diff --git a/deps/rabbit_common/LICENSE-MIT-Erlware-Commons b/deps/rabbit_common/LICENSE-MIT-Erlware-Commons
new file mode 100644 (file)
index 0000000..fc89c02
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2011 Erlware, LLC
+
+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.
+
similarity index 97%
rename from rabbitmq-server/deps/rabbit_common/Makefile
rename to deps/rabbit_common/Makefile
index 4b8a7de7b3e7d4c92abbe4439effec9a8f8b7a7f..678acefd407de0184e22007ccb72ad796e61c938 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbit_common
 
 BUILD_DEPS = rabbitmq_codegen
-TEST_DEPS = mochiweb
+TEST_DEPS = mochiweb proper
 
 .DEFAULT_GOAL = all
 
@@ -22,6 +22,7 @@ include mk/rabbitmq-components.mk
 include erlang.mk
 include mk/rabbitmq-build.mk
 include mk/rabbitmq-dist.mk
+include mk/rabbitmq-tools.mk
 
 # --------------------------------------------------------------------
 # Compilation.
similarity index 97%
rename from rabbitmq-server/deps/rabbitmq_amqp1_0/erlang.mk
rename to deps/rabbit_common/erlang.mk
index f7ca7bebb76849368b9a6bf56f1bdea9e847604d..6d2a31c974f3a762751bb19a108f2c5ff4abc0ba 100644 (file)
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
 
 ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
 
-ERLANG_MK_VERSION = 2.0.0-pre.2-132-g62d576b
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
 
 # Core configuration.
 
@@ -110,8 +110,8 @@ help::
                "  all           Run deps, app and rel targets in that order" \
                "  app           Compile the project" \
                "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
                "  search q=...  Search for a package in the built-in index" \
                "  rel           Build a release for this project, if applicable" \
                "  docs          Build the documentation for this project" \
@@ -406,14 +406,6 @@ pkg_bootstrap_fetch = git
 pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
 pkg_bootstrap_commit = master
 
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
 PACKAGES += boss_db
 pkg_boss_db_name = boss_db
 pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
@@ -422,6 +414,14 @@ pkg_boss_db_fetch = git
 pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
 pkg_boss_db_commit = master
 
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
 PACKAGES += brod
 pkg_brod_name = brod
 pkg_brod_description = Kafka client in Erlang
@@ -518,6 +518,14 @@ pkg_chronos_fetch = git
 pkg_chronos_repo = https://github.com/lehoff/chronos
 pkg_chronos_commit = master
 
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
 PACKAGES += cl
 pkg_cl_name = cl
 pkg_cl_description = OpenCL binding for Erlang
@@ -558,13 +566,13 @@ pkg_cloudi_service_api_requests_fetch = git
 pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
 pkg_cloudi_service_api_requests_commit = master
 
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
 
 PACKAGES += cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
@@ -574,14 +582,6 @@ pkg_cloudi_service_db_cassandra_fetch = git
 pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_commit = master
 
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
 PACKAGES += cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
@@ -638,6 +638,14 @@ pkg_cloudi_service_db_tokyotyrant_fetch = git
 pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
 pkg_cloudi_service_db_tokyotyrant_commit = master
 
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
 PACKAGES += cloudi_service_filesystem
 pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
 pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
@@ -1030,14 +1038,6 @@ pkg_edown_fetch = git
 pkg_edown_repo = https://github.com/uwiger/edown
 pkg_edown_commit = master
 
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
 PACKAGES += eep_app
 pkg_eep_app_name = eep_app
 pkg_eep_app_description = Embedded Event Processing
@@ -1046,6 +1046,14 @@ pkg_eep_app_fetch = git
 pkg_eep_app_repo = https://github.com/darach/eep-erl
 pkg_eep_app_commit = master
 
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
 PACKAGES += efene
 pkg_efene_name = efene
 pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
@@ -1230,14 +1238,6 @@ pkg_eqm_fetch = git
 pkg_eqm_repo = https://github.com/loucash/eqm
 pkg_eqm_commit = master
 
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
 PACKAGES += eredis_pool
 pkg_eredis_pool_name = eredis_pool
 pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
@@ -1246,6 +1246,14 @@ pkg_eredis_pool_fetch = git
 pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
 pkg_eredis_pool_commit = master
 
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
 PACKAGES += erl_streams
 pkg_erl_streams_name = erl_streams
 pkg_erl_streams_description = Streams in Erlang
@@ -1534,14 +1542,6 @@ pkg_etap_fetch = git
 pkg_etap_repo = https://github.com/ngerakines/etap
 pkg_etap_commit = master
 
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
 PACKAGES += etest_http
 pkg_etest_http_name = etest_http
 pkg_etest_http_description = etest Assertions around HTTP (client-side)
@@ -1550,6 +1550,14 @@ pkg_etest_http_fetch = git
 pkg_etest_http_repo = https://github.com/wooga/etest_http
 pkg_etest_http_commit = master
 
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
 PACKAGES += etoml
 pkg_etoml_name = etoml
 pkg_etoml_description = TOML language erlang parser
@@ -1558,14 +1566,6 @@ pkg_etoml_fetch = git
 pkg_etoml_repo = https://github.com/kalta/etoml
 pkg_etoml_commit = master
 
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
 PACKAGES += eunit_formatters
 pkg_eunit_formatters_name = eunit_formatters
 pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
@@ -1574,6 +1574,14 @@ pkg_eunit_formatters_fetch = git
 pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
 pkg_eunit_formatters_commit = master
 
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
 PACKAGES += euthanasia
 pkg_euthanasia_name = euthanasia
 pkg_euthanasia_description = Merciful killer for your Erlang processes
@@ -1710,14 +1718,6 @@ pkg_fn_fetch = git
 pkg_fn_repo = https://github.com/reiddraper/fn
 pkg_fn_commit = master
 
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
 PACKAGES += folsom_cowboy
 pkg_folsom_cowboy_name = folsom_cowboy
 pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
@@ -1726,6 +1726,14 @@ pkg_folsom_cowboy_fetch = git
 pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
 pkg_folsom_cowboy_commit = master
 
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
 PACKAGES += folsomite
 pkg_folsomite_name = folsomite
 pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
@@ -2086,14 +2094,6 @@ pkg_jesse_fetch = git
 pkg_jesse_repo = https://github.com/for-GET/jesse
 pkg_jesse_commit = master
 
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
 PACKAGES += jiffy_v
 pkg_jiffy_v_name = jiffy_v
 pkg_jiffy_v_description = JSON validation utility
@@ -2102,6 +2102,14 @@ pkg_jiffy_v_fetch = git
 pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
 pkg_jiffy_v_commit = master
 
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
 PACKAGES += jobs
 pkg_jobs_name = jobs
 pkg_jobs_description = a Job scheduler for load regulation
@@ -2118,14 +2126,6 @@ pkg_joxa_fetch = git
 pkg_joxa_repo = https://github.com/joxa/joxa
 pkg_joxa_commit = master
 
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
 PACKAGES += json_rec
 pkg_json_rec_name = json_rec
 pkg_json_rec_description = JSON to erlang record
@@ -2134,6 +2134,14 @@ pkg_json_rec_fetch = git
 pkg_json_rec_repo = https://github.com/justinkirby/json_rec
 pkg_json_rec_commit = master
 
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
 PACKAGES += jsone
 pkg_jsone_name = jsone
 pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
@@ -2174,14 +2182,6 @@ pkg_jsx_fetch = git
 pkg_jsx_repo = https://github.com/talentdeficit/jsx
 pkg_jsx_commit = master
 
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
 PACKAGES += kafka_protocol
 pkg_kafka_protocol_name = kafka_protocol
 pkg_kafka_protocol_description = Kafka protocol Erlang library
@@ -2190,6 +2190,14 @@ pkg_kafka_protocol_fetch = git
 pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
 pkg_kafka_protocol_commit = master
 
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
 PACKAGES += kai
 pkg_kai_name = kai
 pkg_kai_description = DHT storage by Takeshi Inoue
@@ -2286,14 +2294,6 @@ pkg_kvs_fetch = git
 pkg_kvs_repo = https://github.com/synrc/kvs
 pkg_kvs_commit = master
 
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
 PACKAGES += lager_amqp_backend
 pkg_lager_amqp_backend_name = lager_amqp_backend
 pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
@@ -2310,6 +2310,14 @@ pkg_lager_syslog_fetch = git
 pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
 pkg_lager_syslog_commit = master
 
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
 PACKAGES += lambdapad
 pkg_lambdapad_name = lambdapad
 pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
@@ -2566,14 +2574,6 @@ pkg_mixer_fetch = git
 pkg_mixer_repo = https://github.com/chef/mixer
 pkg_mixer_commit = master
 
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
 PACKAGES += mochiweb_xpath
 pkg_mochiweb_xpath_name = mochiweb_xpath
 pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
@@ -2582,6 +2582,14 @@ pkg_mochiweb_xpath_fetch = git
 pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
 pkg_mochiweb_xpath_commit = master
 
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
 PACKAGES += mockgyver
 pkg_mockgyver_name = mockgyver
 pkg_mockgyver_description = A mocking library for Erlang
@@ -3054,14 +3062,6 @@ pkg_quickrand_fetch = git
 pkg_quickrand_repo = https://github.com/okeuday/quickrand
 pkg_quickrand_commit = master
 
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
 PACKAGES += rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
@@ -3070,6 +3070,14 @@ pkg_rabbit_exchange_type_riak_fetch = git
 pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
 pkg_rabbit_exchange_type_riak_commit = master
 
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
 PACKAGES += rack
 pkg_rack_name = rack
 pkg_rack_description = Rack handler for erlang
@@ -3534,14 +3542,6 @@ pkg_stable_fetch = git
 pkg_stable_repo = https://github.com/dvv/stable
 pkg_stable_commit = master
 
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
 PACKAGES += statebox_riak
 pkg_statebox_riak_name = statebox_riak
 pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
@@ -3550,6 +3550,14 @@ pkg_statebox_riak_fetch = git
 pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
 pkg_statebox_riak_commit = master
 
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
 PACKAGES += statman
 pkg_statman_name = statman
 pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
@@ -4131,19 +4139,35 @@ dep_verbose = $(dep_verbose_$(V))
 
 # Core targets.
 
-ifneq ($(SKIP_DEPS),)
-deps::
+ifdef IS_APP
+apps::
 else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               mkdir -p $$dep/ebin; \
+               mkdir -p $$dep/ebin || exit $$?; \
        done
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
        done
 endif
-ifneq ($(IS_DEP),1)
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
        $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
 endif
        $(verbose) mkdir -p $(ERLANG_MK_TMP)
@@ -4672,11 +4696,11 @@ endif
 # Forward-declare variables used in core/deps-tools.mk. This is required
 # in case plugins use them.
 
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
 
 # External plugins.
 
@@ -6112,14 +6136,17 @@ help::
 # Plugin-specific targets.
 
 define filter_opts.erl
-       Opts = binary:split(<<"$1">>, <<"-">>, [global]),
-       Filtered = lists:reverse(lists:foldl(fun
-               (O = <<"pa ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"D ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"I ", _/bits>>, Acc) -> [O|Acc];
-               (_, Acc) -> Acc
-       end, [], Opts)),
-       io:format("~s~n", [[["-", O] || O <- Filtered]]),
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
        halt().
 endef
 
@@ -6136,7 +6163,7 @@ dialyze:
 else
 dialyze: $(DIALYZER_PLT)
 endif
-       $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
@@ -6451,9 +6478,9 @@ endif
 # Configuration.
 
 ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
+       XREFR_ARGS :=
 else
-       XREF_ARGS := -c $(XREF_CONFIG)
+       XREFR_ARGS := -c $(XREF_CONFIG)
 endif
 
 XREFR ?= $(CURDIR)/xrefr
@@ -6605,62 +6632,95 @@ endif
 endif # ifneq ($(COVER_REPORT_DIR),)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
-# Fetch dependencies (without building them).
+# Fetch dependencies recursively (without building them).
 
 .PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
        fetch-shell-deps
 
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
 ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
 else
 # By default, we fetch "normal" dependencies. They are also included no
 # matter the type of requested dependencies.
 #
 # $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
 
 # Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
 # dependencies with a single target.
 ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
 endif
 ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
 endif
 ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
 endif
 ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
 endif
 
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 ifndef IS_APP
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
        done
 endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
        $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
                        if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
                         $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
                        fi \
                fi \
        done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 endif # ifneq ($(SKIP_DEPS),)
 
 # List dependencies recursively.
@@ -6668,108 +6728,11 @@ endif # ifneq ($(SKIP_DEPS),)
 .PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
        list-shell-deps
 
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
 list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
 list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
 list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
 list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
 list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
 
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
 list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
+       $(verbose) cat $^
similarity index 98%
rename from rabbitmq-server/deps/rabbit_common/include/rabbit.hrl
rename to deps/rabbit_common/include/rabbit.hrl
index 85f18629f3b0c3ec4ee69b7803d7f05fe0a1a5b7..a514390bdda7456d5918af199b9557ba04ae2050 100644 (file)
@@ -78,7 +78,8 @@
           policy,                      %% durable, implicit update as above
           gm_pids,                     %% transient
           decorators,                  %% transient, recalculated as above
-          state}).                     %% durable (have we crashed?)
+          state,                       %% durable (have we crashed?)
+          policy_version}).
 
 -record(exchange_serial, {name, next}).
 
similarity index 97%
rename from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-build.mk
rename to deps/rabbit_common/mk/rabbitmq-build.mk
index 02842aeaec9568bcbace2f5a1266b47608e5b9a0..52b3ed3bd86ececae978604be7f689b3020fdafc 100644 (file)
@@ -5,6 +5,8 @@
 # FIXME: We copy Erlang.mk default flags here: rabbitmq-build.mk is
 # loaded as a plugin, so before those variables are defined. And because
 # Erlang.mk uses '?=', the flags we set here override the default set.
+#
+# See: https://github.com/ninenines/erlang.mk/issues/502
 
 WARNING_OPTS += +debug_info \
                +warn_export_vars \
similarity index 88%
rename from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/rabbitmq-components.mk
rename to deps/rabbit_common/mk/rabbitmq-components.mk
index eb9e9e3e030aa3ca626eeabf028b8abe1601733d..05986d82ce9ccb40e04a478f9bfeb242040c9c52 100644 (file)
@@ -5,16 +5,6 @@ ifeq ($(.DEFAULT_GOAL),)
 .DEFAULT_GOAL = all
 endif
 
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
 # --------------------------------------------------------------------
 # RabbitMQ components.
 # --------------------------------------------------------------------
@@ -38,6 +28,7 @@ dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $
 dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
@@ -59,6 +50,7 @@ dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_r
 dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
@@ -98,6 +90,7 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_clusterer \
                      rabbitmq_codegen \
                      rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
                      rabbitmq_delayed_message_exchange \
                      rabbitmq_dotnet_client \
                      rabbitmq_event_exchange \
@@ -119,11 +112,11 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_recent_history_exchange \
                      rabbitmq_routing_node_stamp \
                      rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
                      rabbitmq_sharding \
                      rabbitmq_shovel \
                      rabbitmq_shovel_management \
                      rabbitmq_stomp \
-                     rabbitmq_test \
                      rabbitmq_toke \
                      rabbitmq_top \
                      rabbitmq_tracing \
@@ -246,59 +239,10 @@ list-dist-deps::
 prepare-dist::
        @:
 
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
 # --------------------------------------------------------------------
 # rabbitmq-components.mk checks.
 # --------------------------------------------------------------------
 
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
 # If this project is under the Umbrella project, we override $(DEPS_DIR)
 # to point to the Umbrella's one. We also disable `make distclean` so
 # $(DEPS_DIR) is not accidentally removed.
@@ -312,11 +256,6 @@ endif
 ifeq ($(UNDER_UMBRELLA),1)
 ifneq ($(PROJECT),rabbitmq_public_umbrella)
 DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
 endif
 
 ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
similarity index 89%
rename from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-dist.mk
rename to deps/rabbit_common/mk/rabbitmq-dist.mk
index b044606fd3322f232c389de43596c6840cd25767..94fef98a148b277c9d050c0c2e7de50fc8bf5fb7 100644 (file)
@@ -64,7 +64,11 @@ endef
 #   $(call ez_target,app_name)
 
 define ez_target
-dist_$(1)_appdir = $$(if $$(filter $(PROJECT),$(1)),$(CURDIR),$(DEPS_DIR)/$(1))
+dist_$(1)_appdir = $$(if $$(filter $(PROJECT),$(1)), \
+                       $(CURDIR), \
+                       $$(if $$(shell test -d $(APPS_DIR)/$(1) && echo OK), \
+                             $(APPS_DIR)/$(1), \
+                             $(DEPS_DIR)/$(1)))
 dist_$(1)_appfile = $$(dist_$(1)_appdir)/ebin/$(1).app
 
 $$(if $$(shell test -f $$(dist_$(1)_appfile) && echo OK), \
@@ -125,11 +129,13 @@ $(DIST_DIR)/%.ez:
 # We need to recurse because the top-level make instance is evaluated
 # before dependencies are downloaded.
 
+MAYBE_APPS_LIST = $(if $(shell test -f $(ERLANG_MK_TMP)/apps.log && echo OK),$(ERLANG_MK_TMP)/apps.log)
+
 dist:: $(ERLANG_MK_RECURSIVE_DEPS_LIST) all
-       $(gen_verbose) $(MAKE) do-dist DIST_PLUGINS_LIST=$(ERLANG_MK_RECURSIVE_DEPS_LIST)
+       $(gen_verbose) $(MAKE) do-dist DIST_PLUGINS_LIST="$(ERLANG_MK_RECURSIVE_DEPS_LIST) $(MAYBE_APPS_LIST)"
 
 test-dist:: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) test-build
-       $(gen_verbose) $(MAKE) do-dist DIST_PLUGINS_LIST=$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+       $(gen_verbose) $(MAKE) do-dist DIST_PLUGINS_LIST="$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) $(MAYBE_APPS_LIST)"
 
 do-dist:: $(DIST_EZS)
        $(verbose) unwanted='$(filter-out $(DIST_EZS),$(wildcard $(DIST_DIR)/*.ez))'; \
similarity index 79%
rename from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-plugin.mk
rename to deps/rabbit_common/mk/rabbitmq-plugin.mk
index 906ed029ddfb13eda8a36e12de0286f2f1369741..2e0db8e07f3c18c2fb28ebb4c9e89590cdea4852 100644 (file)
@@ -10,10 +10,6 @@ ifeq ($(filter rabbitmq-run.mk,$(notdir $(MAKEFILE_LIST))),)
 include $(dir $(lastword $(MAKEFILE_LIST)))rabbitmq-run.mk
 endif
 
-ifeq ($(filter rabbitmq-tests.mk,$(notdir $(MAKEFILE_LIST))),)
-include $(dir $(lastword $(MAKEFILE_LIST)))rabbitmq-tests.mk
-endif
-
 ifeq ($(filter rabbitmq-tools.mk,$(notdir $(MAKEFILE_LIST))),)
 include $(dir $(lastword $(MAKEFILE_LIST)))rabbitmq-tools.mk
 endif
similarity index 69%
rename from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-run.mk
rename to deps/rabbit_common/mk/rabbitmq-run.mk
index db7927277582c337e134b7d6ad40154b3a117d43..5bf78b3c4f295ec2d82c88615f78bd6274e651e2 100644 (file)
@@ -1,8 +1,7 @@
 .PHONY: run-broker run-background-broker run-node run-background-node \
-       run-tests run-lazy-vq-tests run-qc \
        start-background-node start-rabbit-on-node \
        stop-rabbit-on-node set-resource-alarm clear-resource-alarm \
-       stop-node clean-node-db start-cover stop-cover
+       stop-node
 
 ifeq ($(filter rabbitmq-dist.mk,$(notdir $(MAKEFILE_LIST))),)
 include $(dir $(lastword $(MAKEFILE_LIST)))rabbitmq-dist.mk
@@ -105,17 +104,7 @@ BASIC_SCRIPT_ENV_SETTINGS = \
        $(call basic_script_env_settings,$(RABBITMQ_NODENAME),$(RABBITMQ_NODENAME_FOR_PATHS),$(RABBITMQ_NODE_PORT)) \
        RABBITMQ_ENABLED_PLUGINS_FILE="$(RABBITMQ_ENABLED_PLUGINS_FILE)"
 
-# NOTE: Running a plugin requires RabbitMQ itself. As this file is
-# loaded *after* erlang.mk, it is too late to add "rabbit" to the
-# dependencies. Therefore, this is done in rabbitmq-components.mk.
-#
-# rabbitmq-components.mk knows the list of targets which starts
-# a broker. When we add a target here, it needs to be listed in
-# rabbitmq-components.mk as well.
-#
-# FIXME: This is fragile, how can we fix this?
-
-ERL_CALL ?= erl_call
+ERL_CALL := $(shell $(ERL) -eval 'io:format("~s~n", [filename:join(code:lib_dir(erl_interface, bin), case os:type() of {win32, _} -> "erl_call.exe"; _ -> "erl_call" end)]), halt().')
 ERL_CALL_OPTS ?= -sname $(RABBITMQ_NODENAME) -e
 
 test-tmpdir:
@@ -193,7 +182,7 @@ $(TEST_CONFIG_FILE): node-tmpdir
        $(gen_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(config)))" > $@
 
 $(TEST_TLS_CERTS_DIR): node-tmpdir
-       $(gen_verbose) $(MAKE) -C $(DEPS_DIR)/rabbit_common/tools/tls-certs \
+       $(gen_verbose) $(MAKE) -C $(DEPS_DIR)/rabbitmq_ct_helpers/tools/tls-certs \
                DIR=$(TEST_TLS_CERTS_DIR) all
 
 show-test-tls-certs-dir: $(TEST_TLS_CERTS_DIR)
@@ -231,29 +220,9 @@ run-background-node: virgin-node-tmpdir $(RABBITMQ_ENABLED_PLUGINS_FILE)
          $(RABBITMQ_SERVER) -detached
 
 # --------------------------------------------------------------------
-# Used by rabbitmq-test.
+# Used by testsuites.
 # --------------------------------------------------------------------
 
-# TODO: Move this to rabbitmq-tests.
-run-tests:
-       $(verbose) echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL) $(ERL_CALL_OPTS) | sed -E '/^\{ok, true\}$$/d'
-       $(verbose) echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL) $(ERL_CALL_OPTS) -n hare | sed -E '/^\{ok, true\}$$/d'
-       OUT=$$(RABBITMQ_PID_FILE='$(RABBITMQ_PID_FILE)' \
-         echo "rabbit_tests:all_tests()." | $(ERL_CALL) $(ERL_CALL_OPTS)) ; \
-         echo $$OUT ; echo $$OUT | grep '^{ok, passed}$$' > /dev/null
-
-run-lazy-vq-tests:
-       $(verbose) echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL) $(ERL_CALL_OPTS) | sed -E '/^\{ok, true\}$$/d'
-       $(verbose) echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL) $(ERL_CALL_OPTS) -n hare | sed -E '/^\{ok, true\}$$/d'
-       OUT=$$(RABBITMQ_PID_FILE='$(RABBITMQ_PID_FILE)' \
-         echo "rabbit_tests:test_lazy_variable_queue()." | $(ERL_CALL) $(ERL_CALL_OPTS)) ; \
-         echo $$OUT ; echo $$OUT | grep '^{ok, passed}$$' > /dev/null
-
-run-qc:
-       echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL) $(ERL_CALL_OPTS)
-       ./quickcheck $(RABBITMQ_NODENAME) rabbit_backing_queue_qc 100 40
-       ./quickcheck $(RABBITMQ_NODENAME) gm_qc 1000 200
-
 ifneq ($(LOG_TO_STDIO),yes)
 REDIRECT_STDIO = > $(RABBITMQ_LOG_BASE)/startup_log \
                 2> $(RABBITMQ_LOG_BASE)/startup_err
@@ -298,54 +267,3 @@ stop-node:
        $(ERL_CALL) $(ERL_CALL_OPTS) -q && \
        while ps -p "$$pid" >/dev/null 2>&1; do sleep 1; done \
        ) || :
-
-clean-node-db:
-       $(exec_verbose) rm -rf $(RABBITMQ_MNESIA_DIR)/*
-
-start-cover:
-       $(exec_verbose) echo "rabbit_misc:start_cover([\"rabbit\", \"hare\"])." | $(ERL_CALL) $(ERL_CALL_OPTS) | sed -E '/^\{ok, ok\}$$/d'
-       $(verbose) echo "rabbit_misc:enable_cover([\"$(RABBITMQ_BROKER_DIR)\"])." | $(ERL_CALL) $(ERL_CALL_OPTS) | sed -E '/^\{ok, ok\}$$/d'
-
-stop-cover:
-       $(exec_verbose) echo "rabbit_misc:report_cover(), cover:stop()." | $(ERL_CALL) $(ERL_CALL_OPTS) | sed -E '/^\{ok, ok\}$$/d'
-       $(verbose) cat cover/summary.txt
-
-.PHONY: other-node-tmpdir virgin-other-node-tmpdir start-other-node \
-       cluster-other-node reset-other-node stop-other-node
-
-other-node-tmpdir:
-       $(verbose) mkdir -p $(call node_log_base,$(OTHER_NODE)) \
-               $(call node_mnesia_base,$(OTHER_NODE)) \
-               $(call node_plugins_expand_dir,$(OTHER_NODE))
-
-virgin-other-node-tmpdir:
-       $(exec_verbose) rm -rf $(call node_tmpdir,$(OTHER_NODE))
-       $(verbose) mkdir -p $(call node_log_base,$(OTHER_NODE)) \
-               $(call node_mnesia_base,$(OTHER_NODE)) \
-               $(call node_plugins_expand_dir,$(OTHER_NODE))
-
-start-other-node: other-node-tmpdir
-       $(exec_verbose) $(call basic_script_env_settings,$(OTHER_NODE),$(OTHER_NODE),$(OTHER_PORT)) \
-       RABBITMQ_ENABLED_PLUGINS_FILE="$(if $(OTHER_PLUGINS),$(OTHER_PLUGINS),$($(call node_enabled_plugins_file,$(OTHER_NODE))))" \
-       RABBITMQ_CONFIG_FILE="$(CURDIR)/etc/$(if $(OTHER_CONFIG),$(OTHER_CONFIG),$(OTHER_NODE))" \
-       RABBITMQ_NODE_ONLY='' \
-         $(RABBITMQ_SERVER) \
-         > $(call node_log_base,$(OTHER_NODE))/startup_log \
-         2> $(call node_log_base,$(OTHER_NODE))/startup_err &
-       $(verbose) $(RABBITMQCTL) -n $(OTHER_NODE) wait \
-         $(call node_pid_file,$(OTHER_NODE))
-
-cluster-other-node:
-       $(exec_verbose) $(RABBITMQCTL) -n $(OTHER_NODE) stop_app
-       $(verbose) $(RABBITMQCTL) -n $(OTHER_NODE) reset
-       $(verbose) $(RABBITMQCTL) -n $(OTHER_NODE) join_cluster \
-         $(if $(MAIN_NODE),$(MAIN_NODE),$(RABBITMQ_NODENAME)@$$(hostname -s))
-       $(verbose) $(RABBITMQCTL) -n $(OTHER_NODE) start_app
-
-reset-other-node:
-       $(exec_verbose) $(RABBITMQCTL) -n $(OTHER_NODE) stop_app
-       $(verbose) $(RABBITMQCTL) -n $(OTHER_NODE) reset
-       $(verbose) $(RABBITMQCTL) -n $(OTHER_NODE) start_app
-
-stop-other-node:
-       $(exec_verbose) $(RABBITMQCTL) -n $(OTHER_NODE) stop
similarity index 87%
rename from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-tools.mk
rename to deps/rabbit_common/mk/rabbitmq-tools.mk
index c83a8422d9499eb1b00c601e9dd6669d8532ba4e..769519b4cdd7e9dc59dab52343e105ef70e17065 100644 (file)
@@ -66,4 +66,10 @@ else
        $(verbose) cd $* && git config user.email "$(RMQ_GIT_USER_EMAIL)"
 endif
 
+show-branch: $(READY_DEPS:%=$(DEPS_DIR)/%+show-branch)
+       $(verbose) printf '%-34s %s\n' $(PROJECT): "$$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match)"
+
+%+show-branch:
+       $(verbose) printf '%-34s %s\n' $(notdir $*): "$$(cd $* && (git symbolic-ref -q --short HEAD || git describe --tags --exact-match))"
+
 endif # ($(wildcard .git),)
similarity index 99%
rename from rabbitmq-server/deps/rabbit_common/src/credit_flow.erl
rename to deps/rabbit_common/src/credit_flow.erl
index 0fe3e66664a0e5ef2043e73f054173468575120e..e9b16f4954bfab4a6fc47294fc5ad977e1cfea1e 100644 (file)
@@ -47,7 +47,7 @@
 %% client publishes.
 
 -define(DEFAULT_INITIAL_CREDIT, 200).
--define(DEFAULT_MORE_CREDIT_AFTER, 50).
+-define(DEFAULT_MORE_CREDIT_AFTER, 100).
 
 -define(DEFAULT_CREDIT,
         case get(credit_flow_default_credit) of
diff --git a/deps/rabbit_common/src/ec_semver.erl b/deps/rabbit_common/src/ec_semver.erl
new file mode 100644 (file)
index 0000000..6ae5597
--- /dev/null
@@ -0,0 +1,730 @@
+%%% vi:ts=4 sw=4 et
+
+%%% Imported from https://github.com/erlware/erlware_commons.git
+%%% Commit 603441a0363d5433de2139759991c640846c3a62
+%%% We export normalize/1 here
+
+%%%-------------------------------------------------------------------
+%%% @copyright (C) 2011, Erlware LLC
+%%% @doc
+%%%  Helper functions for working with semver versioning strings.
+%%%  See http://semver.org/ for the spec.
+%%% @end
+%%%-------------------------------------------------------------------
+-module(ec_semver).
+
+-export([parse/1,
+         format/1,
+         eql/2,
+         gt/2,
+         gte/2,
+         lt/2,
+         lte/2,
+         pes/2,
+         normalize/1,
+         between/3]).
+
+%% For internal use by the ec_semver_parser peg
+-export([internal_parse_version/1]).
+
+-export_type([semver/0,
+              version_string/0,
+              any_version/0]).
+
+%%%===================================================================
+%%% Public Types
+%%%===================================================================
+
+-type version_element() :: non_neg_integer() | binary().
+
+-type major_minor_patch_minpatch() ::
+        version_element()
+      | {version_element(), version_element()}
+      | {version_element(), version_element(), version_element()}
+      | {version_element(), version_element(),
+         version_element(), version_element()}.
+
+-type alpha_part() :: integer() | binary() | string().
+-type alpha_info() :: {PreRelease::[alpha_part()],
+                       BuildVersion::[alpha_part()]}.
+
+-type semver() :: {major_minor_patch_minpatch(), alpha_info()}.
+
+-type version_string() :: string() | binary().
+
+-type any_version() :: version_string() | semver().
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+
+%% @doc parse a string or binary into a valid semver representation
+-spec parse(any_version()) -> semver().
+parse(Version) when erlang:is_list(Version) ->
+    case ec_semver_parser:parse(Version) of
+        {fail, _} ->
+            {erlang:iolist_to_binary(Version), {[],[]}};
+        Good ->
+            Good
+    end;
+parse(Version) when erlang:is_binary(Version) ->
+    case ec_semver_parser:parse(Version) of
+        {fail, _} ->
+            {Version, {[],[]}};
+        Good ->
+            Good
+    end;
+parse(Version) ->
+    Version.
+
+-spec format(semver()) -> iolist().
+format({Maj, {AlphaPart, BuildPart}})
+  when erlang:is_integer(Maj);
+       erlang:is_binary(Maj) ->
+    [format_version_part(Maj),
+     format_vsn_rest(<<"-">>, AlphaPart),
+     format_vsn_rest(<<"+">>, BuildPart)];
+format({{Maj, Min}, {AlphaPart, BuildPart}}) ->
+    [format_version_part(Maj), ".",
+     format_version_part(Min),
+     format_vsn_rest(<<"-">>, AlphaPart),
+     format_vsn_rest(<<"+">>, BuildPart)];
+format({{Maj, Min, Patch}, {AlphaPart, BuildPart}}) ->
+    [format_version_part(Maj), ".",
+     format_version_part(Min), ".",
+     format_version_part(Patch),
+     format_vsn_rest(<<"-">>, AlphaPart),
+     format_vsn_rest(<<"+">>, BuildPart)];
+format({{Maj, Min, Patch, MinPatch}, {AlphaPart, BuildPart}}) ->
+    [format_version_part(Maj), ".",
+     format_version_part(Min), ".",
+     format_version_part(Patch), ".",
+     format_version_part(MinPatch),
+     format_vsn_rest(<<"-">>, AlphaPart),
+     format_vsn_rest(<<"+">>, BuildPart)].
+
+-spec format_version_part(integer() | binary()) -> iolist().
+format_version_part(Vsn)
+  when erlang:is_integer(Vsn) ->
+    erlang:integer_to_list(Vsn);
+format_version_part(Vsn)
+  when erlang:is_binary(Vsn) ->
+    Vsn.
+
+
+
+%% @doc test for quality between semver versions
+-spec eql(any_version(), any_version()) -> boolean().
+eql(VsnA, VsnB) ->
+    NVsnA = normalize(parse(VsnA)),
+    NVsnB = normalize(parse(VsnB)),
+    NVsnA =:= NVsnB.
+
+%% @doc Test that VsnA is greater than VsnB
+-spec gt(any_version(), any_version()) -> boolean().
+gt(VsnA, VsnB) ->
+    {MMPA, {AlphaA, PatchA}} = normalize(parse(VsnA)),
+    {MMPB, {AlphaB, PatchB}} = normalize(parse(VsnB)),
+    ((MMPA > MMPB)
+     orelse
+       ((MMPA =:= MMPB)
+        andalso
+          ((AlphaA =:= [] andalso AlphaB =/= [])
+           orelse
+             ((not (AlphaB =:= [] andalso AlphaA =/= []))
+              andalso
+                (AlphaA > AlphaB))))
+     orelse
+       ((MMPA =:= MMPB)
+        andalso
+          (AlphaA =:= AlphaB)
+        andalso
+          ((PatchB =:= [] andalso PatchA =/= [])
+           orelse
+           PatchA > PatchB))).
+
+%% @doc Test that VsnA is greater than or equal to VsnB
+-spec gte(any_version(), any_version()) -> boolean().
+gte(VsnA, VsnB) ->
+    NVsnA = normalize(parse(VsnA)),
+    NVsnB = normalize(parse(VsnB)),
+    gt(NVsnA, NVsnB) orelse eql(NVsnA, NVsnB).
+
+%% @doc Test that VsnA is less than VsnB
+-spec lt(any_version(), any_version()) -> boolean().
+lt(VsnA, VsnB) ->
+    {MMPA, {AlphaA, PatchA}} = normalize(parse(VsnA)),
+    {MMPB, {AlphaB, PatchB}} = normalize(parse(VsnB)),
+    ((MMPA < MMPB)
+     orelse
+       ((MMPA =:= MMPB)
+        andalso
+          ((AlphaB =:= [] andalso AlphaA =/= [])
+           orelse
+             ((not (AlphaA =:= [] andalso AlphaB =/= []))
+              andalso
+                (AlphaA < AlphaB))))
+     orelse
+       ((MMPA =:= MMPB)
+        andalso
+          (AlphaA =:= AlphaB)
+        andalso
+          ((PatchA =:= [] andalso PatchB =/= [])
+           orelse
+           PatchA < PatchB))).
+
+%% @doc Test that VsnA is less than or equal to VsnB
+-spec lte(any_version(), any_version()) -> boolean().
+lte(VsnA, VsnB) ->
+    NVsnA = normalize(parse(VsnA)),
+    NVsnB = normalize(parse(VsnB)),
+    lt(NVsnA, NVsnB) orelse eql(NVsnA, NVsnB).
+
+%% @doc Test that VsnMatch is greater than or equal to Vsn1 and
+%% less than or equal to Vsn2
+-spec between(any_version(), any_version(), any_version()) -> boolean().
+between(Vsn1, Vsn2, VsnMatch) ->
+    NVsnA = normalize(parse(Vsn1)),
+    NVsnB = normalize(parse(Vsn2)),
+    NVsnMatch = normalize(parse(VsnMatch)),
+    gte(NVsnMatch, NVsnA) andalso
+        lte(NVsnMatch, NVsnB).
+
+%% @doc check that VsnA is Approximately greater than VsnB
+%%
+%% Specifying ">= 2.6.5" is an optimistic version constraint. All
+%% versions greater than the one specified, including major releases
+%% (e.g. 3.0.0) are allowed.
+%%
+%% Conversely, specifying "~> 2.6" is pessimistic about future major
+%% revisions and "~> 2.6.5" is pessimistic about future minor
+%% revisions.
+%%
+%%  "~> 2.6" matches cookbooks >= 2.6.0 AND &lt; 3.0.0
+%% "~> 2.6.5" matches cookbooks >= 2.6.5 AND &lt; 2.7.0
+pes(VsnA, VsnB) ->
+    internal_pes(parse(VsnA), parse(VsnB)).
+
+%%%===================================================================
+%%% Friend Functions
+%%%===================================================================
+%% @doc helper function for the peg grammer to parse the iolist into a semver
+-spec internal_parse_version(iolist()) -> semver().
+internal_parse_version([MMP, AlphaPart, BuildPart, _]) ->
+    {parse_major_minor_patch_minpatch(MMP), {parse_alpha_part(AlphaPart),
+                                             parse_alpha_part(BuildPart)}}.
+
+%% @doc helper function for the peg grammer to parse the iolist into a major_minor_patch
+-spec parse_major_minor_patch_minpatch(iolist()) -> major_minor_patch_minpatch().
+parse_major_minor_patch_minpatch([MajVsn, [], [], []]) ->
+    strip_maj_version(MajVsn);
+parse_major_minor_patch_minpatch([MajVsn, [<<".">>, MinVsn], [], []]) ->
+    {strip_maj_version(MajVsn), MinVsn};
+parse_major_minor_patch_minpatch([MajVsn,
+                                  [<<".">>, MinVsn],
+                                  [<<".">>, PatchVsn], []]) ->
+    {strip_maj_version(MajVsn), MinVsn, PatchVsn};
+parse_major_minor_patch_minpatch([MajVsn,
+                                  [<<".">>, MinVsn],
+                                  [<<".">>, PatchVsn],
+                                  [<<".">>, MinPatch]]) ->
+    {strip_maj_version(MajVsn), MinVsn, PatchVsn, MinPatch}.
+
+%% @doc helper function for the peg grammer to parse the iolist into an alpha part
+-spec parse_alpha_part(iolist()) -> [alpha_part()].
+parse_alpha_part([]) ->
+    [];
+parse_alpha_part([_, AV1, Rest]) ->
+    [erlang:iolist_to_binary(AV1) |
+     [format_alpha_part(Part) || Part <- Rest]].
+
+%% @doc according to semver alpha parts that can be treated like
+%% numbers must be. We implement that here by taking the alpha part
+%% and trying to convert it to a number, if it succeeds we use
+%% it. Otherwise we do not.
+-spec format_alpha_part(iolist()) -> integer() | binary().
+format_alpha_part([<<".">>, AlphaPart]) ->
+    Bin = erlang:iolist_to_binary(AlphaPart),
+    try
+        erlang:list_to_integer(erlang:binary_to_list(Bin))
+    catch
+        error:badarg ->
+            Bin
+    end.
+
+%%%===================================================================
+%%% Internal Functions
+%%%===================================================================
+-spec strip_maj_version(iolist()) -> version_element().
+strip_maj_version([<<"v">>, MajVsn]) ->
+    MajVsn;
+strip_maj_version([[], MajVsn]) ->
+    MajVsn;
+strip_maj_version(MajVsn) ->
+    MajVsn.
+
+-spec to_list(integer() | binary() | string()) -> string() | binary().
+to_list(Detail) when erlang:is_integer(Detail) ->
+    erlang:integer_to_list(Detail);
+to_list(Detail) when erlang:is_list(Detail); erlang:is_binary(Detail) ->
+    Detail.
+
+-spec format_vsn_rest(binary() | string(), [integer() | binary()]) -> iolist().
+format_vsn_rest(_TypeMark, []) ->
+    [];
+format_vsn_rest(TypeMark, [Head | Rest]) ->
+    [TypeMark, Head |
+     [[".", to_list(Detail)] || Detail <- Rest]].
+
+%% @doc normalize the semver so they can be compared
+-spec normalize(semver()) -> semver().
+normalize({Vsn, Rest})
+  when erlang:is_binary(Vsn);
+       erlang:is_integer(Vsn) ->
+    {{Vsn, 0, 0, 0}, Rest};
+normalize({{Maj, Min}, Rest}) ->
+    {{Maj, Min, 0, 0}, Rest};
+normalize({{Maj, Min, Patch}, Rest}) ->
+    {{Maj, Min, Patch, 0}, Rest};
+normalize(Other = {{_, _, _, _}, {_,_}}) ->
+    Other.
+
+%% @doc to do the pessimistic compare we need a parsed semver. This is
+%% the internal implementation of the of the pessimistic run. The
+%% external just ensures that versions are parsed.
+-spec internal_pes(semver(), semver()) -> boolean().
+internal_pes(VsnA, {{LM, LMI}, _})
+  when erlang:is_integer(LM),
+       erlang:is_integer(LMI) ->
+    gte(VsnA, {{LM, LMI, 0}, {[], []}}) andalso
+        lt(VsnA, {{LM + 1, 0, 0, 0}, {[], []}});
+internal_pes(VsnA, {{LM, LMI, LP}, _})
+    when erlang:is_integer(LM),
+         erlang:is_integer(LMI),
+         erlang:is_integer(LP) ->
+    gte(VsnA, {{LM, LMI, LP}, {[], []}})
+        andalso
+        lt(VsnA, {{LM, LMI + 1, 0, 0}, {[], []}});
+internal_pes(VsnA, {{LM, LMI, LP, LMP}, _})
+    when erlang:is_integer(LM),
+         erlang:is_integer(LMI),
+         erlang:is_integer(LP),
+         erlang:is_integer(LMP) ->
+    gte(VsnA, {{LM, LMI, LP, LMP}, {[], []}})
+        andalso
+        lt(VsnA, {{LM, LMI, LP + 1, 0}, {[], []}});
+internal_pes(Vsn, LVsn) ->
+    gte(Vsn, LVsn).
+
+%%%===================================================================
+%%% Test Functions
+%%%===================================================================
+
+-ifdef(TEST).
+-include_lib("eunit/include/eunit.hrl").
+
+eql_test() ->
+    ?assertMatch(true, eql("1.0.0-alpha",
+                           "1.0.0-alpha")),
+    ?assertMatch(true, eql(<<"1.0.0-alpha">>,
+                           "1.0.0-alpha")),
+    ?assertMatch(true, eql("1.0.0-alpha",
+                           <<"1.0.0-alpha">>)),
+    ?assertMatch(true, eql(<<"1.0.0-alpha">>,
+                           <<"1.0.0-alpha">>)),
+    ?assertMatch(true, eql("v1.0.0-alpha",
+                           "1.0.0-alpha")),
+    ?assertMatch(true, eql("1",
+                           "1.0.0")),
+    ?assertMatch(true, eql("v1",
+                           "v1.0.0")),
+    ?assertMatch(true, eql("1.0",
+                           "1.0.0")),
+    ?assertMatch(true, eql("1.0.0",
+                           "1")),
+    ?assertMatch(true, eql("1.0.0.0",
+                           "1")),
+    ?assertMatch(true, eql("1.0+alpha.1",
+                           "1.0.0+alpha.1")),
+    ?assertMatch(true, eql("1.0-alpha.1+build.1",
+                           "1.0.0-alpha.1+build.1")),
+    ?assertMatch(true, eql("1.0-alpha.1+build.1",
+                           "1.0.0.0-alpha.1+build.1")),
+    ?assertMatch(true, eql("1.0-alpha.1+build.1",
+                           "v1.0.0.0-alpha.1+build.1")),
+    ?assertMatch(true, eql("aa", "aa")),
+    ?assertMatch(true, eql("AA.BB", "AA.BB")),
+    ?assertMatch(true, eql("BBB-super", "BBB-super")),
+    ?assertMatch(true, not eql("1.0.0",
+                               "1.0.1")),
+    ?assertMatch(true, not eql(<<"1.0.0">>,
+                               "1.0.1")),
+    ?assertMatch(true, not eql("1.0.0",
+                               <<"1.0.1">>)),
+    ?assertMatch(true, not eql(<<"1.0.0">>,
+                               <<"1.0.1">>)),
+    ?assertMatch(true, not eql("1.0.0-alpha",
+                               "1.0.1+alpha")),
+    ?assertMatch(true, not eql("1.0.0+build.1",
+                               "1.0.1+build.2")),
+    ?assertMatch(true, not eql("1.0.0.0+build.1",
+                               "1.0.0.1+build.2")),
+    ?assertMatch(true, not eql("FFF", "BBB")),
+    ?assertMatch(true, not eql("1", "1BBBB")).
+
+
+gt_test() ->
+    ?assertMatch(true, gt("1.0.0-alpha.1",
+                          "1.0.0-alpha")),
+    ?assertMatch(true, gt("1.0.0.1-alpha.1",
+                          "1.0.0.1-alpha")),
+    ?assertMatch(true, gt("1.0.0.4-alpha.1",
+                          "1.0.0.2-alpha")),
+    ?assertMatch(true, gt("1.0.0.0-alpha.1",
+                          "1.0.0-alpha")),
+    ?assertMatch(true, gt("1.0.0-beta.2",
+                          "1.0.0-alpha.1")),
+    ?assertMatch(true, gt("1.0.0-beta.11",
+                          "1.0.0-beta.2")),
+    ?assertMatch(true, gt("1.0.0-beta.11",
+                          "1.0.0.0-beta.2")),
+    ?assertMatch(true, gt("1.0.0-rc.1", "1.0.0-beta.11")),
+    ?assertMatch(true, gt("1.0.0-rc.1+build.1", "1.0.0-rc.1")),
+    ?assertMatch(true, gt("1.0.0", "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, gt("1.0.0+0.3.7", "1.0.0")),
+    ?assertMatch(true, gt("1.3.7+build", "1.0.0+0.3.7")),
+    ?assertMatch(true, gt("1.3.7+build.2.b8f12d7",
+                          "1.3.7+build")),
+    ?assertMatch(true, gt("1.3.7+build.2.b8f12d7",
+                          "1.3.7.0+build")),
+    ?assertMatch(true, gt("1.3.7+build.11.e0f985a",
+                          "1.3.7+build.2.b8f12d7")),
+    ?assertMatch(true, gt("aa.cc",
+                          "aa.bb")),
+    ?assertMatch(true, not gt("1.0.0-alpha",
+                              "1.0.0-alpha.1")),
+    ?assertMatch(true, not gt("1.0.0-alpha",
+                              "1.0.0.0-alpha.1")),
+    ?assertMatch(true, not gt("1.0.0-alpha.1",
+                              "1.0.0-beta.2")),
+    ?assertMatch(true, not gt("1.0.0-beta.2",
+                              "1.0.0-beta.11")),
+    ?assertMatch(true, not gt("1.0.0-beta.11",
+                              "1.0.0-rc.1")),
+    ?assertMatch(true, not gt("1.0.0-rc.1",
+                              "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, not gt("1.0.0-rc.1+build.1",
+                              "1.0.0")),
+    ?assertMatch(true, not gt("1.0.0",
+                              "1.0.0+0.3.7")),
+    ?assertMatch(true, not gt("1.0.0+0.3.7",
+                              "1.3.7+build")),
+    ?assertMatch(true, not gt("1.3.7+build",
+                              "1.3.7+build.2.b8f12d7")),
+    ?assertMatch(true, not gt("1.3.7+build.2.b8f12d7",
+                              "1.3.7+build.11.e0f985a")),
+    ?assertMatch(true, not gt("1.0.0-alpha",
+                              "1.0.0-alpha")),
+    ?assertMatch(true, not gt("1",
+                              "1.0.0")),
+    ?assertMatch(true, not gt("aa.bb",
+                              "aa.bb")),
+    ?assertMatch(true, not gt("aa.cc",
+                              "aa.dd")),
+    ?assertMatch(true, not gt("1.0",
+                              "1.0.0")),
+    ?assertMatch(true, not gt("1.0.0",
+                              "1")),
+    ?assertMatch(true, not gt("1.0+alpha.1",
+                              "1.0.0+alpha.1")),
+    ?assertMatch(true, not gt("1.0-alpha.1+build.1",
+                              "1.0.0-alpha.1+build.1")).
+
+lt_test() ->
+    ?assertMatch(true, lt("1.0.0-alpha",
+                          "1.0.0-alpha.1")),
+    ?assertMatch(true, lt("1.0.0-alpha",
+                          "1.0.0.0-alpha.1")),
+    ?assertMatch(true, lt("1.0.0-alpha.1",
+                          "1.0.0-beta.2")),
+    ?assertMatch(true, lt("1.0.0-beta.2",
+                          "1.0.0-beta.11")),
+    ?assertMatch(true, lt("1.0.0-beta.11",
+                          "1.0.0-rc.1")),
+    ?assertMatch(true, lt("1.0.0.1-beta.11",
+                          "1.0.0.1-rc.1")),
+    ?assertMatch(true, lt("1.0.0-rc.1",
+                          "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, lt("1.0.0-rc.1+build.1",
+                          "1.0.0")),
+    ?assertMatch(true, lt("1.0.0",
+                          "1.0.0+0.3.7")),
+    ?assertMatch(true, lt("1.0.0+0.3.7",
+                          "1.3.7+build")),
+    ?assertMatch(true, lt("1.3.7+build",
+                          "1.3.7+build.2.b8f12d7")),
+    ?assertMatch(true, lt("1.3.7+build.2.b8f12d7",
+                          "1.3.7+build.11.e0f985a")),
+    ?assertMatch(true, not lt("1.0.0-alpha",
+                              "1.0.0-alpha")),
+    ?assertMatch(true, not lt("1",
+                              "1.0.0")),
+    ?assertMatch(true, lt("1",
+                          "1.0.0.1")),
+    ?assertMatch(true, lt("AA.DD",
+                          "AA.EE")),
+    ?assertMatch(true, not lt("1.0",
+                              "1.0.0")),
+    ?assertMatch(true, not lt("1.0.0.0",
+                              "1")),
+    ?assertMatch(true, not lt("1.0+alpha.1",
+                              "1.0.0+alpha.1")),
+    ?assertMatch(true, not lt("AA.DD", "AA.CC")),
+    ?assertMatch(true, not lt("1.0-alpha.1+build.1",
+                              "1.0.0-alpha.1+build.1")),
+    ?assertMatch(true, not lt("1.0.0-alpha.1",
+                              "1.0.0-alpha")),
+    ?assertMatch(true, not lt("1.0.0-beta.2",
+                              "1.0.0-alpha.1")),
+    ?assertMatch(true, not lt("1.0.0-beta.11",
+                              "1.0.0-beta.2")),
+    ?assertMatch(true, not lt("1.0.0-rc.1", "1.0.0-beta.11")),
+    ?assertMatch(true, not lt("1.0.0-rc.1+build.1", "1.0.0-rc.1")),
+    ?assertMatch(true, not lt("1.0.0", "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, not lt("1.0.0+0.3.7", "1.0.0")),
+    ?assertMatch(true, not lt("1.3.7+build", "1.0.0+0.3.7")),
+    ?assertMatch(true, not lt("1.3.7+build.2.b8f12d7",
+                              "1.3.7+build")),
+    ?assertMatch(true, not lt("1.3.7+build.11.e0f985a",
+                              "1.3.7+build.2.b8f12d7")).
+
+gte_test() ->
+    ?assertMatch(true, gte("1.0.0-alpha",
+                           "1.0.0-alpha")),
+
+    ?assertMatch(true, gte("1",
+                           "1.0.0")),
+
+    ?assertMatch(true, gte("1.0",
+                           "1.0.0")),
+
+    ?assertMatch(true, gte("1.0.0",
+                           "1")),
+
+    ?assertMatch(true, gte("1.0.0.0",
+                           "1")),
+
+    ?assertMatch(true, gte("1.0+alpha.1",
+                           "1.0.0+alpha.1")),
+
+    ?assertMatch(true, gte("1.0-alpha.1+build.1",
+                           "1.0.0-alpha.1+build.1")),
+
+    ?assertMatch(true, gte("1.0.0-alpha.1+build.1",
+                           "1.0.0.0-alpha.1+build.1")),
+    ?assertMatch(true, gte("1.0.0-alpha.1",
+                           "1.0.0-alpha")),
+    ?assertMatch(true, gte("1.0.0-beta.2",
+                           "1.0.0-alpha.1")),
+    ?assertMatch(true, gte("1.0.0-beta.11",
+                           "1.0.0-beta.2")),
+    ?assertMatch(true, gte("aa.bb", "aa.bb")),
+    ?assertMatch(true, gte("dd", "aa")),
+    ?assertMatch(true, gte("1.0.0-rc.1", "1.0.0-beta.11")),
+    ?assertMatch(true, gte("1.0.0-rc.1+build.1", "1.0.0-rc.1")),
+    ?assertMatch(true, gte("1.0.0", "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, gte("1.0.0+0.3.7", "1.0.0")),
+    ?assertMatch(true, gte("1.3.7+build", "1.0.0+0.3.7")),
+    ?assertMatch(true, gte("1.3.7+build.2.b8f12d7",
+                           "1.3.7+build")),
+    ?assertMatch(true, gte("1.3.7+build.11.e0f985a",
+                           "1.3.7+build.2.b8f12d7")),
+    ?assertMatch(true, not gte("1.0.0-alpha",
+                               "1.0.0-alpha.1")),
+    ?assertMatch(true, not gte("CC", "DD")),
+    ?assertMatch(true, not gte("1.0.0-alpha.1",
+                               "1.0.0-beta.2")),
+    ?assertMatch(true, not gte("1.0.0-beta.2",
+                               "1.0.0-beta.11")),
+    ?assertMatch(true, not gte("1.0.0-beta.11",
+                               "1.0.0-rc.1")),
+    ?assertMatch(true, not gte("1.0.0-rc.1",
+                               "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, not gte("1.0.0-rc.1+build.1",
+                               "1.0.0")),
+    ?assertMatch(true, not gte("1.0.0",
+                               "1.0.0+0.3.7")),
+    ?assertMatch(true, not gte("1.0.0+0.3.7",
+                               "1.3.7+build")),
+    ?assertMatch(true, not gte("1.0.0",
+                               "1.0.0+build.1")),
+    ?assertMatch(true, not gte("1.3.7+build",
+                               "1.3.7+build.2.b8f12d7")),
+    ?assertMatch(true, not gte("1.3.7+build.2.b8f12d7",
+                               "1.3.7+build.11.e0f985a")).
+lte_test() ->
+    ?assertMatch(true, lte("1.0.0-alpha",
+                           "1.0.0-alpha.1")),
+    ?assertMatch(true, lte("1.0.0-alpha.1",
+                           "1.0.0-beta.2")),
+    ?assertMatch(true, lte("1.0.0-beta.2",
+                           "1.0.0-beta.11")),
+    ?assertMatch(true, lte("1.0.0-beta.11",
+                           "1.0.0-rc.1")),
+    ?assertMatch(true, lte("1.0.0-rc.1",
+                           "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, lte("1.0.0-rc.1+build.1",
+                           "1.0.0")),
+    ?assertMatch(true, lte("1.0.0",
+                           "1.0.0+0.3.7")),
+    ?assertMatch(true, lte("1.0.0+0.3.7",
+                           "1.3.7+build")),
+    ?assertMatch(true, lte("1.3.7+build",
+                           "1.3.7+build.2.b8f12d7")),
+    ?assertMatch(true, lte("1.3.7+build.2.b8f12d7",
+                           "1.3.7+build.11.e0f985a")),
+    ?assertMatch(true, lte("1.0.0-alpha",
+                           "1.0.0-alpha")),
+    ?assertMatch(true, lte("1",
+                           "1.0.0")),
+    ?assertMatch(true, lte("1.0",
+                           "1.0.0")),
+    ?assertMatch(true, lte("1.0.0",
+                           "1")),
+    ?assertMatch(true, lte("1.0+alpha.1",
+                           "1.0.0+alpha.1")),
+    ?assertMatch(true, lte("1.0.0.0+alpha.1",
+                           "1.0.0+alpha.1")),
+    ?assertMatch(true, lte("1.0-alpha.1+build.1",
+                           "1.0.0-alpha.1+build.1")),
+    ?assertMatch(true, lte("aa","cc")),
+    ?assertMatch(true, lte("cc","cc")),
+    ?assertMatch(true, not lte("1.0.0-alpha.1",
+                              "1.0.0-alpha")),
+    ?assertMatch(true, not lte("cc", "aa")),
+    ?assertMatch(true, not lte("1.0.0-beta.2",
+                              "1.0.0-alpha.1")),
+    ?assertMatch(true, not lte("1.0.0-beta.11",
+                              "1.0.0-beta.2")),
+    ?assertMatch(true, not lte("1.0.0-rc.1", "1.0.0-beta.11")),
+    ?assertMatch(true, not lte("1.0.0-rc.1+build.1", "1.0.0-rc.1")),
+    ?assertMatch(true, not lte("1.0.0", "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, not lte("1.0.0+0.3.7", "1.0.0")),
+    ?assertMatch(true, not lte("1.3.7+build", "1.0.0+0.3.7")),
+    ?assertMatch(true, not lte("1.3.7+build.2.b8f12d7",
+                              "1.3.7+build")),
+    ?assertMatch(true, not lte("1.3.7+build.11.e0f985a",
+                              "1.3.7+build.2.b8f12d7")).
+
+between_test() ->
+    ?assertMatch(true, between("1.0.0-alpha",
+                               "1.0.0-alpha.3",
+                               "1.0.0-alpha.2")),
+    ?assertMatch(true, between("1.0.0-alpha.1",
+                               "1.0.0-beta.2",
+                               "1.0.0-alpha.25")),
+    ?assertMatch(true, between("1.0.0-beta.2",
+                               "1.0.0-beta.11",
+                               "1.0.0-beta.7")),
+    ?assertMatch(true, between("1.0.0-beta.11",
+                               "1.0.0-rc.3",
+                               "1.0.0-rc.1")),
+    ?assertMatch(true, between("1.0.0-rc.1",
+                               "1.0.0-rc.1+build.3",
+                               "1.0.0-rc.1+build.1")),
+
+    ?assertMatch(true, between("1.0.0.0-rc.1",
+                               "1.0.0-rc.1+build.3",
+                               "1.0.0-rc.1+build.1")),
+    ?assertMatch(true, between("1.0.0-rc.1+build.1",
+                               "1.0.0",
+                               "1.0.0-rc.33")),
+    ?assertMatch(true, between("1.0.0",
+                               "1.0.0+0.3.7",
+                               "1.0.0+0.2")),
+    ?assertMatch(true, between("1.0.0+0.3.7",
+                               "1.3.7+build",
+                               "1.2")),
+    ?assertMatch(true, between("1.3.7+build",
+                               "1.3.7+build.2.b8f12d7",
+                               "1.3.7+build.1")),
+    ?assertMatch(true, between("1.3.7+build.2.b8f12d7",
+                               "1.3.7+build.11.e0f985a",
+                               "1.3.7+build.10.a36faa")),
+    ?assertMatch(true, between("1.0.0-alpha",
+                               "1.0.0-alpha",
+                               "1.0.0-alpha")),
+    ?assertMatch(true, between("1",
+                               "1.0.0",
+                               "1.0.0")),
+    ?assertMatch(true, between("1.0",
+                               "1.0.0",
+                               "1.0.0")),
+
+    ?assertMatch(true, between("1.0",
+                               "1.0.0.0",
+                               "1.0.0.0")),
+    ?assertMatch(true, between("1.0.0",
+                               "1",
+                               "1")),
+    ?assertMatch(true, between("1.0+alpha.1",
+                               "1.0.0+alpha.1",
+                               "1.0.0+alpha.1")),
+    ?assertMatch(true, between("1.0-alpha.1+build.1",
+                               "1.0.0-alpha.1+build.1",
+                               "1.0.0-alpha.1+build.1")),
+    ?assertMatch(true, between("aaa",
+                               "ddd",
+                               "cc")),
+    ?assertMatch(true, not between("1.0.0-alpha.1",
+                                   "1.0.0-alpha.22",
+                                   "1.0.0")),
+    ?assertMatch(true, not between("1.0.0",
+                                   "1.0.0-alpha.1",
+                                   "2.0")),
+    ?assertMatch(true, not between("1.0.0-beta.1",
+                                   "1.0.0-beta.11",
+                                   "1.0.0-alpha")),
+    ?assertMatch(true, not between("1.0.0-beta.11", "1.0.0-rc.1",
+                                   "1.0.0-rc.22")),
+    ?assertMatch(true, not between("aaa", "ddd", "zzz")).
+
+pes_test() ->
+    ?assertMatch(true, pes("2.6.0", "2.6")),
+    ?assertMatch(true, pes("2.7", "2.6")),
+    ?assertMatch(true, pes("2.8", "2.6")),
+    ?assertMatch(true, pes("2.9", "2.6")),
+    ?assertMatch(true, pes("A.B", "A.A")),
+    ?assertMatch(true, not pes("3.0.0", "2.6")),
+    ?assertMatch(true, not pes("2.5", "2.6")),
+    ?assertMatch(true, pes("2.6.5", "2.6.5")),
+    ?assertMatch(true, pes("2.6.6", "2.6.5")),
+    ?assertMatch(true, pes("2.6.7", "2.6.5")),
+    ?assertMatch(true, pes("2.6.8", "2.6.5")),
+    ?assertMatch(true, pes("2.6.9", "2.6.5")),
+    ?assertMatch(true, pes("2.6.0.9", "2.6.0.5")),
+    ?assertMatch(true, not pes("2.7", "2.6.5")),
+    ?assertMatch(true, not pes("2.1.7", "2.1.6.5")),
+    ?assertMatch(true, not pes("A.A", "A.B")),
+    ?assertMatch(true, not pes("2.5", "2.6.5")).
+
+version_format_test() ->
+    ?assertEqual(["1", [], []], format({1, {[],[]}})),
+    ?assertEqual(["1", ".", "2", ".", "34", [], []], format({{1,2,34},{[],[]}})),
+    ?assertEqual(<<"a">>, erlang:iolist_to_binary(format({<<"a">>, {[],[]}}))),
+    ?assertEqual(<<"a.b">>, erlang:iolist_to_binary(format({{<<"a">>,<<"b">>}, {[],[]}}))),
+    ?assertEqual(<<"1">>, erlang:iolist_to_binary(format({1, {[],[]}}))),
+    ?assertEqual(<<"1.2">>, erlang:iolist_to_binary(format({{1,2}, {[],[]}}))),
+    ?assertEqual(<<"1.2.2">>, erlang:iolist_to_binary(format({{1,2,2}, {[],[]}}))),
+    ?assertEqual(<<"1.99.2">>, erlang:iolist_to_binary(format({{1,99,2}, {[],[]}}))),
+    ?assertEqual(<<"1.99.2-alpha">>, erlang:iolist_to_binary(format({{1,99,2}, {[<<"alpha">>],[]}}))),
+    ?assertEqual(<<"1.99.2-alpha.1">>, erlang:iolist_to_binary(format({{1,99,2}, {[<<"alpha">>,1], []}}))),
+    ?assertEqual(<<"1.99.2+build.1.a36">>,
+                 erlang:iolist_to_binary(format({{1,99,2}, {[], [<<"build">>, 1, <<"a36">>]}}))),
+    ?assertEqual(<<"1.99.2.44+build.1.a36">>,
+                 erlang:iolist_to_binary(format({{1,99,2,44}, {[], [<<"build">>, 1, <<"a36">>]}}))),
+    ?assertEqual(<<"1.99.2-alpha.1+build.1.a36">>,
+                 erlang:iolist_to_binary(format({{1,99,2}, {[<<"alpha">>, 1], [<<"build">>, 1, <<"a36">>]}}))),
+    ?assertEqual(<<"1">>, erlang:iolist_to_binary(format({1, {[],[]}}))).
+
+-endif.
diff --git a/deps/rabbit_common/src/ec_semver_parser.erl b/deps/rabbit_common/src/ec_semver_parser.erl
new file mode 100644 (file)
index 0000000..ad95fe5
--- /dev/null
@@ -0,0 +1,306 @@
+%%% Imported from https://github.com/erlware/erlware_commons.git
+%%% Commit 603441a0363d5433de2139759991c640846c3a62
+
+-module(ec_semver_parser).
+-export([parse/1,file/1]).
+-define(p_anything,true).
+-define(p_charclass,true).
+-define(p_choose,true).
+-define(p_not,true).
+-define(p_one_or_more,true).
+-define(p_optional,true).
+-define(p_scan,true).
+-define(p_seq,true).
+-define(p_string,true).
+-define(p_zero_or_more,true).
+
+
+-compile(export_all).
+-spec file(file:name()) -> any().
+file(Filename) -> case file:read_file(Filename) of {ok,Bin} -> parse(Bin); Err -> Err end.
+
+-spec parse(binary() | list()) -> any().
+parse(List) when is_list(List) -> parse(unicode:characters_to_binary(List));
+parse(Input) when is_binary(Input) ->
+  _ = setup_memo(),
+  Result = case 'semver'(Input,{{line,1},{column,1}}) of
+             {AST, <<>>, _Index} -> AST;
+             Any -> Any
+           end,
+  release_memo(), Result.
+
+-spec 'semver'(input(), index()) -> parse_result().
+'semver'(Input, Index) ->
+  p(Input, Index, 'semver', fun(I,D) -> (p_seq([fun 'major_minor_patch_min_patch'/2, p_optional(p_seq([p_string(<<"-">>), fun 'alpha_part'/2, p_zero_or_more(p_seq([p_string(<<".">>), fun 'alpha_part'/2]))])), p_optional(p_seq([p_string(<<"+">>), fun 'alpha_part'/2, p_zero_or_more(p_seq([p_string(<<".">>), fun 'alpha_part'/2]))])), p_not(p_anything())]))(I,D) end, fun(Node, _Idx) -> ec_semver:internal_parse_version(Node)  end).
+
+-spec 'major_minor_patch_min_patch'(input(), index()) -> parse_result().
+'major_minor_patch_min_patch'(Input, Index) ->
+  p(Input, Index, 'major_minor_patch_min_patch', fun(I,D) -> (p_seq([p_choose([p_seq([p_optional(p_string(<<"v">>)), fun 'numeric_part'/2]), fun 'alpha_part'/2]), p_optional(p_seq([p_string(<<".">>), fun 'version_part'/2])), p_optional(p_seq([p_string(<<".">>), fun 'version_part'/2])), p_optional(p_seq([p_string(<<".">>), fun 'version_part'/2]))]))(I,D) end, fun(Node, Idx) ->transform('major_minor_patch_min_patch', Node, Idx) end).
+
+-spec 'version_part'(input(), index()) -> parse_result().
+'version_part'(Input, Index) ->
+  p(Input, Index, 'version_part', fun(I,D) -> (p_choose([fun 'numeric_part'/2, fun 'alpha_part'/2]))(I,D) end, fun(Node, Idx) ->transform('version_part', Node, Idx) end).
+
+-spec 'numeric_part'(input(), index()) -> parse_result().
+'numeric_part'(Input, Index) ->
+  p(Input, Index, 'numeric_part', fun(I,D) -> (p_one_or_more(p_charclass(<<"[0-9]">>)))(I,D) end, fun(Node, _Idx) ->erlang:list_to_integer(erlang:binary_to_list(erlang:iolist_to_binary(Node))) end).
+
+-spec 'alpha_part'(input(), index()) -> parse_result().
+'alpha_part'(Input, Index) ->
+  p(Input, Index, 'alpha_part', fun(I,D) -> (p_one_or_more(p_charclass(<<"[A-Za-z0-9]">>)))(I,D) end, fun(Node, _Idx) ->erlang:iolist_to_binary(Node) end).
+
+
+transform(_,Node,_Index) -> Node.
+-file("peg_includes.hrl", 1).
+-type index() :: {{line, pos_integer()}, {column, pos_integer()}}.
+-type input() :: binary().
+-type parse_failure() :: {fail, term()}.
+-type parse_success() :: {term(), input(), index()}.
+-type parse_result() :: parse_failure() | parse_success().
+-type parse_fun() :: fun((input(), index()) -> parse_result()).
+-type xform_fun() :: fun((input(), index()) -> term()).
+
+-spec p(input(), index(), atom(), parse_fun(), xform_fun()) -> parse_result().
+p(Inp, StartIndex, Name, ParseFun, TransformFun) ->
+  case get_memo(StartIndex, Name) of      % See if the current reduction is memoized
+    {ok, Memo} -> %Memo;                     % If it is, return the stored result
+      Memo;
+    _ ->                                        % If not, attempt to parse
+      Result = case ParseFun(Inp, StartIndex) of
+        {fail,_} = Failure ->                       % If it fails, memoize the failure
+          Failure;
+        {Match, InpRem, NewIndex} ->               % If it passes, transform and memoize the result.
+          Transformed = TransformFun(Match, StartIndex),
+          {Transformed, InpRem, NewIndex}
+      end,
+      memoize(StartIndex, Name, Result),
+      Result
+  end.
+
+-spec setup_memo() -> ets:tid().
+setup_memo() ->
+  put({parse_memo_table, ?MODULE}, ets:new(?MODULE, [set])).
+
+-spec release_memo() -> true.
+release_memo() ->
+  ets:delete(memo_table_name()).
+
+-spec memoize(index(), atom(), parse_result()) -> true.
+memoize(Index, Name, Result) ->
+  Memo = case ets:lookup(memo_table_name(), Index) of
+              [] -> [];
+              [{Index, Plist}] -> Plist
+         end,
+  ets:insert(memo_table_name(), {Index, [{Name, Result}|Memo]}).
+
+-spec get_memo(index(), atom()) -> {ok, term()} | {error, not_found}.
+get_memo(Index, Name) ->
+  case ets:lookup(memo_table_name(), Index) of
+    [] -> {error, not_found};
+    [{Index, Plist}] ->
+      case proplists:lookup(Name, Plist) of
+        {Name, Result}  -> {ok, Result};
+        _  -> {error, not_found}
+      end
+    end.
+
+-spec memo_table_name() -> ets:tid().
+memo_table_name() ->
+    get({parse_memo_table, ?MODULE}).
+
+-ifdef(p_eof).
+-spec p_eof() -> parse_fun().
+p_eof() ->
+  fun(<<>>, Index) -> {eof, [], Index};
+     (_, Index) -> {fail, {expected, eof, Index}} end.
+-endif.
+
+-ifdef(p_optional).
+-spec p_optional(parse_fun()) -> parse_fun().
+p_optional(P) ->
+  fun(Input, Index) ->
+      case P(Input, Index) of
+        {fail,_} -> {[], Input, Index};
+        {_, _, _} = Success -> Success
+      end
+  end.
+-endif.
+
+-ifdef(p_not).
+-spec p_not(parse_fun()) -> parse_fun().
+p_not(P) ->
+  fun(Input, Index)->
+      case P(Input,Index) of
+        {fail,_} ->
+          {[], Input, Index};
+        {Result, _, _} -> {fail, {expected, {no_match, Result},Index}}
+      end
+  end.
+-endif.
+
+-ifdef(p_assert).
+-spec p_assert(parse_fun()) -> parse_fun().
+p_assert(P) ->
+  fun(Input,Index) ->
+      case P(Input,Index) of
+        {fail,_} = Failure-> Failure;
+        _ -> {[], Input, Index}
+      end
+  end.
+-endif.
+
+-ifdef(p_seq).
+-spec p_seq([parse_fun()]) -> parse_fun().
+p_seq(P) ->
+  fun(Input, Index) ->
+      p_all(P, Input, Index, [])
+  end.
+
+-spec p_all([parse_fun()], input(), index(), [term()]) -> parse_result().
+p_all([], Inp, Index, Accum ) -> {lists:reverse( Accum ), Inp, Index};
+p_all([P|Parsers], Inp, Index, Accum) ->
+  case P(Inp, Index) of
+    {fail, _} = Failure -> Failure;
+    {Result, InpRem, NewIndex} -> p_all(Parsers, InpRem, NewIndex, [Result|Accum])
+  end.
+-endif.
+
+-ifdef(p_choose).
+-spec p_choose([parse_fun()]) -> parse_fun().
+p_choose(Parsers) ->
+  fun(Input, Index) ->
+      p_attempt(Parsers, Input, Index, none)
+  end.
+
+-spec p_attempt([parse_fun()], input(), index(), none | parse_failure()) -> parse_result().
+p_attempt([], _Input, _Index, Failure) -> Failure;
+p_attempt([P|Parsers], Input, Index, FirstFailure)->
+  case P(Input, Index) of
+    {fail, _} = Failure ->
+      case FirstFailure of
+        none -> p_attempt(Parsers, Input, Index, Failure);
+        _ -> p_attempt(Parsers, Input, Index, FirstFailure)
+      end;
+    Result -> Result
+  end.
+-endif.
+
+-ifdef(p_zero_or_more).
+-spec p_zero_or_more(parse_fun()) -> parse_fun().
+p_zero_or_more(P) ->
+  fun(Input, Index) ->
+      p_scan(P, Input, Index, [])
+  end.
+-endif.
+
+-ifdef(p_one_or_more).
+-spec p_one_or_more(parse_fun()) -> parse_fun().
+p_one_or_more(P) ->
+  fun(Input, Index)->
+      Result = p_scan(P, Input, Index, []),
+      case Result of
+        {[_|_], _, _} ->
+          Result;
+        _ ->
+          {fail, {expected, Failure, _}} = P(Input,Index),
+          {fail, {expected, {at_least_one, Failure}, Index}}
+      end
+  end.
+-endif.
+
+-ifdef(p_label).
+-spec p_label(atom(), parse_fun()) -> parse_fun().
+p_label(Tag, P) ->
+  fun(Input, Index) ->
+      case P(Input, Index) of
+        {fail,_} = Failure ->
+           Failure;
+        {Result, InpRem, NewIndex} ->
+          {{Tag, Result}, InpRem, NewIndex}
+      end
+  end.
+-endif.
+
+-ifdef(p_scan).
+-spec p_scan(parse_fun(), input(), index(), [term()]) -> {[term()], input(), index()}.
+p_scan(_, <<>>, Index, Accum) -> {lists:reverse(Accum), <<>>, Index};
+p_scan(P, Inp, Index, Accum) ->
+  case P(Inp, Index) of
+    {fail,_} -> {lists:reverse(Accum), Inp, Index};
+    {Result, InpRem, NewIndex} -> p_scan(P, InpRem, NewIndex, [Result | Accum])
+  end.
+-endif.
+
+-ifdef(p_string).
+-spec p_string(binary()) -> parse_fun().
+p_string(S) ->
+    Length = erlang:byte_size(S),
+    fun(Input, Index) ->
+      try
+          <<S:Length/binary, Rest/binary>> = Input,
+          {S, Rest, p_advance_index(S, Index)}
+      catch
+          error:{badmatch,_} -> {fail, {expected, {string, S}, Index}}
+      end
+    end.
+-endif.
+
+-ifdef(p_anything).
+-spec p_anything() -> parse_fun().
+p_anything() ->
+  fun(<<>>, Index) -> {fail, {expected, any_character, Index}};
+     (Input, Index) when is_binary(Input) ->
+          <<C/utf8, Rest/binary>> = Input,
+          {<<C/utf8>>, Rest, p_advance_index(<<C/utf8>>, Index)}
+  end.
+-endif.
+
+-ifdef(p_charclass).
+-spec p_charclass(string() | binary()) -> parse_fun().
+p_charclass(Class) ->
+    {ok, RE} = re:compile(Class, [unicode, dotall]),
+    fun(Inp, Index) ->
+            case re:run(Inp, RE, [anchored]) of
+                {match, [{0, Length}|_]} ->
+                    {Head, Tail} = erlang:split_binary(Inp, Length),
+                    {Head, Tail, p_advance_index(Head, Index)};
+                _ -> {fail, {expected, {character_class, binary_to_list(Class)}, Index}}
+            end
+    end.
+-endif.
+
+-ifdef(p_regexp).
+-spec p_regexp(binary()) -> parse_fun().
+p_regexp(Regexp) ->
+    {ok, RE} = re:compile(Regexp, [unicode, dotall, anchored]),
+    fun(Inp, Index) ->
+        case re:run(Inp, RE) of
+            {match, [{0, Length}|_]} ->
+                {Head, Tail} = erlang:split_binary(Inp, Length),
+                {Head, Tail, p_advance_index(Head, Index)};
+            _ -> {fail, {expected, {regexp, binary_to_list(Regexp)}, Index}}
+        end
+    end.
+-endif.
+
+-ifdef(line).
+-spec line(index() | term()) -> pos_integer() | undefined.
+line({{line,L},_}) -> L;
+line(_) -> undefined.
+-endif.
+
+-ifdef(column).
+-spec column(index() | term()) -> pos_integer() | undefined.
+column({_,{column,C}}) -> C;
+column(_) -> undefined.
+-endif.
+
+-spec p_advance_index(input() | unicode:charlist() | pos_integer(), index()) -> index().
+p_advance_index(MatchedInput, Index) when is_list(MatchedInput) orelse is_binary(MatchedInput)-> % strings
+  lists:foldl(fun p_advance_index/2, Index, unicode:characters_to_list(MatchedInput));
+p_advance_index(MatchedInput, Index) when is_integer(MatchedInput) -> % single characters
+  {{line, Line}, {column, Col}} = Index,
+  case MatchedInput of
+    $\n -> {{line, Line+1}, {column, 1}};
+    _ -> {{line, Line}, {column, Col+1}}
+  end.
similarity index 98%
rename from rabbitmq-server/deps/rabbit_common/src/mirrored_supervisor.erl
rename to deps/rabbit_common/src/mirrored_supervisor.erl
index 991e3541076a6d637c4ee813a0ce03e13d931d47..ec21a8e32b63f45f370d8d13aec13582ba43e4b4 100644 (file)
 
 -define(SUPERVISOR, supervisor2).
 -define(GEN_SERVER, gen_server2).
--define(PG2,        pg2_fixed).
 -define(SUP_MODULE, mirrored_supervisor_sups).
 
 -define(TABLE, mirrored_sup_childspec).
@@ -254,7 +253,7 @@ fold(FunAtom, Sup, AggFun) ->
     Group = call(Sup, group),
     lists:foldl(AggFun, [],
                 [apply(?SUPERVISOR, FunAtom, [D]) ||
-                    M <- ?PG2:get_members(Group),
+                    M <- pg2:get_members(Group),
                     D <- [delegate(M)]]).
 
 child(Sup, Id) ->
@@ -286,9 +285,9 @@ handle_call({init, Overall}, _From,
                            tx_fun             = TxFun,
                            initial_childspecs = ChildSpecs}) ->
     process_flag(trap_exit, true),
-    ?PG2:create(Group),
-    ok = ?PG2:join(Group, Overall),
-    Rest = ?PG2:get_members(Group) -- [Overall],
+    pg2:create(Group),
+    ok = pg2:join(Group, Overall),
+    Rest = pg2:get_members(Group) -- [Overall],
     case Rest of
         [] -> TxFun(fun() -> delete_all(Group) end);
         _  -> ok
@@ -364,7 +363,7 @@ handle_info({'DOWN', _Ref, process, Pid, _Reason},
                            child_order = ChildOrder}) ->
     %% TODO load balance this
     %% No guarantee pg2 will have received the DOWN before us.
-    R = case lists:sort(?PG2:get_members(Group)) -- [Pid] of
+    R = case lists:sort(pg2:get_members(Group)) -- [Pid] of
             [O | _] -> ChildSpecs =
                            TxFun(fun() -> update_all(O, Pid) end),
                        [start(Delegate, ChildSpec)
@@ -389,7 +388,7 @@ code_change(_OldVsn, State, _Extra) ->
 %%----------------------------------------------------------------------------
 
 tell_all_peers_to_die(Group, Reason) ->
-    [cast(P, {die, Reason}) || P <- ?PG2:get_members(Group) -- [self()]].
+    [cast(P, {die, Reason}) || P <- pg2:get_members(Group) -- [self()]].
 
 maybe_start(Group, TxFun, Overall, Delegate, ChildSpec) ->
     try TxFun(fun() -> check_start(Group, Overall, Delegate, ChildSpec) end) of
similarity index 94%
rename from rabbitmq-server/deps/rabbit_common/src/rabbit_amqqueue.erl
rename to deps/rabbit_common/src/rabbit_amqqueue.erl
index 27b352ad4eb51b79107bccbfc31d05cfaa9fba4f..64dc33881a6b2dc3f65fa84525b7ed3348559fa4 100644 (file)
@@ -25,7 +25,7 @@
          check_exclusive_access/2, with_exclusive_access_or_die/3,
          stat/1, deliver/2, requeue/3, ack/3, reject/4]).
 -export([list/0, list/1, info_keys/0, info/1, info/2, info_all/1, info_all/2,
-         info_all/6, info_local/1]).
+         info_all/5, info_local/1]).
 -export([list_down/1]).
 -export([force_event_refresh/1, notify_policy_changed/1]).
 -export([consumers/1, consumers_all/1,  consumers_all/3, consumer_info_keys/0]).
@@ -34,8 +34,7 @@
 -export([notify_down_all/2, notify_down_all/3, activate_limit_all/2, credit/5]).
 -export([on_node_up/1, on_node_down/1]).
 -export([update/2, store_queue/1, update_decorators/1, policy_changed/2]).
--export([start_mirroring/1, stop_mirroring/1, sync_mirrors/1,
-         cancel_sync_mirrors/1]).
+-export([update_mirroring/1, sync_mirrors/1, cancel_sync_mirrors/1, is_mirrored/1]).
 
 -export([pid_of/1, pid_of/2]).
 
 -spec info_all(rabbit_types:vhost()) -> [rabbit_types:infos()].
 -spec info_all(rabbit_types:vhost(), rabbit_types:info_keys()) ->
           [rabbit_types:infos()].
+-type info_all_filter() :: 'all' | 'online' | 'offline' | 'local'.
 -spec info_all
-        (rabbit_types:vhost(), rabbit_types:info_keys(), boolean(), boolean(),
+        (rabbit_types:vhost(), rabbit_types:info_keys(), info_all_filter(),
          reference(), pid()) ->
             'ok'.
 -spec force_event_refresh(reference()) -> 'ok'.
 -spec update_decorators(name()) -> 'ok'.
 -spec policy_changed(rabbit_types:amqqueue(), rabbit_types:amqqueue()) ->
           'ok'.
--spec start_mirroring(pid()) -> 'ok'.
--spec stop_mirroring(pid()) -> 'ok'.
+-spec update_mirroring(pid()) -> 'ok'.
 -spec sync_mirrors(rabbit_types:amqqueue() | pid()) ->
           'ok' | rabbit_types:error('not_mirrored').
 -spec cancel_sync_mirrors(rabbit_types:amqqueue() | pid()) ->
           'ok' | {'ok', 'not_syncing'}.
+-spec is_mirrored(rabbit_types:amqqueue()) -> boolean().
 
 -spec pid_of(rabbit_types:amqqueue()) ->
           {'ok', pid()} | rabbit_types:error('not_found').
@@ -265,8 +265,13 @@ find_durable_queues() ->
               qlc:e(qlc:q([Q || Q = #amqqueue{name = Name,
                                               pid  = Pid}
                                     <- mnesia:table(rabbit_durable_queue),
-                                node(Pid) == Node,
-                                mnesia:read(rabbit_queue, Name, read) =:= []]))
+                                node(Pid) == Node andalso
+                               %% Terminations on node down will not remove the rabbit_queue
+                               %% record if it is a mirrored queue (such info is now obtained from
+                               %% the policy). Thus, we must check if the local pid is alive
+                               %% - if the record is present - in order to restart.
+                                                   (mnesia:read(rabbit_queue, Name, read) =:= []
+                                                    orelse not erlang:is_process_alive(Pid))]))
       end).
 
 recover_durable_queues(QueuesAndRecoveryTerms) ->
@@ -298,7 +303,8 @@ declare(QueueName, Durable, AutoDelete, Args, Owner, Node) ->
                                       sync_slave_pids    = [],
                                       recoverable_slaves = [],
                                       gm_pids            = [],
-                                      state              = live})),
+                                      state              = live,
+                                      policy_version     = 0 })),
 
     Node1 = case rabbit_queue_master_location_misc:get_location(Q)  of
               {ok, Node0}  -> Node0;
@@ -627,15 +633,28 @@ info_all(VHostPath, Items) ->
     map(list(VHostPath), fun (Q) -> info(Q, Items) end) ++
         map(list_down(VHostPath), fun (Q) -> info_down(Q, Items, down) end).
 
-info_all(VHostPath, Items, NeedOnline, NeedOffline, Ref, AggregatorPid) ->
-    NeedOnline andalso rabbit_control_misc:emitting_map_with_exit_handler(
-                         AggregatorPid, Ref, fun(Q) -> info(Q, Items) end, list(VHostPath),
-                         continue),
-    NeedOffline andalso rabbit_control_misc:emitting_map_with_exit_handler(
-                          AggregatorPid, Ref, fun(Q) -> info_down(Q, Items, down) end,
-                          list_down(VHostPath),
-                          continue),
-    %% Previous maps are incomplete, finalize emission
+info_all_partial_emit(VHostPath, Items, all, Ref, AggregatorPid) ->
+    info_all_partial_emit(VHostPath, Items, online, Ref, AggregatorPid),
+    info_all_partial_emit(VHostPath, Items, offline, Ref, AggregatorPid);
+info_all_partial_emit(VHostPath, Items, online, Ref, AggregatorPid) ->
+    rabbit_control_misc:emitting_map_with_exit_handler(
+      AggregatorPid, Ref, fun(Q) -> info(Q, Items) end,
+      list(VHostPath),
+      continue);
+info_all_partial_emit(VHostPath, Items, offline, Ref, AggregatorPid) ->
+    rabbit_control_misc:emitting_map_with_exit_handler(
+      AggregatorPid, Ref, fun(Q) -> info_down(Q, Items, down) end,
+      list_down(VHostPath),
+      continue);
+info_all_partial_emit(VHostPath, Items, local, Ref, AggregatorPid) ->
+    rabbit_control_misc:emitting_map_with_exit_handler(
+      AggregatorPid, Ref, fun(Q) -> info(Q, Items) end,
+      list_local(VHostPath),
+      continue).
+
+info_all(VHostPath, Items, Filter, Ref, AggregatorPid) ->
+    info_all_partial_emit(VHostPath, Items, Filter, Ref, AggregatorPid),
+    %% Previous map(s) are incomplete, finalize emission
     rabbit_control_misc:emitting_map(AggregatorPid, Ref, fun(_) -> no_op end, []).
 
 info_local(VHostPath) ->
@@ -862,14 +881,16 @@ set_ram_duration_target(QPid, Duration) ->
 set_maximum_since_use(QPid, Age) ->
     gen_server2:cast(QPid, {set_maximum_since_use, Age}).
 
-start_mirroring(QPid) -> ok = delegate:cast(QPid, start_mirroring).
-stop_mirroring(QPid)  -> ok = delegate:cast(QPid, stop_mirroring).
+update_mirroring(QPid) -> ok = delegate:cast(QPid, update_mirroring).
 
 sync_mirrors(#amqqueue{pid = QPid}) -> delegate:call(QPid, sync_mirrors);
 sync_mirrors(QPid)                  -> delegate:call(QPid, sync_mirrors).
 cancel_sync_mirrors(#amqqueue{pid = QPid}) -> delegate:call(QPid, cancel_sync_mirrors);
 cancel_sync_mirrors(QPid)                  -> delegate:call(QPid, cancel_sync_mirrors).
 
+is_mirrored(Q) ->
+    rabbit_mirror_queue_misc:is_mirrored(Q).
+
 on_node_up(Node) ->
     ok = rabbit_misc:execute_mnesia_transaction(
            fun () ->
@@ -914,11 +935,11 @@ on_node_down(Node) ->
     rabbit_misc:execute_mnesia_tx_with_tail(
       fun () -> QsDels =
                     qlc:e(qlc:q([{QName, delete_queue(QName)} ||
-                                    #amqqueue{name = QName, pid = Pid,
-                                              slave_pids = []}
+                                    #amqqueue{name = QName, pid = Pid} = Q
                                         <- mnesia:table(rabbit_queue),
-                                    node(Pid) == Node andalso
-                                    not rabbit_mnesia:is_process_alive(Pid)])),
+                                   not rabbit_amqqueue:is_mirrored(Q) andalso
+                                       node(Pid) == Node andalso
+                                       not rabbit_mnesia:is_process_alive(Pid)])),
                 {Qs, Dels} = lists:unzip(QsDels),
                 T = rabbit_binding:process_deletions(
                       lists:foldl(fun rabbit_binding:combine_deletions/2,
similarity index 99%
rename from rabbitmq-server/deps/rabbit_common/src/rabbit_channel.erl
rename to deps/rabbit_common/src/rabbit_channel.erl
index ab7d38ddece493693d0640eb552b5fdffe110d9d..ef523a5b263e11cdf8977044f73a43ef6f76deae 100644 (file)
@@ -597,7 +597,13 @@ handle_info({'DOWN', _MRef, process, QPid, Reason}, State) ->
                       queue_monitors = pmon:erase(QPid, QMons)});
 
 handle_info({'EXIT', _Pid, Reason}, State) ->
-    {stop, Reason, State}.
+    {stop, Reason, State};
+
+handle_info({{Ref, Node}, LateAnswer}, State = #ch{channel = Channel})
+  when is_reference(Ref) ->
+    log(warning, "Channel ~p ignoring late answer ~p from ~p",
+        [Channel, LateAnswer, Node]),
+    noreply(State).
 
 handle_pre_hibernate(State) ->
     ok = clear_permission_cache(),
similarity index 92%
rename from rabbitmq-server/deps/rabbit_common/src/rabbit_common.app.src
rename to deps/rabbit_common/src/rabbit_common.app.src
index a1a47682c3a9e0f2b88296aad1b9c1509e1a0373..3dbc2b7936ee4d6227c79eefec1b00a5d7f2ad18 100644 (file)
@@ -2,7 +2,7 @@
 
 {application, rabbit_common, [
        {description, ""},
-       {vsn, "3.6.5"},
+       {vsn, "3.6.6"},
        {id, "git"},
        {modules, []},
        {registered, []},
similarity index 86%
rename from rabbitmq-server/deps/rabbit_common/src/rabbit_health_check.erl
rename to deps/rabbit_common/src/rabbit_health_check.erl
index 185b6ff76b0e7ac91038292d8f2619f07677f199..f3bc3fa2ffa32135684460e362b750c51028f267 100644 (file)
@@ -35,7 +35,7 @@ node(Node, Timeout) ->
     rabbit_misc:rpc_call(Node, rabbit_health_check, local, [], Timeout).
 
 local() ->
-    run_checks([list_channels, list_queues, alarms]).
+    run_checks([list_channels, list_queues, alarms, rabbit_node_monitor]).
 
 %%----------------------------------------------------------------------------
 %% Internal functions
@@ -63,6 +63,16 @@ node_health_check(list_channels) ->
 node_health_check(list_queues) ->
     health_check_queues(rabbit_vhost:list());
 
+node_health_check(rabbit_node_monitor) ->
+    case rabbit_node_monitor:partitions() of
+        L when is_list(L) ->
+            ok;
+        Other ->
+            ErrorMsg = io_lib:format("rabbit_node_monitor reports unexpected partitions value: ~p",
+                                     [Other]),
+            {error_string, ErrorMsg}
+    end;
+
 node_health_check(alarms) ->
     case proplists:get_value(alarms, rabbit:status()) of
         [] ->
similarity index 97%
rename from rabbitmq-server/deps/rabbit_common/src/rabbit_misc.erl
rename to deps/rabbit_common/src/rabbit_misc.erl
index 8965c59973b8245749a8cfb0fe132a8433deb7b8..75cee8b6c0547311c58e4f903358b9aff8f4af0e 100644 (file)
@@ -737,53 +737,40 @@ compose_pid(Node, Cre, Id, Ser) ->
     <<131,NodeEnc/binary>> = term_to_binary(Node),
     binary_to_term(<<131,103,NodeEnc/binary,Id:32,Ser:32,Cre:8>>).
 
-version_compare(A, B, lte) ->
-    case version_compare(A, B) of
-        eq -> true;
-        lt -> true;
-        gt -> false
-    end;
-version_compare(A, B, gte) ->
-    case version_compare(A, B) of
-        eq -> true;
-        gt -> true;
-        lt -> false
-    end;
-version_compare(A, B, Result) ->
-    Result =:= version_compare(A, B).
-
-version_compare(A, A) ->
-    eq;
-version_compare([], [$0 | B]) ->
-    version_compare([], dropdot(B));
-version_compare([], _) ->
-    lt; %% 2.3 < 2.3.1
-version_compare([$0 | A], []) ->
-    version_compare(dropdot(A), []);
-version_compare(_, []) ->
-    gt; %% 2.3.1 > 2.3
-version_compare(A,  B) ->
-    {AStr, ATl} = lists:splitwith(fun (X) -> X =/= $. end, A),
-    {BStr, BTl} = lists:splitwith(fun (X) -> X =/= $. end, B),
-    ANum = list_to_integer(AStr),
-    BNum = list_to_integer(BStr),
-    if ANum =:= BNum -> version_compare(dropdot(ATl), dropdot(BTl));
-       ANum < BNum   -> lt;
-       ANum > BNum   -> gt
+version_compare(A, B, eq)  -> ec_semver:eql(A, B);
+version_compare(A, B, lt)  -> ec_semver:lt(A, B);
+version_compare(A, B, lte) -> ec_semver:lte(A, B);
+version_compare(A, B, gt)  -> ec_semver:gt(A, B);
+version_compare(A, B, gte) -> ec_semver:gte(A, B).
+
+version_compare(A, B) ->
+    case version_compare(A, B, lt) of
+        true -> lt;
+        false -> case version_compare(A, B, gt) of
+                     true -> gt;
+                     false -> eq
+                 end
     end.
 
 %% a.b.c and a.b.d match, but a.b.c and a.d.e don't. If
 %% versions do not match that pattern, just compare them.
+%%
+%% Special case for 3.6.6 because it introduced a change to the schema.
+%% e.g. 3.6.6 is not compatible with 3.6.5
+%% This special case can be removed once 3.6.x reaches EOL
 version_minor_equivalent(A, B) ->
-    {ok, RE} = re:compile("^(\\d+\\.\\d+)(\\.\\d+)\$"),
-    Opts = [{capture, all_but_first, list}],
-    case {re:run(A, RE, Opts), re:run(B, RE, Opts)} of
-        {{match, [A1|_]}, {match, [B1|_]}} -> A1 =:= B1;
-        _                                  -> A =:= B
+    {{MajA, MinA, PatchA, _}, _} = ec_semver:normalize(ec_semver:parse(A)),
+    {{MajB, MinB, PatchB, _}, _} = ec_semver:normalize(ec_semver:parse(B)),
+
+    case {MajA, MinA, MajB, MinB} of
+        {3, 6, 3, 6} -> if
+                            PatchA >= 6 -> PatchB >= 6;
+                            PatchA < 6  -> PatchB < 6;
+                            true -> false
+                        end;
+        _            -> MajA =:= MajB andalso MinA =:= MinB
     end.
 
-dropdot(A) -> lists:dropwhile(fun (X) -> X =:= $. end, A).
-
 dict_cons(Key, Value, Dict) ->
     dict:update(Key, fun (List) -> [Value | List] end, [Value], Dict).
 
similarity index 91%
rename from rabbitmq-server/deps/rabbitmq_amqp1_0/Makefile
rename to deps/rabbitmq_amqp1_0/Makefile
index d67b4045717a42453aa10b2e42932a1c5e5b2a77..e320af4d6c55afe87149567c8d2c39564e3882d6 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbitmq_amqp1_0
 
-DEPS = amqp_client
-TEST_DEPS += rabbit
+DEPS = rabbit_common rabbit amqp_client
+TEST_DEPS = rabbitmq_ct_helpers
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
@@ -18,10 +18,6 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-
-# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now.
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
 include erlang.mk
 
 # --------------------------------------------------------------------
similarity index 95%
rename from rabbitmq-server/deps/rabbitmq_management/erlang.mk
rename to deps/rabbitmq_amqp1_0/erlang.mk
index efbcf5cd11a59ef1425ead2dfa4b0514e62b437b..6d2a31c974f3a762751bb19a108f2c5ff4abc0ba 100644 (file)
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
 
 ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
 
-ERLANG_MK_VERSION = 2.0.0-pre.2-76-g427cfb8
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
 
 # Core configuration.
 
@@ -24,6 +24,7 @@ PROJECT ?= $(notdir $(CURDIR))
 PROJECT := $(strip $(PROJECT))
 
 PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
 
 # Verbosity.
 
@@ -109,8 +110,8 @@ help::
                "  all           Run deps, app and rel targets in that order" \
                "  app           Compile the project" \
                "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
                "  search q=...  Search for a package in the built-in index" \
                "  rel           Build a release for this project, if applicable" \
                "  docs          Build the documentation for this project" \
@@ -283,7 +284,7 @@ pkg_apns_description = Apple Push Notification Server for Erlang
 pkg_apns_homepage = http://inaka.github.com/apns4erl
 pkg_apns_fetch = git
 pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
+pkg_apns_commit = master
 
 PACKAGES += azdht
 pkg_azdht_name = azdht
@@ -387,7 +388,7 @@ pkg_bitcask_description = because you need another a key/value storage engine
 pkg_bitcask_homepage = https://github.com/basho/bitcask
 pkg_bitcask_fetch = git
 pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
+pkg_bitcask_commit = develop
 
 PACKAGES += bitstore
 pkg_bitstore_name = bitstore
@@ -405,14 +406,6 @@ pkg_bootstrap_fetch = git
 pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
 pkg_bootstrap_commit = master
 
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
 PACKAGES += boss_db
 pkg_boss_db_name = boss_db
 pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
@@ -421,6 +414,14 @@ pkg_boss_db_fetch = git
 pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
 pkg_boss_db_commit = master
 
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
 PACKAGES += brod
 pkg_brod_name = brod
 pkg_brod_description = Kafka client in Erlang
@@ -459,7 +460,7 @@ pkg_cake_description = Really simple terminal colorization
 pkg_cake_homepage = https://github.com/darach/cake-erl
 pkg_cake_fetch = git
 pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
+pkg_cake_commit = master
 
 PACKAGES += carotene
 pkg_carotene_name = carotene
@@ -517,6 +518,14 @@ pkg_chronos_fetch = git
 pkg_chronos_repo = https://github.com/lehoff/chronos
 pkg_chronos_commit = master
 
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
 PACKAGES += cl
 pkg_cl_name = cl
 pkg_cl_description = OpenCL binding for Erlang
@@ -557,13 +566,13 @@ pkg_cloudi_service_api_requests_fetch = git
 pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
 pkg_cloudi_service_api_requests_commit = master
 
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
 
 PACKAGES += cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
@@ -573,14 +582,6 @@ pkg_cloudi_service_db_cassandra_fetch = git
 pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
 pkg_cloudi_service_db_cassandra_commit = master
 
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
 PACKAGES += cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
 pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
@@ -637,6 +638,14 @@ pkg_cloudi_service_db_tokyotyrant_fetch = git
 pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
 pkg_cloudi_service_db_tokyotyrant_commit = master
 
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
 PACKAGES += cloudi_service_filesystem
 pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
 pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
@@ -795,7 +804,7 @@ pkg_cowboy_description = Small, fast and modular HTTP server.
 pkg_cowboy_homepage = http://ninenines.eu
 pkg_cowboy_fetch = git
 pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
+pkg_cowboy_commit = 1.0.4
 
 PACKAGES += cowdb
 pkg_cowdb_name = cowdb
@@ -811,7 +820,7 @@ pkg_cowlib_description = Support library for manipulating Web protocols.
 pkg_cowlib_homepage = http://ninenines.eu
 pkg_cowlib_fetch = git
 pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
+pkg_cowlib_commit = 1.0.2
 
 PACKAGES += cpg
 pkg_cpg_name = cpg
@@ -1029,14 +1038,6 @@ pkg_edown_fetch = git
 pkg_edown_repo = https://github.com/uwiger/edown
 pkg_edown_commit = master
 
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
 PACKAGES += eep_app
 pkg_eep_app_name = eep_app
 pkg_eep_app_description = Embedded Event Processing
@@ -1045,6 +1046,14 @@ pkg_eep_app_fetch = git
 pkg_eep_app_repo = https://github.com/darach/eep-erl
 pkg_eep_app_commit = master
 
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
 PACKAGES += efene
 pkg_efene_name = efene
 pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
@@ -1053,14 +1062,6 @@ pkg_efene_fetch = git
 pkg_efene_repo = https://github.com/efene/efene
 pkg_efene_commit = master
 
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
 PACKAGES += egeoip
 pkg_egeoip_name = egeoip
 pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
@@ -1075,7 +1076,7 @@ pkg_ehsa_description = Erlang HTTP server basic and digest authentication module
 pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
 pkg_ehsa_fetch = hg
 pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
+pkg_ehsa_commit = default
 
 PACKAGES += ej
 pkg_ej_name = ej
@@ -1237,14 +1238,6 @@ pkg_eqm_fetch = git
 pkg_eqm_repo = https://github.com/loucash/eqm
 pkg_eqm_commit = master
 
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
 PACKAGES += eredis_pool
 pkg_eredis_pool_name = eredis_pool
 pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
@@ -1253,6 +1246,14 @@ pkg_eredis_pool_fetch = git
 pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
 pkg_eredis_pool_commit = master
 
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
 PACKAGES += erl_streams
 pkg_erl_streams_name = erl_streams
 pkg_erl_streams_description = Streams in Erlang
@@ -1515,7 +1516,7 @@ pkg_erwa_description = A WAMP router and client written in Erlang.
 pkg_erwa_homepage = https://github.com/bwegh/erwa
 pkg_erwa_fetch = git
 pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
+pkg_erwa_commit = master
 
 PACKAGES += espec
 pkg_espec_name = espec
@@ -1541,14 +1542,6 @@ pkg_etap_fetch = git
 pkg_etap_repo = https://github.com/ngerakines/etap
 pkg_etap_commit = master
 
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
 PACKAGES += etest_http
 pkg_etest_http_name = etest_http
 pkg_etest_http_description = etest Assertions around HTTP (client-side)
@@ -1557,6 +1550,14 @@ pkg_etest_http_fetch = git
 pkg_etest_http_repo = https://github.com/wooga/etest_http
 pkg_etest_http_commit = master
 
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
 PACKAGES += etoml
 pkg_etoml_name = etoml
 pkg_etoml_description = TOML language erlang parser
@@ -1565,14 +1566,6 @@ pkg_etoml_fetch = git
 pkg_etoml_repo = https://github.com/kalta/etoml
 pkg_etoml_commit = master
 
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
 PACKAGES += eunit_formatters
 pkg_eunit_formatters_name = eunit_formatters
 pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
@@ -1581,6 +1574,14 @@ pkg_eunit_formatters_fetch = git
 pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
 pkg_eunit_formatters_commit = master
 
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
 PACKAGES += euthanasia
 pkg_euthanasia_name = euthanasia
 pkg_euthanasia_description = Merciful killer for your Erlang processes
@@ -1619,7 +1620,7 @@ pkg_exometer_description = Basic measurement objects and probe behavior
 pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
 pkg_exometer_fetch = git
 pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
+pkg_exometer_commit = master
 
 PACKAGES += exs1024
 pkg_exs1024_name = exs1024
@@ -1683,7 +1684,15 @@ pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
 pkg_feeder_homepage = https://github.com/michaelnisi/feeder
 pkg_feeder_fetch = git
 pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
 
 PACKAGES += fix
 pkg_fix_name = fix
@@ -1709,14 +1718,6 @@ pkg_fn_fetch = git
 pkg_fn_repo = https://github.com/reiddraper/fn
 pkg_fn_commit = master
 
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
 PACKAGES += folsom_cowboy
 pkg_folsom_cowboy_name = folsom_cowboy
 pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
@@ -1725,6 +1726,14 @@ pkg_folsom_cowboy_fetch = git
 pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
 pkg_folsom_cowboy_commit = master
 
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
 PACKAGES += folsomite
 pkg_folsomite_name = folsomite
 pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
@@ -1845,6 +1854,14 @@ pkg_gen_unix_fetch = git
 pkg_gen_unix_repo = https://github.com/msantos/gen_unix
 pkg_gen_unix_commit = master
 
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
 PACKAGES += getopt
 pkg_getopt_name = getopt
 pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
@@ -2003,7 +2020,7 @@ pkg_ibrowse_description = Erlang HTTP client
 pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
 pkg_ibrowse_fetch = git
 pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
+pkg_ibrowse_commit = master
 
 PACKAGES += ierlang
 pkg_ierlang_name = ierlang
@@ -2059,7 +2076,7 @@ pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
 pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
 pkg_jamdb_sybase_fetch = git
 pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
+pkg_jamdb_sybase_commit = master
 
 PACKAGES += jerg
 pkg_jerg_name = jerg
@@ -2072,11 +2089,19 @@ pkg_jerg_commit = master
 PACKAGES += jesse
 pkg_jesse_name = jesse
 pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
+pkg_jesse_homepage = https://github.com/for-GET/jesse
 pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
+pkg_jesse_repo = https://github.com/for-GET/jesse
 pkg_jesse_commit = master
 
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
 PACKAGES += jiffy
 pkg_jiffy_name = jiffy
 pkg_jiffy_description = JSON NIFs for Erlang.
@@ -2085,21 +2110,13 @@ pkg_jiffy_fetch = git
 pkg_jiffy_repo = https://github.com/davisp/jiffy
 pkg_jiffy_commit = master
 
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
 PACKAGES += jobs
 pkg_jobs_name = jobs
 pkg_jobs_description = a Job scheduler for load regulation
 pkg_jobs_homepage = https://github.com/esl/jobs
 pkg_jobs_fetch = git
 pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
+pkg_jobs_commit = master
 
 PACKAGES += joxa
 pkg_joxa_name = joxa
@@ -2109,6 +2126,14 @@ pkg_joxa_fetch = git
 pkg_joxa_repo = https://github.com/joxa/joxa
 pkg_joxa_commit = master
 
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
 PACKAGES += json
 pkg_json_name = json
 pkg_json_description = a high level json library for erlang (17.0+)
@@ -2117,13 +2142,13 @@ pkg_json_fetch = git
 pkg_json_repo = https://github.com/talentdeficit/json
 pkg_json_commit = master
 
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
 
 PACKAGES += jsonerl
 pkg_jsonerl_name = jsonerl
@@ -2157,6 +2182,14 @@ pkg_jsx_fetch = git
 pkg_jsx_repo = https://github.com/talentdeficit/jsx
 pkg_jsx_commit = master
 
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
 PACKAGES += kafka
 pkg_kafka_name = kafka
 pkg_kafka_description = Kafka consumer and producer in Erlang
@@ -2261,14 +2294,6 @@ pkg_kvs_fetch = git
 pkg_kvs_repo = https://github.com/synrc/kvs
 pkg_kvs_commit = master
 
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
 PACKAGES += lager_amqp_backend
 pkg_lager_amqp_backend_name = lager_amqp_backend
 pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
@@ -2285,6 +2310,14 @@ pkg_lager_syslog_fetch = git
 pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
 pkg_lager_syslog_commit = master
 
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
 PACKAGES += lambdapad
 pkg_lambdapad_name = lambdapad
 pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
@@ -2307,7 +2340,7 @@ pkg_lasse_description = SSE handler for Cowboy
 pkg_lasse_homepage = https://github.com/inaka/lasse
 pkg_lasse_fetch = git
 pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
+pkg_lasse_commit = master
 
 PACKAGES += ldap
 pkg_ldap_name = ldap
@@ -2541,14 +2574,6 @@ pkg_mixer_fetch = git
 pkg_mixer_repo = https://github.com/chef/mixer
 pkg_mixer_commit = master
 
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
 PACKAGES += mochiweb_xpath
 pkg_mochiweb_xpath_name = mochiweb_xpath
 pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
@@ -2557,6 +2582,14 @@ pkg_mochiweb_xpath_fetch = git
 pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
 pkg_mochiweb_xpath_commit = master
 
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
 PACKAGES += mockgyver
 pkg_mockgyver_name = mockgyver
 pkg_mockgyver_description = A mocking library for Erlang
@@ -2763,7 +2796,7 @@ pkg_octopus_description = Small and flexible pool manager written in Erlang
 pkg_octopus_homepage = https://github.com/erlangbureau/octopus
 pkg_octopus_fetch = git
 pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
+pkg_octopus_commit = master
 
 PACKAGES += of_protocol
 pkg_of_protocol_name = of_protocol
@@ -2835,7 +2868,7 @@ pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
 pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
 pkg_pegjs_fetch = git
 pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
+pkg_pegjs_commit = master
 
 PACKAGES += percept2
 pkg_percept2_name = percept2
@@ -3003,7 +3036,7 @@ pkg_qdate_description = Date, time, and timezone parsing, formatting, and conver
 pkg_qdate_homepage = https://github.com/choptastic/qdate
 pkg_qdate_fetch = git
 pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
+pkg_qdate_commit = master
 
 PACKAGES += qrcode
 pkg_qrcode_name = qrcode
@@ -3029,14 +3062,6 @@ pkg_quickrand_fetch = git
 pkg_quickrand_repo = https://github.com/okeuday/quickrand
 pkg_quickrand_commit = master
 
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
 PACKAGES += rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
 pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
@@ -3045,6 +3070,14 @@ pkg_rabbit_exchange_type_riak_fetch = git
 pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
 pkg_rabbit_exchange_type_riak_commit = master
 
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
 PACKAGES += rack
 pkg_rack_name = rack
 pkg_rack_description = Rack handler for erlang
@@ -3075,7 +3108,7 @@ pkg_ranch_description = Socket acceptor pool for TCP protocols.
 pkg_ranch_homepage = http://ninenines.eu
 pkg_ranch_fetch = git
 pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
+pkg_ranch_commit = 1.2.1
 
 PACKAGES += rbeacon
 pkg_rbeacon_name = rbeacon
@@ -3115,7 +3148,7 @@ pkg_recon_description = Collection of functions and scripts to debug Erlang in p
 pkg_recon_homepage = https://github.com/ferd/recon
 pkg_recon_fetch = git
 pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
+pkg_recon_commit = master
 
 PACKAGES += record_info
 pkg_record_info_name = record_info
@@ -3309,6 +3342,14 @@ pkg_rlimit_fetch = git
 pkg_rlimit_repo = https://github.com/jlouis/rlimit
 pkg_rlimit_commit = master
 
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
 PACKAGES += safetyvalve
 pkg_safetyvalve_name = safetyvalve
 pkg_safetyvalve_description = A safety valve for your erlang node
@@ -3379,7 +3420,7 @@ pkg_shotgun_description = better than just a gun
 pkg_shotgun_homepage = https://github.com/inaka/shotgun
 pkg_shotgun_fetch = git
 pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
+pkg_shotgun_commit = master
 
 PACKAGES += sidejob
 pkg_sidejob_name = sidejob
@@ -3437,6 +3478,14 @@ pkg_skel_fetch = git
 pkg_skel_repo = https://github.com/ParaPhrase/skel
 pkg_skel_commit = master
 
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
 PACKAGES += smother
 pkg_smother_name = smother
 pkg_smother_description = Extended code coverage metrics for Erlang.
@@ -3493,14 +3542,6 @@ pkg_stable_fetch = git
 pkg_stable_repo = https://github.com/dvv/stable
 pkg_stable_commit = master
 
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
 PACKAGES += statebox_riak
 pkg_statebox_riak_name = statebox_riak
 pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
@@ -3509,6 +3550,14 @@ pkg_statebox_riak_fetch = git
 pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
 pkg_statebox_riak_commit = master
 
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
 PACKAGES += statman
 pkg_statman_name = statman
 pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
@@ -3591,7 +3640,7 @@ pkg_switchboard_commit = master
 
 PACKAGES += syn
 pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
 pkg_syn_homepage = https://github.com/ostinelli/syn
 pkg_syn_fetch = git
 pkg_syn_repo = https://github.com/ostinelli/syn
@@ -3763,7 +3812,7 @@ pkg_unicorn_description = Generic configuration server
 pkg_unicorn_homepage = https://github.com/shizzard/unicorn
 pkg_unicorn_fetch = git
 pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
+pkg_unicorn_commit = master
 
 PACKAGES += unsplit
 pkg_unsplit_name = unsplit
@@ -3779,7 +3828,7 @@ pkg_uuid_description = Erlang UUID Implementation
 pkg_uuid_homepage = https://github.com/okeuday/uuid
 pkg_uuid_fetch = git
 pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
+pkg_uuid_commit = master
 
 PACKAGES += ux
 pkg_ux_name = ux
@@ -3899,7 +3948,7 @@ pkg_worker_pool_description = a simple erlang worker pool
 pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
 pkg_worker_pool_fetch = git
 pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
+pkg_worker_pool_commit = master
 
 PACKAGES += wrangler
 pkg_wrangler_name = wrangler
@@ -3931,7 +3980,7 @@ pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
 pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
 pkg_xref_runner_fetch = git
 pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.3
+pkg_xref_runner_commit = master
 
 PACKAGES += yamerl
 pkg_yamerl_name = yamerl
@@ -3965,13 +4014,21 @@ pkg_zab_engine_fetch = git
 pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
 pkg_zab_engine_commit = master
 
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
 PACKAGES += zeta
 pkg_zeta_name = zeta
 pkg_zeta_description = HTTP access log parser in Erlang
 pkg_zeta_homepage = https://github.com/s1n4/zeta
 pkg_zeta_fetch = git
 pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
+pkg_zeta_commit = master
 
 PACKAGES += zippers
 pkg_zippers_name = zippers
@@ -4082,16 +4139,35 @@ dep_verbose = $(dep_verbose_$(V))
 
 # Core targets.
 
-ifneq ($(SKIP_DEPS),)
-deps::
+ifdef IS_APP
+apps::
 else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
        done
 endif
-ifneq ($(IS_DEP),1)
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
        $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
 endif
        $(verbose) mkdir -p $(ERLANG_MK_TMP)
@@ -4348,9 +4424,9 @@ define dep_autopatch_rebar.erl
                [] -> ok;
                _ ->
                        Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
                                [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
                                [code:lib_dir(erl_interface, lib)])),
                        [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
                        FilterEnv = fun(Env) ->
@@ -4620,11 +4696,11 @@ endif
 # Forward-declare variables used in core/deps-tools.mk. This is required
 # in case plugins use them.
 
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
 
 # External plugins.
 
@@ -4649,6 +4725,7 @@ $(foreach p,$(DEP_PLUGINS),\
 DTL_FULL_PATH ?=
 DTL_PATH ?= templates/
 DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
 
 # Verbosity.
 
@@ -4689,7 +4766,7 @@ define erlydtl_compile.erl
                                re:replace(F2, "/",  "_",  [{return, list}, global])
                end,
                Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
                        ok -> ok;
                        {ok, _} -> ok
                end
@@ -4796,7 +4873,7 @@ app:: clean deps $(PROJECT).d
        $(verbose) $(MAKE) --no-print-directory app-build
 endif
 
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
 define app_file
 {application, $(PROJECT), [
        {description, "$(PROJECT_DESCRIPTION)"},
@@ -4816,7 +4893,7 @@ define app_file
        {modules, [$(call comma_list,$(2))]},
        {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
        {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
+       {mod, {$(PROJECT_MOD), []}}
 ]}.
 endef
 endif
@@ -4991,13 +5068,13 @@ ifeq ($(wildcard src/$(PROJECT).app.src),)
        $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
                > ebin/$(PROJECT).app
 else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
                echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
                exit 1; \
        fi
        $(appsrc_verbose) cat src/$(PROJECT).app.src \
                | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
                > ebin/$(PROJECT).app
 endif
 
@@ -5115,7 +5192,7 @@ endif
 # We strip out -Werror because we don't want to fail due to
 # warnings when used as a dependency.
 
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
 
 define compat_convert_erlc_opts
 $(if $(filter-out -Werror,$1),\
@@ -5124,12 +5201,16 @@ $(if $(filter-out -Werror,$1),\
 endef
 
 define compat_erlc_opts_to_list
-       [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
 endef
 
 define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
 {erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
 endef
 
@@ -5199,8 +5280,8 @@ help::
                "  bootstrap          Generate a skeleton of an OTP application" \
                "  bootstrap-lib      Generate a skeleton of an OTP library" \
                "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
                "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
                "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
                "  list-templates     List available templates"
@@ -5360,6 +5441,11 @@ code_change(_OldVsn, State, _Extra) ->
        {ok, State}.
 endef
 
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
 define tpl_cowboy_http
 -module($(n)).
 -behaviour(cowboy_http_handler).
@@ -5674,6 +5760,7 @@ ifeq ($(PLATFORM),msys2)
 # We hardcode the compiler used on MSYS2. The default CC=cc does
 # not produce working code. The "gcc" MSYS2 package also doesn't.
        CC = /mingw64/bin/gcc
+       export CC
        CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
        CXXFLAGS ?= -O3 -finline-functions -Wall
 else ifeq ($(PLATFORM),darwin)
@@ -5975,7 +6062,7 @@ help::
 CT_RUN = ct_run \
        -no_auto_compile \
        -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
        -dir $(TEST_DIR) \
        -logdir $(CURDIR)/logs
 
@@ -5984,12 +6071,18 @@ ct: $(if $(IS_APP),,apps-ct)
 else
 ct: test-build $(if $(IS_APP),,apps-ct)
        $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
 endif
 
 ifneq ($(ALL_APPS_DIRS),)
-apps-ct:
-       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app ct IS_APP=1; done
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
 endif
 
 ifndef t
@@ -6006,7 +6099,7 @@ endif
 define ct_suite_target
 ct-$(1): test-build
        $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
 endef
 
 $(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
@@ -6043,14 +6136,17 @@ help::
 # Plugin-specific targets.
 
 define filter_opts.erl
-       Opts = binary:split(<<"$1">>, <<"-">>, [global]),
-       Filtered = lists:reverse(lists:foldl(fun
-               (O = <<"pa ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"D ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"I ", _/bits>>, Acc) -> [O|Acc];
-               (_, Acc) -> Acc
-       end, [], Opts)),
-       io:format("~s~n", [[["-", O] || O <- Filtered]]),
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
        halt().
 endef
 
@@ -6067,7 +6163,7 @@ dialyze:
 else
 dialyze: $(DIALYZER_PLT)
 endif
-       $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
@@ -6102,6 +6198,8 @@ distclean-edoc:
 # Configuration.
 
 ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
 ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
 
 ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
@@ -6147,7 +6245,7 @@ define ESCRIPT_RAW
 '  ]),'\
 '  file:change_mode(Escript, 8#755)'\
 'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
+'Ez("$(ESCRIPT_FILE)"),'\
 'halt().'
 endef
 
@@ -6202,7 +6300,7 @@ define eunit.erl
        halt()
 endef
 
-EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin ebin
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
 
 ifdef t
 ifeq (,$(findstring :,$(t)))
@@ -6213,8 +6311,9 @@ eunit: test-build
        $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
 endif
 else
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
 EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
        $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
 
@@ -6237,7 +6336,7 @@ endif
 RELX ?= $(CURDIR)/relx
 RELX_CONFIG ?= $(CURDIR)/relx.config
 
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
 RELX_OPTS ?=
 RELX_OUTPUT_DIR ?= _rel
 
@@ -6379,9 +6478,9 @@ endif
 # Configuration.
 
 ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
+       XREFR_ARGS :=
 else
-       XREF_ARGS := -c $(XREF_CONFIG)
+       XREFR_ARGS := -c $(XREF_CONFIG)
 endif
 
 XREFR ?= $(CURDIR)/xrefr
@@ -6505,7 +6604,8 @@ define cover_report.erl
                true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
        TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
        TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
        {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
        io:format(F, "<!DOCTYPE html><html>~n"
                "<head><meta charset=\"UTF-8\">~n"
@@ -6515,7 +6615,7 @@ define cover_report.erl
        io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
        [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
                "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
        How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
        Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
        io:format(F, "</table>~n"
@@ -6532,62 +6632,95 @@ endif
 endif # ifneq ($(COVER_REPORT_DIR),)
 
 # Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
-# Fetch dependencies (without building them).
+# Fetch dependencies recursively (without building them).
 
 .PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
        fetch-shell-deps
 
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
 ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
 else
 # By default, we fetch "normal" dependencies. They are also included no
 # matter the type of requested dependencies.
 #
 # $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
 
 # Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
 # dependencies with a single target.
 ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
 endif
 ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
 endif
 ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
 endif
 ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
 endif
 
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 ifndef IS_APP
        $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
        done
 endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
        $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
                        if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
                         $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
                        fi \
                fi \
        done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
 endif # ifneq ($(SKIP_DEPS),)
 
 # List dependencies recursively.
@@ -6595,108 +6728,11 @@ endif # ifneq ($(SKIP_DEPS),)
 .PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
        list-shell-deps
 
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
 list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
 list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
 list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
 list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
 list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
 
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
 list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
+       $(verbose) cat $^
similarity index 88%
rename from rabbitmq-server/deps/rabbit_common/mk/rabbitmq-components.mk
rename to deps/rabbitmq_amqp1_0/rabbitmq-components.mk
index eb9e9e3e030aa3ca626eeabf028b8abe1601733d..05986d82ce9ccb40e04a478f9bfeb242040c9c52 100644 (file)
@@ -5,16 +5,6 @@ ifeq ($(.DEFAULT_GOAL),)
 .DEFAULT_GOAL = all
 endif
 
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
 # --------------------------------------------------------------------
 # RabbitMQ components.
 # --------------------------------------------------------------------
@@ -38,6 +28,7 @@ dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $
 dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
@@ -59,6 +50,7 @@ dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_r
 dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
 dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
@@ -98,6 +90,7 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_clusterer \
                      rabbitmq_codegen \
                      rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
                      rabbitmq_delayed_message_exchange \
                      rabbitmq_dotnet_client \
                      rabbitmq_event_exchange \
@@ -119,11 +112,11 @@ RABBITMQ_COMPONENTS = amqp_client \
                      rabbitmq_recent_history_exchange \
                      rabbitmq_routing_node_stamp \
                      rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
                      rabbitmq_sharding \
                      rabbitmq_shovel \
                      rabbitmq_shovel_management \
                      rabbitmq_stomp \
-                     rabbitmq_test \
                      rabbitmq_toke \
                      rabbitmq_top \
                      rabbitmq_tracing \
@@ -246,59 +239,10 @@ list-dist-deps::
 prepare-dist::
        @:
 
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
 # --------------------------------------------------------------------
 # rabbitmq-components.mk checks.
 # --------------------------------------------------------------------
 
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
 # If this project is under the Umbrella project, we override $(DEPS_DIR)
 # to point to the Umbrella's one. We also disable `make distclean` so
 # $(DEPS_DIR) is not accidentally removed.
@@ -312,11 +256,6 @@ endif
 ifeq ($(UNDER_UMBRELLA),1)
 ifneq ($(PROJECT),rabbitmq_public_umbrella)
 DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
 endif
 
 ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
similarity index 71%
rename from rabbitmq-server/deps/rabbitmq_amqp1_0/src/rabbitmq_amqp1_0.app.src
rename to deps/rabbitmq_amqp1_0/src/rabbitmq_amqp1_0.app.src
index 9e12bc819d16dc39c377cda136d67a3bdf56366f..da7914ec320b0bc44d621c83b7302b46e4a5e79d 100644 (file)
@@ -1,9 +1,9 @@
 {application, rabbitmq_amqp1_0,
  [{description, "AMQP 1.0 support for RabbitMQ"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {env, [{default_user, "guest"},
          {default_vhost, <<"/">>},
          {protocol_strict_mode, false}]},
-  {applications, [kernel, stdlib, rabbit, amqp_client]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, amqp_client]}]}.
similarity index 77%
rename from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/Makefile
rename to deps/rabbitmq_auth_backend_ldap/Makefile
index f11c306a0b448217d3efd0a42b59859f44dd74a0..c33e998c99411f010ac19b4cfaa98f4078600d5d 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbitmq_auth_backend_ldap
 
-DEPS = amqp_client
-TEST_DEPS = rabbit amqp_client ct_helper
+DEPS = rabbit_common rabbit
+TEST_DEPS = ct_helper rabbitmq_ct_helpers amqp_client
 dep_ct_helper = git https://github.com/extend/ct_helper.git master
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
@@ -13,5 +13,4 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
 include erlang.mk
diff --git a/deps/rabbitmq_auth_backend_ldap/erlang.mk b/deps/rabbitmq_auth_backend_ldap/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_auth_backend_ldap/rabbitmq-components.mk b/deps/rabbitmq_auth_backend_ldap/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 91%
rename from rabbitmq-server/deps/rabbitmq_auth_backend_ldap/src/rabbitmq_auth_backend_ldap.app.src
rename to deps/rabbitmq_auth_backend_ldap/src/rabbitmq_auth_backend_ldap.app.src
index b6ac7ced920456b9f9e24f7aac5cebf7e0432385..0277d8440e724330dc003e479427017df38217c7 100644 (file)
@@ -1,7 +1,7 @@
 %% -*- erlang -*-
 {application, rabbitmq_auth_backend_ldap,
  [{description, "RabbitMQ LDAP Authentication Backend"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_auth_backend_ldap_app, []}},
@@ -22,4 +22,4 @@
           {timeout,               infinity},
           {log,                   false},
           {pool_size,             64} ] },
-  {applications, [kernel, stdlib, eldap, rabbit]}]}.
+  {applications, [kernel, stdlib, eldap, rabbit_common, rabbit]}]}.
similarity index 92%
rename from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/Makefile
rename to deps/rabbitmq_auth_mechanism_ssl/Makefile
index b76a9e63cd0fc0a497ca6a8516a2f06c85103255..c10616ca4c8e479e0d7818c289d73af26a2da962 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT = rabbitmq_auth_mechanism_ssl
 
-DEPS = amqp_client
+DEPS = rabbit_common rabbit
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_auth_mechanism_ssl/erlang.mk b/deps/rabbitmq_auth_mechanism_ssl/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_auth_mechanism_ssl/rabbitmq-components.mk b/deps/rabbitmq_auth_mechanism_ssl/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 76%
rename from rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/src/rabbitmq_auth_mechanism_ssl.app.src
rename to deps/rabbitmq_auth_mechanism_ssl/src/rabbitmq_auth_mechanism_ssl.app.src
index 08354b0e5be1d05275dcf18fbe3df454af9f3899..d40920c9789577c8fe33315a3bdabd2fbd230bc1 100644 (file)
@@ -1,9 +1,9 @@
 %% -*- erlang -*-
 {application, rabbitmq_auth_mechanism_ssl,
  [{description, "RabbitMQ SSL authentication (SASL EXTERNAL)"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_auth_mechanism_ssl_app, []}},
   {env, [{name_from, distinguished_name}] },
-  {applications, [kernel, stdlib]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit]}]}.
diff --git a/deps/rabbitmq_consistent_hash_exchange/Makefile b/deps/rabbitmq_consistent_hash_exchange/Makefile
new file mode 100644 (file)
index 0000000..b9c1f08
--- /dev/null
@@ -0,0 +1,15 @@
+PROJECT = rabbitmq_consistent_hash_exchange
+
+DEPS = rabbit_common rabbit
+TEST_DEPS = rabbitmq_ct_helpers amqp_client
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
+
+include rabbitmq-components.mk
+include erlang.mk
diff --git a/deps/rabbitmq_consistent_hash_exchange/erlang.mk b/deps/rabbitmq_consistent_hash_exchange/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_consistent_hash_exchange/rabbitmq-components.mk b/deps/rabbitmq_consistent_hash_exchange/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 65%
rename from rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/src/rabbitmq_consistent_hash_exchange.app.src
rename to deps/rabbitmq_consistent_hash_exchange/src/rabbitmq_consistent_hash_exchange.app.src
index 688a6067e13c687cf8d921f80c0c43c9f1ed6f44..4d9618c3e2bdb393d2cc1b4e212b483cb4e587e4 100644 (file)
@@ -1,7 +1,7 @@
 {application, rabbitmq_consistent_hash_exchange,
  [{description, "Consistent Hash Exchange Type"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {env, []},
-  {applications, [rabbit]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit]}]}.
diff --git a/deps/rabbitmq_event_exchange/Makefile b/deps/rabbitmq_event_exchange/Makefile
new file mode 100644 (file)
index 0000000..ea0157f
--- /dev/null
@@ -0,0 +1,14 @@
+PROJECT = rabbitmq_event_exchange
+
+DEPS = rabbit_common rabbit
+TEST_DEPS = rabbitmq_ct_helpers amqp_client
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
+
+include rabbitmq-components.mk
+include erlang.mk
diff --git a/deps/rabbitmq_event_exchange/erlang.mk b/deps/rabbitmq_event_exchange/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_event_exchange/rabbitmq-components.mk b/deps/rabbitmq_event_exchange/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 62%
rename from rabbitmq-server/deps/rabbitmq_event_exchange/src/rabbitmq_event_exchange.app.src
rename to deps/rabbitmq_event_exchange/src/rabbitmq_event_exchange.app.src
index 971b52da980ef6c504036e199b0b4103c993a229..5fdc6a408c78006a98c69de23cd6188ec645ea5c 100644 (file)
@@ -1,7 +1,7 @@
 {application, rabbitmq_event_exchange,
  [{description, "Event Exchange Type"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {env, []},
-  {applications, [rabbit]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit]}]}.
diff --git a/deps/rabbitmq_federation/Makefile b/deps/rabbitmq_federation/Makefile
new file mode 100644 (file)
index 0000000..0da1e80
--- /dev/null
@@ -0,0 +1,15 @@
+PROJECT = rabbitmq_federation
+
+DEPS = rabbit_common rabbit amqp_client
+TEST_DEPS = rabbitmq_ct_helpers
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
+
+include rabbitmq-components.mk
+include erlang.mk
diff --git a/deps/rabbitmq_federation/erlang.mk b/deps/rabbitmq_federation/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_federation/rabbitmq-components.mk b/deps/rabbitmq_federation/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 98%
rename from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_exchange_link.erl
rename to deps/rabbitmq_federation/src/rabbit_federation_exchange_link.erl
index 88f52b7d18fdda4d69f82f17cdf3b6640e0b7160..14e310f31b7c648b93e598ddab27fcf09a48e143 100644 (file)
@@ -192,16 +192,16 @@ cast(Msg)        -> [gen_server2:cast(Pid, Msg) || Pid <- all()].
 cast(XName, Msg) -> [gen_server2:cast(Pid, Msg) || Pid <- x(XName)].
 
 join(Name) ->
-    pg2_fixed:create(pgname(Name)),
-    ok = pg2_fixed:join(pgname(Name), self()).
+    pg2:create(pgname(Name)),
+    ok = pg2:join(pgname(Name), self()).
 
 all() ->
-    pg2_fixed:create(pgname(rabbit_federation_exchanges)),
-    pg2_fixed:get_members(pgname(rabbit_federation_exchanges)).
+    pg2:create(pgname(rabbit_federation_exchanges)),
+    pg2:get_members(pgname(rabbit_federation_exchanges)).
 
 x(XName) ->
-    pg2_fixed:create(pgname({rabbit_federation_exchange, XName})),
-    pg2_fixed:get_members(pgname({rabbit_federation_exchange, XName})).
+    pg2:create(pgname({rabbit_federation_exchange, XName})),
+    pg2:get_members(pgname({rabbit_federation_exchange, XName})).
 
 %%----------------------------------------------------------------------------
 
similarity index 90%
rename from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_link_util.erl
rename to deps/rabbitmq_federation/src/rabbit_federation_link_util.erl
index 817152c2c775a0d55f770dc56b2fa0375b2ad7cd..91730a084f6e98f7321ffe322be207004f106aaf 100644 (file)
@@ -23,7 +23,7 @@
 -export([start_conn_ch/5, disposable_channel_call/2, disposable_channel_call/3,
          disposable_connection_call/3, ensure_connection_closed/1,
          log_terminate/4, unacked_new/0, ack/3, nack/3, forward/9,
-         handle_down/6]).
+         handle_down/6, get_connection_name/2]).
 
 %% temp
 -export([connection_error/6]).
@@ -36,7 +36,7 @@
 
 start_conn_ch(Fun, Upstream, UParams,
               XorQName = #resource{virtual_host = DownVHost}, State) ->
-    case open_monitor(#amqp_params_direct{virtual_host = DownVHost}) of
+    case open_monitor(#amqp_params_direct{virtual_host = DownVHost}, get_connection_name(Upstream, UParams)) of
         {ok, DConn, DCh} ->
             case Upstream#upstream.ack_mode of
                 'on-confirm' ->
@@ -46,7 +46,7 @@ start_conn_ch(Fun, Upstream, UParams,
                 _ ->
                     ok
             end,
-            case open_monitor(UParams#upstream_params.params) of
+            case open_monitor(UParams#upstream_params.params, get_connection_name(Upstream, UParams)) of
                 {ok, Conn, Ch} ->
                     %% Don't trap exits until we have established
                     %% connections so that if we try to delete
@@ -82,15 +82,36 @@ start_conn_ch(Fun, Upstream, UParams,
                              Upstream, UParams, XorQName, State)
     end.
 
-open_monitor(Params) ->
-    case open(Params) of
+get_connection_name(#upstream{name = UpstreamName},
+    #upstream_params{x_or_q = Resource}) when is_record(Resource, exchange)->
+    Policy = Resource#exchange.policy,
+    PolicyName = proplists:get_value(name, Policy),
+    connection_name(UpstreamName, PolicyName);
+
+get_connection_name(#upstream{name = UpstreamName},
+    #upstream_params{x_or_q = Resource}) when is_record(Resource, amqqueue)->
+    Policy = Resource#amqqueue.policy,
+    PolicyName = proplists:get_value(name, Policy),
+    connection_name(UpstreamName, PolicyName);
+
+get_connection_name(_, _) ->
+    connection_name(undefined, undefined).
+
+connection_name(Upstream, Policy) when is_binary(Upstream), is_binary(Policy) ->
+    <<<<"Federation link (upstream: ">>/binary, Upstream/binary, <<", policy: ">>/binary, Policy/binary, <<")">>/binary>>;
+
+connection_name(_, _) ->
+    <<"Federation link">>.
+
+open_monitor(Params, Name) ->
+    case open(Params, Name) of
         {ok, Conn, Ch} -> erlang:monitor(process, Ch),
                           {ok, Conn, Ch};
         E              -> E
     end.
 
-open(Params) ->
-    case amqp_connection:start(Params) of
+open(Params, Name) ->
+    case amqp_connection:start(Params, Name) of
         {ok, Conn} -> case amqp_connection:open_channel(Conn) of
                           {ok, Ch} -> {ok, Conn, Ch};
                           E        -> catch amqp_connection:close(Conn),
@@ -273,7 +294,7 @@ disposable_channel_call(Conn, Method, ErrFun) ->
     end.
 
 disposable_connection_call(Params, Method, ErrFun) ->
-    case open(Params) of
+    case open(Params, undefined) of
         {ok, Conn, Ch} ->
             try
                 amqp_channel:call(Ch, Method)
similarity index 97%
rename from rabbitmq-server/deps/rabbitmq_federation/src/rabbit_federation_queue_link.erl
rename to deps/rabbitmq_federation/src/rabbit_federation_queue_link.erl
index e6d8019831b9a7e32da9e66f22816b93d93422fe..80785ee0d26845695ebaeb12fd8eac86ae435866 100644 (file)
@@ -46,16 +46,16 @@ cast(Msg)        -> [gen_server2:cast(Pid, Msg) || Pid <- all()].
 cast(QName, Msg) -> [gen_server2:cast(Pid, Msg) || Pid <- q(QName)].
 
 join(Name) ->
-    pg2_fixed:create(pgname(Name)),
-    ok = pg2_fixed:join(pgname(Name), self()).
+    pg2:create(pgname(Name)),
+    ok = pg2:join(pgname(Name), self()).
 
 all() ->
-    pg2_fixed:create(pgname(rabbit_federation_queues)),
-    pg2_fixed:get_members(pgname(rabbit_federation_queues)).
+    pg2:create(pgname(rabbit_federation_queues)),
+    pg2:get_members(pgname(rabbit_federation_queues)).
 
 q(QName) ->
-    pg2_fixed:create(pgname({rabbit_federation_queue, QName})),
-    pg2_fixed:get_members(pgname({rabbit_federation_queue, QName})).
+    pg2:create(pgname({rabbit_federation_queue, QName})),
+    pg2:get_members(pgname({rabbit_federation_queue, QName})).
 
 federation_up() ->
     proplists:is_defined(rabbitmq_federation,
similarity index 67%
rename from rabbitmq-server/deps/rabbitmq_federation/src/rabbitmq_federation.app.src
rename to deps/rabbitmq_federation/src/rabbitmq_federation.app.src
index 75d409ad86c19ef415b570da4e156f031b42c28b..6f8c2e8c504bb3f5e3e426bfb2e25ca44f93e979 100644 (file)
@@ -1,8 +1,8 @@
 {application, rabbitmq_federation,
  [{description, "RabbitMQ Federation"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_federation_app, []}},
   {env, [{pgroup_name_cluster_id, false}]},
-  {applications, [kernel, stdlib, rabbit, amqp_client]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, amqp_client]}]}.
similarity index 82%
rename from rabbitmq-server/deps/rabbitmq_federation_management/LICENSE
rename to deps/rabbitmq_federation_management/LICENSE
index b945a8ef8d119320e54095871ee74aecdd870418..66bf00f2db87da3336dd28f3e9a76f4487a3d658 100644 (file)
@@ -6,8 +6,7 @@ This package makes use of the following third party libraries:
 jQuery     - http://jquery.com/                       - MIT license, see LICENSE-MIT-jQuery164
 EJS        - http://embeddedjs.com/                   - MIT license, see LICENSE-MIT-EJS10
 Sammy      - http://code.quirkey.com/sammy/           - MIT license, see LICENSE-MIT-Sammy060
-webmachine - http://webmachine.basho.com/             - Apache license, 2.0
-mochiweb   - http://github.com/mochi/mochiweb/        - MIT license
+cowboy     - http://github.com/ninenines/cowboy       - ISC license
 base64.js  - http://code.google.com/p/stringencoders/ - BSD license, see LICENSE-BSD-base64js
 
 If you have any questions regarding licensing, please contact us at
similarity index 84%
rename from rabbitmq-server/deps/rabbitmq_federation_management/Makefile
rename to deps/rabbitmq_federation_management/Makefile
index 2a9fcedb20b64463561446a6e950065ab0107ac1..7a9e150cad958e4a1e9dabef94a70bce7551f217 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT = rabbitmq_federation_management
 
-DEPS = rabbitmq_management webmachine
+DEPS = rabbit_common rabbit rabbitmq_management webmachine
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_federation_management/erlang.mk b/deps/rabbitmq_federation_management/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_federation_management/rabbitmq-components.mk b/deps/rabbitmq_federation_management/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 61%
rename from rabbitmq-server/deps/rabbitmq_federation_management/src/rabbitmq_federation_management.app.src
rename to deps/rabbitmq_federation_management/src/rabbitmq_federation_management.app.src
index f10200452a721b5357a5ba50404592104fccc258..5a6605457a5a701525db5fa742a3fd5688be8a71 100644 (file)
@@ -1,8 +1,8 @@
 {application, rabbitmq_federation_management,
  [{description, "RabbitMQ Federation Management"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {env, []},
-  {applications, [kernel, stdlib, rabbitmq_management]}
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_management]}
  ]}.
similarity index 82%
rename from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/Makefile
rename to deps/rabbitmq_jms_topic_exchange/Makefile
index 8c8adfb8cd7f984a0c565d3a4359ddd59d58758a..d25aaf36735ca6e6d32b4ceed24ca3dceabf4ab9 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbitmq_jms_topic_exchange
 
-DEPS = amqp_client
-TEST_DEPS += rabbit
+DEPS = rabbit_common rabbit
+TEST_DEPS = rabbitmq_ct_helpers amqp_client
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_jms_topic_exchange/erlang.mk b/deps/rabbitmq_jms_topic_exchange/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
similarity index 56%
rename from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/include/rabbit_jms_topic_exchange.hrl
rename to deps/rabbitmq_jms_topic_exchange/include/rabbit_jms_topic_exchange.hrl
index 265bce937749aede4dcb7e9f0f225937679ea39a..61c5dddd360aaa6315631e79fab6326af301fd37 100644 (file)
 %%      not used, retained for backwards compatibility of db records.
 %% -----------------------------------------------------------------------------
 
-%% -----------------------------------------------------------------------------
-%% Name of arg on exchange creation and bindings. Used to supply client version
-%% for plugin check.
-%%      private static final String RJMS_VERSION_ARG = "rjms_version";
-%% in JMS Client.
-%% If absent, client version assumed to be < 1.2.0.
--define(RJMS_VERSION_ARG, <<"rjms_version">>).
 %% -----------------------------------------------------------------------------
 
 %% -----------------------------------------------------------------------------
 %% in JMS Client.
 -define(RJMS_COMPILED_SELECTOR_ARG, <<"rjms_erlang_selector">>).
 %% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% List of versions compatible with this level of topic exchange.
--define(RJMS_COMPATIBLE_VERSIONS, [ "1.4.7"             % current build release
-                                 %, "1.4.5"             % release omitted
-                                  , "1.4.4"
-                                 %, "1.4.3"             % release omitted
-                                 %, "1.4.2"             % release omitted
-                                  , "1.4.1"
-                                  , "1.3.4"
-                                  , "1.3.3"
-                                  , "1.3.2"
-                                  , "1.3.1"
-                                 %, "1.3.0"             % release aborted
-                                  , "1.2.5"
-                                  , "1.2.4"
-                                  , "1.2.3"
-                                 %, "1.2.2"             % release omitted
-                                  , "1.2.1"
-                                  , "1.2.0"
-                                  , ""                  % development use only
-                                  , "0.0.0"             % development use only
-                                  ]).
-%% -----------------------------------------------------------------------------
diff --git a/deps/rabbitmq_jms_topic_exchange/rabbitmq-components.mk b/deps/rabbitmq_jms_topic_exchange/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 93%
rename from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/src/rabbit_jms_topic_exchange.erl
rename to deps/rabbitmq_jms_topic_exchange/src/rabbit_jms_topic_exchange.erl
index 4bf639e23e75414e1be6081eaa0130a786b5417e..73a7992ba3bda8fbb1d6ff4a7313c04d103eb8cd 100644 (file)
@@ -21,8 +21,9 @@
 
 -behaviour(rabbit_exchange_type).
 
+-include_lib("rabbit_common/include/rabbit.hrl").
+-include_lib("rabbit_common/include/rabbit_framing.hrl").
 -include("rabbit_jms_topic_exchange.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
 
 %% Rabbit exchange type functions:
 -export([ description/0
@@ -113,8 +114,7 @@ route( #exchange{name = XName}
 validate(_X) -> ok.
 
 % After exchange declaration and recovery
-create(transaction, #exchange{name = XName, arguments = XArgs}) ->
-  check_version_arg(XName, XArgs),
+create(transaction, #exchange{name = XName}) ->
   add_initial_record(XName);
 create(_Tx, _X) ->
   ok.
@@ -134,7 +134,6 @@ add_binding( Tx
            , #exchange{name = XName}
            , #binding{key = BindingKey, destination = Dest, args = Args}
            ) ->
-  check_version_arg(XName, Args),
   Selector = get_string_arg(Args, ?RJMS_COMPILED_SELECTOR_ARG),
   BindGen = generate_binding_fun(Selector),
   case {Tx, BindGen} of
@@ -167,14 +166,6 @@ policy_changed(_X1, _X2) -> ok.
 %%----------------------------------------------------------------------------
 %% P R I V A T E   F U N C T I O N S
 
-% Check version argument, if supplied
-check_version_arg(XName, Args) ->
-  Version = get_string_arg(Args, ?RJMS_VERSION_ARG, "pre-1.2.0"),
-  case lists:member(Version, ?RJMS_COMPATIBLE_VERSIONS) of
-    true  -> ok;
-    false -> client_version_error(XName, Version)
-  end.
-
 % Get a string argument from the args or arguments parameters
 get_string_arg(Args, ArgName) -> get_string_arg(Args, ArgName, error).
 
@@ -302,12 +293,6 @@ exchange_state_corrupt_error(#resource{name = XName}) ->
                             , "exchange named '~s' has no saved state or incorrect saved state"
                             , [XName] ).
 
-% version error
-client_version_error(#resource{name = XName}, Version) ->
-  rabbit_misc:protocol_error( internal_error
-                            , "client version '~s' incompatible with plugin for operation on exchange named '~s'"
-                            , [Version, XName] ).
-
 % parsing error
 parsing_error(#resource{name = XName}, S, #resource{name = DestName}) ->
   rabbit_misc:protocol_error( precondition_failed
similarity index 63%
rename from rabbitmq-server/deps/rabbitmq_jms_topic_exchange/src/rabbitmq_jms_topic_exchange.app.src
rename to deps/rabbitmq_jms_topic_exchange/src/rabbitmq_jms_topic_exchange.app.src
index dc99ab39e96619d0e02bf1251e763d449c1d435e..8c3e1518d33082d5a4b37227754488eca884bb13 100644 (file)
@@ -1,8 +1,8 @@
 { application, rabbitmq_jms_topic_exchange
 , [ {description, "RabbitMQ JMS topic selector exchange plugin"}
-  , {vsn, "3.6.5"}
+  , {vsn, "3.6.6"}
   , {modules, []}
   , {registered, []}
-  , {applications, [kernel, stdlib, rabbit, mnesia]}
+  , {applications, [kernel, stdlib, rabbit_common, rabbit, mnesia]}
   ]
 }.
similarity index 85%
rename from rabbitmq-server/deps/rabbitmq_management/Makefile
rename to deps/rabbitmq_management/Makefile
index 08787f5243b37f6b237da827b99cc5908fcd6bc4..cc12c49bb8e3a6d5fe052860ad1777e004ecda29 100644 (file)
@@ -1,8 +1,8 @@
 PROJECT = rabbitmq_management
 
-TEST_DEPS += rabbit
+DEPS = rabbit_common rabbit amqp_client webmachine rabbitmq_web_dispatch rabbitmq_management_agent
+TEST_DEPS = rabbitmq_ct_helpers
 
-DEPS = amqp_client webmachine rabbitmq_web_dispatch rabbitmq_management_agent
 dep_webmachine = git https://github.com/rabbitmq/webmachine.git 6b5210c0ed07159f43222255e05a90bbef6c8cbe
 dep_rabbitmq_web_dispatch = git https://github.com/rabbitmq/rabbitmq-web-dispatch.git stable
 
@@ -17,7 +17,6 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
 include erlang.mk
 
 # --------------------------------------------------------------------
diff --git a/deps/rabbitmq_management/erlang.mk b/deps/rabbitmq_management/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
similarity index 98%
rename from rabbitmq-server/deps/rabbitmq_management/priv/www/js/main.js
rename to deps/rabbitmq_management/priv/www/js/main.js
index 2d4c13dfe68619fe4630af7306dca7c4df6366e9..03a32740c2391cdfdf5f40122f469de19983d826 100644 (file)
@@ -33,6 +33,19 @@ function login_route () {
     // we've changed url.
 }
 
+function login_route_with_path() {
+  var params = ('' + this.params['splat']).split('/');
+  var user = params.shift();
+  var pass = params.shift();
+  var userpass = '' + user + ':' + pass,
+        location = window.location.href,
+        hash = window.location.hash;
+    set_auth_pref(decodeURIComponent(userpass));
+    location = location.substr(0, location.length - hash.length) + '#/' + params.join('/');
+    check_login();
+    window.location.replace(location);
+}
+
 function start_app_login() {
     app = new Sammy.Application(function () {
         this.put('#/login', function() {
@@ -42,6 +55,7 @@ function start_app_login() {
             check_login();
         });
         this.get('#/login/:username/:password', login_route);
+        this.get(/\#\/login\/(.*)/, login_route_with_path);
     });
     app.run();
     if (get_pref('auth') != null) {
diff --git a/deps/rabbitmq_management/rabbitmq-components.mk b/deps/rabbitmq_management/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 99%
rename from rabbitmq-server/deps/rabbitmq_management/src/rabbit_mgmt_format.erl
rename to deps/rabbitmq_management/src/rabbit_mgmt_format.erl
index d734637785eb55feed99ec4e955c8381a8a532db..6323738befb41173d347ff706292e7a25fbb74e9 100644 (file)
@@ -48,6 +48,8 @@ format(Stats, {Fs, false}) ->
     lists:concat([Fs(Stat) || {_Name, Value} = Stat <- Stats,
                               Value =/= unknown]).
 
+format_queue_stats({reductions, _}) ->
+    [];
 format_queue_stats({exclusive_consumer_pid, _}) ->
     [];
 format_queue_stats({slave_pids, ''}) ->
similarity index 88%
rename from rabbitmq-server/deps/rabbitmq_management/src/rabbitmq_management.app.src
rename to deps/rabbitmq_management/src/rabbitmq_management.app.src
index bfa1ffc6553010421232c9ef2b582bf81f5d7954..6319f0fe1663e9793f7972b0952a72cea97a3e22 100644 (file)
@@ -1,6 +1,6 @@
 {application, rabbitmq_management,
  [{description, "RabbitMQ Management Console"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_mgmt_app, []}},
@@ -18,5 +18,5 @@
          {cors_allow_origins, []},
          {cors_max_age, 1800}
         ]},
-  {applications, [kernel, stdlib, rabbit, xmerl, rabbitmq_web_dispatch,
+  {applications, [kernel, stdlib, rabbit_common, rabbit, xmerl, rabbitmq_web_dispatch,
                   amqp_client, rabbitmq_management_agent]}]}.
similarity index 92%
rename from rabbitmq-server/deps/rabbitmq_management_agent/Makefile
rename to deps/rabbitmq_management_agent/Makefile
index 921b4ea6df186c781a3eb7225937e85ebfc74aeb..79f4f1c28f92922c87f9807c06269801c73ff422 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT = rabbitmq_management_agent
 
-DEPS = amqp_client
+DEPS = rabbit_common rabbit
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_management_agent/erlang.mk b/deps/rabbitmq_management_agent/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_management_agent/rabbitmq-components.mk b/deps/rabbitmq_management_agent/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 68%
rename from rabbitmq-server/deps/rabbitmq_management_agent/src/rabbitmq_management_agent.app.src
rename to deps/rabbitmq_management_agent/src/rabbitmq_management_agent.app.src
index 661f66e6d0ba38a436c14050557560504a8ec904..79901577943861f54a2e6cee7dd4870b6ce40c4a 100644 (file)
@@ -1,8 +1,8 @@
 {application, rabbitmq_management_agent,
  [{description, "RabbitMQ Management Agent"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_mgmt_agent_app, []}},
   {env, []},
-  {applications, [kernel, stdlib, rabbit]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit]}]}.
similarity index 84%
rename from rabbitmq-server/deps/rabbitmq_management_visualiser/Makefile
rename to deps/rabbitmq_management_visualiser/Makefile
index b905f909b6b5c61d27226a57f5cbf169030d8819..600e84632bd640bf9328d2b5605583dd303f0217 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT = rabbitmq_management_visualiser
 
-DEPS = rabbitmq_management webmachine
+DEPS = rabbit_common rabbit rabbitmq_management webmachine
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_management_visualiser/erlang.mk b/deps/rabbitmq_management_visualiser/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_management_visualiser/rabbitmq-components.mk b/deps/rabbitmq_management_visualiser/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 55%
rename from rabbitmq-server/deps/rabbitmq_management_visualiser/src/rabbitmq_management_visualiser.app.src
rename to deps/rabbitmq_management_visualiser/src/rabbitmq_management_visualiser.app.src
index d2df983ddfa2a1508ba9f7ade10a4d7c23f24cdc..28f70fec06154ab71f186148992dc67d32d51610 100644 (file)
@@ -1,6 +1,6 @@
 {application, rabbitmq_management_visualiser,
  [{description, "RabbitMQ Visualiser"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
-  {applications, [kernel, stdlib, rabbit, rabbitmq_management]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_management]}]}.
similarity index 70%
rename from rabbitmq-server/deps/rabbitmq_mqtt/Makefile
rename to deps/rabbitmq_mqtt/Makefile
index 7879f653ea9ca7ad6a9d687f2717f9157eee5e71..218bd3437b7a2f5e7f13608f3cd58270890affbd 100644 (file)
@@ -1,10 +1,9 @@
 PROJECT = rabbitmq_mqtt
 
-DEPS = amqp_client
+DEPS = ranch rabbit_common rabbit amqp_client
+TEST_DEPS = emqttc ct_helper rabbitmq_ct_helpers
 
-TEST_DEPS = rabbit rabbitmq_java_client emqttc ct_helper
 dep_ct_helper = git https://github.com/extend/ct_helper.git master
-
 dep_emqttc = git https://github.com/emqtt/emqttc.git master
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
@@ -16,6 +15,8 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
 include erlang.mk
+
+
+clean::
+       if test -d test/java_SUITE_data; then cd test/java_SUITE_data && make clean; fi
similarity index 94%
rename from rabbitmq-server/deps/rabbitmq_mqtt/README.md
rename to deps/rabbitmq_mqtt/README.md
index 66911989e8d4d54f1add100d65ff467b6539ccef..bc119ffd0615de766caecb5cd374f1e16aa93d17 100644 (file)
@@ -25,14 +25,14 @@ See [CONTRIBUTING.md](https://github.com/rabbitmq/rabbitmq-mqtt/blob/master/CONT
 After cloning RabbitMQ umbrella repository, change into the `rabbitmq-mqtt` directory
 and run
 
-    make test
+    make tests
 
 This will bring up a RabbitMQ node with the plugin enabled and run integration tests
 against it. Note that there must be no other MQTT server running on ports `1883` and `8883`.
 
 ## Copyright and License
 
-(c) 2007 â€” 2015 Pivotal Software, Inc.
+(c) 2007 â€” 2016 Pivotal Software, Inc.
 
 Released under the [Mozilla Public License](http://www.rabbitmq.com/mpl.html),
 the same as RabbitMQ.
diff --git a/deps/rabbitmq_mqtt/erlang.mk b/deps/rabbitmq_mqtt/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_mqtt/rabbitmq-components.mk b/deps/rabbitmq_mqtt/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 94%
rename from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbit_mqtt_processor.erl
rename to deps/rabbitmq_mqtt/src/rabbit_mqtt_processor.erl
index 2bb2b8ecfaecd3b80743920276294d9b6e9febbb..f2047942d260b358bc3c214a1c370930d2ca648b 100644 (file)
@@ -96,7 +96,13 @@ process_request(?CONNECT,
             _ ->
                 case creds(Username, Password, SSLLoginName) of
                     nocreds ->
-                        rabbit_log:error("MQTT login failed - no credentials~n"),
+                        rabbit_log:error("MQTT login failed: no credentials provided~n"),
+                        {?CONNACK_CREDENTIALS, PState};
+                    {invalid_creds, {undefined, Pass}} when is_list(Pass) ->
+                        rabbit_log:error("MQTT login failed: no user username is provided"),
+                        {?CONNACK_CREDENTIALS, PState};
+                    {invalid_creds, {User, undefined}} when is_list(User) ->
+                        rabbit_log:error("MQTT login failed for ~p: no password provided", [User]),
                         {?CONNACK_CREDENTIALS, PState};
                     {UserBin, PassBin} ->
                         case process_login(UserBin, PassBin, ProtoVersion, PState) of
@@ -501,36 +507,31 @@ creds(User, Pass, SSLLoginName) ->
     DefaultPass   = rabbit_mqtt_util:env(default_pass),
     {ok, Anon}    = application:get_env(?APP, allow_anonymous),
     {ok, TLSAuth} = application:get_env(?APP, ssl_cert_login),
-    U = case {User =/= undefined,
-              is_binary(DefaultUser),
-              Anon =:= true,
-              (TLSAuth andalso SSLLoginName =/= none)} of
-             %% username provided
-             {true,  _,    _,    _}     -> list_to_binary(User);
-             %% anonymous, default user is configured, no TLS
-             {false, true, true, false} -> DefaultUser;
-             %% no username provided, TLS certificate is present,
-             %% rabbitmq_mqtt.ssl_cert_login is true
-             {false, _,    _,    true}  -> SSLLoginName;
-             _                          -> nocreds
-        end,
-    case U of
-        nocreds ->
-            nocreds;
-        _ ->
-            case {Pass =/= undefined,
-                  is_binary(DefaultPass),
-                  Anon =:= true,
-                  TLSAuth} of
-                 %% password provided
-                 {true,  _,    _,    _} -> {U, list_to_binary(Pass)};
-                 %% password not provided, TLS certificate is present,
-                 %% rabbitmq_mqtt.ssl_cert_login is true
-                 {false, _, _, true}    -> {U, none};
-                 %% anonymous, default password is configured
-                 {false, true, true, _} -> {U, DefaultPass};
-                 _                      -> {U, none}
-            end
+    HaveDefaultCreds = Anon =:= true andalso
+                       is_binary(DefaultUser) andalso
+                       is_binary(DefaultPass),
+
+    CredentialsProvided = User =/= undefined orelse
+                          Pass =/= undefined,
+
+    CorrectCredentials = is_list(User) andalso
+                         is_list(Pass),
+
+    SSLLoginProvided = TLSAuth =:= true andalso
+                       SSLLoginName =/= none,
+
+    case {CredentialsProvided, CorrectCredentials, SSLLoginProvided, HaveDefaultCreds} of
+        %% Username and password take priority
+        {true, true, _, _}          -> {list_to_binary(User),
+                                        list_to_binary(Pass)};
+        %% Either username or password is provided
+        {true, false, _, _}         -> {invalid_creds, {User, Pass}};
+        %% rabbitmq_mqtt.ssl_cert_login is true. SSL user name provided.
+        %% Authenticating using username only.
+        {false, false, true, _}     -> {SSLLoginName, none};
+        %% Anonymous connection uses default credentials
+        {false, false, false, true} -> {DefaultUser, DefaultPass};
+        _                           -> nocreds
     end.
 
 supported_subs_qos(?QOS_0) -> ?QOS_0;
similarity index 90%
rename from rabbitmq-server/deps/rabbitmq_mqtt/src/rabbitmq_mqtt.app.src
rename to deps/rabbitmq_mqtt/src/rabbitmq_mqtt.app.src
index 560a533acad38f4a6438e4858889d0eba2196057..a579999bb052244cc6d170de78d0e62176f58cf0 100644 (file)
@@ -1,6 +1,6 @@
 {application, rabbitmq_mqtt,
  [{description, "RabbitMQ MQTT Adapter"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_mqtt, []}},
@@ -22,4 +22,4 @@
          {num_tcp_acceptors, 10},
          {tcp_listen_options, [{backlog,   128},
                                {nodelay,   true}]}]},
-  {applications, [kernel, stdlib, rabbit, amqp_client]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, ranch, amqp_client]}]}.
similarity index 82%
rename from rabbitmq-server/deps/rabbitmq_recent_history_exchange/Makefile
rename to deps/rabbitmq_recent_history_exchange/Makefile
index 81e8867a819811b56bb3cff419133fb02697cfd3..ac7f04f35430def27ff490b218c4b008b44d1e69 100644 (file)
@@ -1,6 +1,7 @@
 PROJECT = rabbitmq_recent_history_exchange
 
-TEST_DEPS = amqp_client rabbit
+DEPS = rabbit_common rabbit
+TEST_DEPS = rabbitmq_ct_helpers amqp_client
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_recent_history_exchange/erlang.mk b/deps/rabbitmq_recent_history_exchange/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_recent_history_exchange/rabbitmq-components.mk b/deps/rabbitmq_recent_history_exchange/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 69%
rename from rabbitmq-server/deps/rabbitmq_recent_history_exchange/src/rabbitmq_recent_history_exchange.app.src
rename to deps/rabbitmq_recent_history_exchange/src/rabbitmq_recent_history_exchange.app.src
index 12c8acda49e07f7ffbeb1d770512c0a7e457d14b..658a6a2467640d057880db7782881cff3b005a3e 100644 (file)
@@ -3,4 +3,4 @@
   {vsn, "1.2.1"},
   {modules, []},
   {registered, []},
-  {applications, [kernel, stdlib, rabbit, mnesia]}]}.
\ No newline at end of file
+  {applications, [kernel, stdlib, rabbit_common, rabbit, mnesia]}]}.
similarity index 81%
rename from rabbitmq-server/deps/rabbitmq_sharding/Makefile
rename to deps/rabbitmq_sharding/Makefile
index d833469013f48a56f1fdab3447db71a629540d37..34a928f9136a2fec4781f8b59c677d146dac6f13 100644 (file)
@@ -1,6 +1,7 @@
 PROJECT = rabbitmq_sharding
 
-TEST_DEPS = rabbit amqp_client rabbitmq_consistent_hash_exchange
+DEPS = rabbit_common rabbit
+TEST_DEPS = rabbitmq_ct_helpers amqp_client
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_sharding/erlang.mk b/deps/rabbitmq_sharding/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_sharding/rabbitmq-components.mk b/deps/rabbitmq_sharding/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 68%
rename from rabbitmq-server/deps/rabbitmq_sharding/src/rabbitmq_sharding.app.src
rename to deps/rabbitmq_sharding/src/rabbitmq_sharding.app.src
index ca6f65ee53e508fb4e17ef9ea1635d743109f796..8fb742ac670d696bbbb1a5e759af3db2f5dc4b5f 100644 (file)
@@ -3,4 +3,4 @@
   {vsn, "0.1.0"},
   {modules, []},
   {registered, []},
-  {applications, [kernel, stdlib, rabbit]}]}.
\ No newline at end of file
+  {applications, [kernel, stdlib, rabbit_common, rabbit]}]}.
diff --git a/deps/rabbitmq_shovel/Makefile b/deps/rabbitmq_shovel/Makefile
new file mode 100644 (file)
index 0000000..1922956
--- /dev/null
@@ -0,0 +1,15 @@
+PROJECT = rabbitmq_shovel
+
+DEPS = rabbit_common rabbit amqp_client
+TEST_DEPS = rabbitmq_ct_helpers
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
+
+include rabbitmq-components.mk
+include erlang.mk
diff --git a/deps/rabbitmq_shovel/erlang.mk b/deps/rabbitmq_shovel/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_shovel/rabbitmq-components.mk b/deps/rabbitmq_shovel/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 92%
rename from rabbitmq-server/deps/rabbitmq_shovel/src/rabbit_shovel_worker.erl
rename to deps/rabbitmq_shovel/src/rabbit_shovel_worker.erl
index d41c84366fb7f28c964eeebfd24f0c8af93cd21a..f2660fc57f7b9834c282e630aa0734bad833c88c 100644 (file)
@@ -21,6 +21,9 @@
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
          code_change/3]).
 
+%% for testing purposes
+-export([get_connection_name/1]).
+
 -include_lib("amqp_client/include/amqp_client.hrl").
 -include("rabbit_shovel.hrl").
 
@@ -55,10 +58,11 @@ handle_call(_Msg, _From, State) ->
 
 handle_cast(init, State = #state{config = Config}) ->
     #shovel{sources = Sources, destinations = Destinations} = Config,
+    #state{name = Name} = State,
     {InboundConn, InboundChan, InboundURI} =
-        make_conn_and_chan(Sources#endpoint.uris),
+        make_conn_and_chan(Sources#endpoint.uris, Name),
     {OutboundConn, OutboundChan, OutboundURI} =
-        make_conn_and_chan(Destinations#endpoint.uris),
+        make_conn_and_chan(Destinations#endpoint.uris, Name),
 
     %% Don't trap exits until we have established connections so that
     %% if we try to shut down while waiting for a connection to be
@@ -227,14 +231,30 @@ publish(Tag, Method, Msg,
                         decr_remaining(1, State)
       end).
 
-make_conn_and_chan(URIs) ->
+make_conn_and_chan(URIs, ShovelName) ->
     URI = lists:nth(rand_compat:uniform(length(URIs)), URIs),
     {ok, AmqpParam} = amqp_uri:parse(URI),
-    {ok, Conn} = amqp_connection:start(AmqpParam),
+    ConnName = get_connection_name(ShovelName),
+    {ok, Conn} = amqp_connection:start(AmqpParam, ConnName),
     link(Conn),
     {ok, Chan} = amqp_connection:open_channel(Conn),
     {Conn, Chan, list_to_binary(amqp_uri:remove_credentials(URI))}.
 
+%% for static shovels, name is an atom from the configuration file
+get_connection_name(ShovelName) when is_atom(ShovelName) ->
+    Prefix = <<"Shovel ">>,
+    ShovelNameAsBinary = atom_to_binary(ShovelName, utf8),
+    <<Prefix/binary, ShovelNameAsBinary/binary>>;
+
+%% for dynamic shovels, name is a tuple with a binary
+get_connection_name({_, Name}) when is_binary(Name) ->
+    Prefix = <<"Shovel ">>,
+    <<Prefix/binary, Name/binary>>;
+
+%% fallback
+get_connection_name(_) ->
+    <<"Shovel">>.
+
 remaining(_Ch, #shovel{delete_after = never}) ->
     unlimited;
 remaining(Ch, #shovel{delete_after = 'queue-length', queue = Queue}) ->
similarity index 81%
rename from rabbitmq-server/deps/rabbitmq_shovel/src/rabbitmq_shovel.app.src
rename to deps/rabbitmq_shovel/src/rabbitmq_shovel.app.src
index 00975f3c97b7d65380b2b1903af5eeda63c77e6c..40c538d7730b960b54ba5cbd8e0b03ca20271a09 100644 (file)
@@ -1,6 +1,6 @@
 {application, rabbitmq_shovel,
  [{description, "Data Shovel for RabbitMQ"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {env, [{defaults, [{prefetch_count,     1000},
@@ -10,4 +10,4 @@
                      {reconnect_delay,    5}]
          }]},
   {mod, {rabbit_shovel, []}},
-  {applications, [kernel, stdlib, rabbit, amqp_client]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, amqp_client]}]}.
diff --git a/deps/rabbitmq_shovel_management/Makefile b/deps/rabbitmq_shovel_management/Makefile
new file mode 100644 (file)
index 0000000..3c0aef0
--- /dev/null
@@ -0,0 +1,15 @@
+PROJECT = rabbitmq_shovel_management
+
+DEPS = rabbit_common rabbit rabbitmq_management rabbitmq_shovel webmachine
+TEST_DEPS = rabbitmq_ct_helpers
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
+
+include rabbitmq-components.mk
+include erlang.mk
diff --git a/deps/rabbitmq_shovel_management/erlang.mk b/deps/rabbitmq_shovel_management/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_shovel_management/rabbitmq-components.mk b/deps/rabbitmq_shovel_management/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 53%
rename from rabbitmq-server/deps/rabbitmq_shovel_management/src/rabbitmq_shovel_management.app.src
rename to deps/rabbitmq_shovel_management/src/rabbitmq_shovel_management.app.src
index 7c563155a917cbdd70b4d5008bf5b5634ea7a4cc..fc6891132ba8471e00eeff4cb14ca90ad8264112 100644 (file)
@@ -1,6 +1,6 @@
 {application, rabbitmq_shovel_management,
  [{description, "Shovel Status"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
-  {applications, [kernel, stdlib, rabbit, rabbitmq_management]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_management]}]}.
similarity index 74%
rename from rabbitmq-server/deps/rabbitmq_stomp/Makefile
rename to deps/rabbitmq_stomp/Makefile
index 6ae483e8427474b5e4a451e05dc64774383f78e8..4d421e86b01067b5b65b3e97ee11e86bee03a367 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbitmq_stomp
 
-DEPS = amqp_client
-TEST_DEPS = rabbit rabbitmq_test
+DEPS = ranch rabbit_common rabbit amqp_client
+TEST_DEPS = rabbitmq_ct_helpers
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
@@ -12,9 +12,4 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
 include erlang.mk
-
-
diff --git a/deps/rabbitmq_stomp/erlang.mk b/deps/rabbitmq_stomp/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_stomp/rabbitmq-components.mk b/deps/rabbitmq_stomp/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 79%
rename from rabbitmq-server/deps/rabbitmq_stomp/src/rabbitmq_stomp.app.src
rename to deps/rabbitmq_stomp/src/rabbitmq_stomp.app.src
index 122b36a6f0fec664c0f07fa57fb0ba0c234f53cd..444cec06e3a54af985c6b3390f069a31129168a7 100644 (file)
@@ -1,12 +1,12 @@
 {application, rabbitmq_stomp,
  [{description, "RabbitMQ STOMP plugin"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_stomp, []}},
   {env, [{default_user,
-          [{login, "guest"},
-           {passcode, "guest"}]},
+          [{login, <<"guest">>},
+           {passcode, <<"guest">>}]},
          {default_vhost, <<"/">>},
          {ssl_cert_login, false},
          {implicit_connect, false},
@@ -20,4 +20,4 @@
         {trailing_lf, true},
         %% see rabbitmq/rabbitmq-stomp#57
         {hide_server_info, false}]},
-  {applications, [kernel, stdlib, rabbit, amqp_client]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, amqp_client]}]}.
similarity index 83%
rename from rabbitmq-server/deps/rabbitmq_top/Makefile
rename to deps/rabbitmq_top/Makefile
index 36904cddf231f6f562908912b55bd2ec4471ad68..c15576ed754dc1cd0709bb89434ea6f35a1c4bf6 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT = rabbitmq_top
 
-DEPS = amqp_client rabbitmq_management webmachine
+DEPS = rabbit_common rabbit amqp_client rabbitmq_management
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_top/erlang.mk b/deps/rabbitmq_top/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_top/rabbitmq-components.mk b/deps/rabbitmq_top/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 56%
rename from rabbitmq-server/deps/rabbitmq_top/src/rabbitmq_top.app.src
rename to deps/rabbitmq_top/src/rabbitmq_top.app.src
index 38c7c3c280cb96358a593baedd047a3040fbfbe1..03a84e255c4dccc5dcbd5edcf3b51ff34a482d0b 100644 (file)
@@ -1,7 +1,7 @@
 {application, rabbitmq_top,
  [{description, "RabbitMQ Top"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_top_app, []}},
-  {applications, [kernel, stdlib, rabbit, rabbitmq_management]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_management]}]}.
similarity index 77%
rename from rabbitmq-server/deps/rabbitmq_tracing/Makefile
rename to deps/rabbitmq_tracing/Makefile
index d0ec067b58b92ac26ee7902c5310c0d89da68beb..63b1c991f13db1208607d416ca4ba4c722cb877c 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbitmq_tracing
 
-DEPS = rabbitmq_management webmachine
-TEST_DEPS += rabbit
+DEPS = rabbit_common rabbit rabbitmq_management webmachine
+TEST_DEPS = rabbitmq_ct_helpers
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_tracing/erlang.mk b/deps/rabbitmq_tracing/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_tracing/rabbitmq-components.mk b/deps/rabbitmq_tracing/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 73%
rename from rabbitmq-server/deps/rabbitmq_tracing/src/rabbitmq_tracing.app.src
rename to deps/rabbitmq_tracing/src/rabbitmq_tracing.app.src
index 46da6be0301b1db78349017ca861b3523db32c97..418239eae0ee066469a4ee9f7422cfa8b5d8c545 100644 (file)
@@ -1,10 +1,10 @@
 {application, rabbitmq_tracing,
  [{description, "RabbitMQ message logging / tracing"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_tracing_app, []}},
   {env, [{directory, "/var/tmp/rabbitmq-tracing"},
          {username, <<"guest">>},
          {password, <<"guest">>}]},
-  {applications, [kernel, stdlib, rabbit, rabbitmq_management]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_management]}]}.
similarity index 62%
rename from rabbitmq-server/deps/rabbitmq_trust_store/Makefile
rename to deps/rabbitmq_trust_store/Makefile
index a424567ad11bec089c8b8ed6988c1d3de4f782ac..77a2ce79e5eef32fcae00517ad1fb35e0cf1dc04 100644 (file)
@@ -1,7 +1,8 @@
 PROJECT = rabbitmq_trust_store
 
+DEPS = rabbit_common rabbit
 ## We need the Cowboy's test utilities
-TEST_DEPS = rabbit amqp_client ct_helper
+TEST_DEPS = rabbitmq_ct_helpers amqp_client ct_helper
 dep_ct_helper = git https://github.com/extend/ct_helper.git master
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
@@ -13,14 +14,4 @@ ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
 ERLANG_MK_COMMIT = rabbitmq-tmp
 
 include rabbitmq-components.mk
-
-
-
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
 include erlang.mk
-
-
-# --------------------------------------------------------------------
-# Testing.
-# --------------------------------------------------------------------
-
diff --git a/deps/rabbitmq_trust_store/erlang.mk b/deps/rabbitmq_trust_store/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_trust_store/rabbitmq-components.mk b/deps/rabbitmq_trust_store/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 90%
rename from rabbitmq-server/deps/rabbitmq_trust_store/src/rabbitmq_trust_store.app.src
rename to deps/rabbitmq_trust_store/src/rabbitmq_trust_store.app.src
index 4b1775e14092ee398aada8763248f87d89a3a291..b2ae3241c2ee0989019c58c4b49c0acd969785ad 100644 (file)
@@ -1,6 +1,6 @@
 {application, rabbitmq_trust_store, [
   {description, "Client certificate trust store. Provides a way to whitelist client x509 certificates."},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_trust_store_app, []}},
@@ -10,6 +10,7 @@
   {applications, [
     kernel,
     stdlib,
+    rabbit_common,
     rabbit
   ]}
 ]}.
similarity index 80%
rename from rabbitmq-server/deps/rabbitmq_web_dispatch/Makefile
rename to deps/rabbitmq_web_dispatch/Makefile
index 39321893c38a9fe77eac372860d6ff62dededd09..986acacd77a63476994ea4ae974425ba097cbabc 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT = rabbitmq_web_dispatch
 
-DEPS = mochiweb webmachine
-TEST_DEPS = rabbit amqp_client
+DEPS = rabbit_common rabbit mochiweb webmachine
+TEST_DEPS = rabbitmq_ct_helpers
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_web_dispatch/erlang.mk b/deps/rabbitmq_web_dispatch/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_web_dispatch/rabbitmq-components.mk b/deps/rabbitmq_web_dispatch/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 62%
rename from rabbitmq-server/deps/rabbitmq_web_dispatch/src/rabbitmq_web_dispatch.app.src
rename to deps/rabbitmq_web_dispatch/src/rabbitmq_web_dispatch.app.src
index cd521f3bc71c18bc1f3acb42b25e116e11a3086e..0e06ccc248517a99874ca125b749e18d1d480623 100644 (file)
@@ -1,8 +1,8 @@
 {application, rabbitmq_web_dispatch,
  [{description, "RabbitMQ Web Dispatcher"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_web_dispatch_app, []}},
   {env, []},
-  {applications, [kernel, stdlib, mochiweb, webmachine]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, mochiweb, webmachine]}]}.
similarity index 81%
rename from rabbitmq-server/deps/rabbitmq_web_stomp/Makefile
rename to deps/rabbitmq_web_stomp/Makefile
index 9e53c88bbb35fa8a5cc9feb2adbbbcc53fa3286a..f14154e64525b8fecae41b0a61bc88d0ab7fd356 100644 (file)
@@ -1,13 +1,9 @@
 PROJECT = rabbitmq_web_stomp
 
-DEPS = cowboy sockjs rabbitmq_stomp
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
+DEPS = cowboy sockjs rabbit_common rabbit rabbitmq_stomp
+TEST_DEPS = rabbitmq_ct_helpers
 dep_cowboy_commit = 1.0.3
 
-# FIXME: Add Ranch as a BUILD_DEPS to be sure the correct version is picked.
-# See rabbitmq-components.mk.
-BUILD_DEPS += ranch
-
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
 # FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
diff --git a/deps/rabbitmq_web_stomp/erlang.mk b/deps/rabbitmq_web_stomp/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_web_stomp/rabbitmq-components.mk b/deps/rabbitmq_web_stomp/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 91%
rename from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbit_ws_client.erl
rename to deps/rabbitmq_web_stomp/src/rabbit_ws_client.erl
index 00ea2d6c1040f8b26aefcb1ab04055c719f935f7..1a7f88ef9cbe84b65af106681a8eb783a17949c3 100644 (file)
@@ -67,22 +67,19 @@ init_processor_state(Conn) ->
 
     StompConfig = case UseHTTPAuth of
         true ->
-            {Login, PassCode} = case lists:keyfind(authorization, 1, Headers) of
+            case lists:keyfind(authorization, 1, Headers) of
                 false ->
                     %% We fall back to the default STOMP credentials.
-                    UserConfig = application:get_env(rabbitmq_stomp,
-                                                     default_user, []),
-                    {proplists:get_value(login, UserConfig),
-                     proplists:get_value(passcode, UserConfig)};
+                    StompConfig0;
                 {_, AuthHd} ->
                     {<<"basic">>, {HTTPLogin, HTTPPassCode}}
                         = cowboy_http:token_ci(list_to_binary(AuthHd),
                                                fun cowboy_http:authorization/2),
-                    {HTTPLogin, HTTPPassCode}
-            end,
-            StompConfig0#stomp_configuration{default_login = Login,
-                                             default_passcode = PassCode,
-                                             force_default_creds = true};
+                    StompConfig0#stomp_configuration{
+                      default_login = HTTPLogin,
+                      default_passcode = HTTPPassCode,
+                      force_default_creds = true}
+            end;
         false ->
             StompConfig0
     end,
@@ -96,7 +93,7 @@ init_processor_state(Conn) ->
         additional_info=[{state, running}|Extra]},
 
     ProcessorState = rabbit_stomp_processor:initial_state(
-        StompConfig, 
+        StompConfig,
         {SendFun, AdapterInfo, none, PeerAddr}),
     {ok, ProcessorState}.
 
@@ -136,8 +133,8 @@ handle_info(#'basic.cancel_ok'{}, State) ->
     {noreply, State};
 handle_info(#'basic.ack'{delivery_tag = Tag, multiple = IsMulti}, State) ->
     ProcState = processor_state(State),
-    NewProcState = rabbit_stomp_processor:flush_pending_receipts(Tag, 
-                                                                   IsMulti, 
+    NewProcState = rabbit_stomp_processor:flush_pending_receipts(Tag,
+                                                                   IsMulti,
                                                                    ProcState),
     {noreply, processor_state(NewProcState, State)};
 handle_info({Delivery = #'basic.deliver'{},
@@ -145,9 +142,9 @@ handle_info({Delivery = #'basic.deliver'{},
              DeliveryCtx},
              State) ->
     ProcState = processor_state(State),
-    NewProcState = rabbit_stomp_processor:send_delivery(Delivery, 
-                                                          Props, 
-                                                          Payload, 
+    NewProcState = rabbit_stomp_processor:send_delivery(Delivery,
+                                                          Props,
+                                                          Payload,
                                                           DeliveryCtx,
                                                           ProcState),
     {noreply, processor_state(NewProcState, State)};
@@ -160,14 +157,14 @@ handle_info(#'basic.cancel'{consumer_tag = Ctag}, State) ->
         {stop, Reason, processor_state(NewProcState, State)}
     end;
 
-handle_info({start_heartbeats, _}, 
+handle_info({start_heartbeats, _},
             State = #state{heartbeat_mode = no_heartbeat}) ->
     {noreply, State};
 
-handle_info({start_heartbeats, {0, 0}}, State) -> 
+handle_info({start_heartbeats, {0, 0}}, State) ->
     {noreply, State};
 handle_info({start_heartbeats, {SendTimeout, ReceiveTimeout}},
-            State = #state{conn = Conn, 
+            State = #state{conn = Conn,
                            heartbeat_sup = SupPid,
                            heartbeat_mode = heartbeat}) ->
     Info = Conn:info(),
@@ -187,7 +184,7 @@ handle_info({'EXIT', From, Reason}, State) ->
   case rabbit_stomp_processor:handle_exit(From, Reason, ProcState) of
     {stop, Reason, NewProcState} ->
         {stop, Reason, processor_state(NewProcState, State)};
-    unknown_exit -> 
+    unknown_exit ->
         {stop, {connection_died, Reason}, State}
   end;
 %%----------------------------------------------------------------------------
@@ -232,7 +229,7 @@ process_received_bytes(Bytes, ProcessorState, ParseState, ConnPid) ->
     end.
 
 processor_state(#state{ proc_state = ProcState }) -> ProcState.
-processor_state(ProcState, #state{} = State) -> 
+processor_state(ProcState, #state{} = State) ->
   State#state{ proc_state = ProcState}.
 
 %%----------------------------------------------------------------------------
similarity index 80%
rename from rabbitmq-server/deps/rabbitmq_web_stomp/src/rabbitmq_web_stomp.app.src
rename to deps/rabbitmq_web_stomp/src/rabbitmq_web_stomp.app.src
index 46be5f02aa71f1c953a39fdd4a7f29f222aa7b97..9abccc5f87e6029771ec8c7e171ff2000f7c8d4f 100644 (file)
@@ -1,7 +1,7 @@
 {application, rabbitmq_web_stomp,
  [
   {description, "Rabbit WEB-STOMP - WebSockets to Stomp adapter"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_ws_app, []}},
@@ -14,5 +14,5 @@
          {sockjs_opts, []},
          {ws_frame, text},
          {use_http_auth, false}]},
-  {applications, [kernel, stdlib, rabbit, rabbitmq_stomp, cowboy, sockjs]}
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_stomp, cowboy, sockjs]}
  ]}.
diff --git a/deps/rabbitmq_web_stomp_examples/CODE_OF_CONDUCT.md b/deps/rabbitmq_web_stomp_examples/CODE_OF_CONDUCT.md
new file mode 100644 (file)
index 0000000..1f6ef1c
--- /dev/null
@@ -0,0 +1,44 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open
+and welcoming community, we pledge to respect all people who contribute through reporting
+issues, posting feature requests, updating documentation, submitting pull requests or
+patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for
+everyone, regardless of level of experience, gender, gender identity and expression,
+sexual orientation, disability, personal appearance, body size, race, ethnicity, age,
+religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+ * The use of sexualized language or imagery
+ * Personal attacks
+ * Trolling or insulting/derogatory comments
+ * Public or private harassment
+ * Publishing other's private information, such as physical or electronic addresses,
+   without explicit permission
+ * Other unethical or unprofessional conduct
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments,
+commits, code, wiki edits, issues, and other contributions that are not aligned to this
+Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors
+that they deem inappropriate, threatening, offensive, or harmful.
+
+By adopting this Code of Conduct, project maintainers commit themselves to fairly and
+consistently applying these principles to every aspect of managing this project. Project
+maintainers who do not follow or enforce the Code of Conduct may be permanently removed
+from the project team.
+
+This Code of Conduct applies both within project spaces and in public spaces when an
+individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by
+contacting a project maintainer at [info@rabbitmq.com](mailto:info@rabbitmq.com). All complaints will
+be reviewed and investigated and will result in a response that is deemed necessary and
+appropriate to the circumstances. Maintainers are obligated to maintain confidentiality
+with regard to the reporter of an incident.
+
+This Code of Conduct is adapted from the
+[Contributor Covenant](http://contributor-covenant.org), version 1.3.0, available at
+[contributor-covenant.org/version/1/3/0/](http://contributor-covenant.org/version/1/3/0/)
diff --git a/deps/rabbitmq_web_stomp_examples/CONTRIBUTING.md b/deps/rabbitmq_web_stomp_examples/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..45bbcbe
--- /dev/null
@@ -0,0 +1,38 @@
+## Overview
+
+RabbitMQ projects use pull requests to discuss, collaborate on and accept code contributions.
+Pull requests is the primary place of discussing code changes.
+
+## How to Contribute
+
+The process is fairly standard:
+
+ * Fork the repository or repositories you plan on contributing to
+ * Clone [RabbitMQ umbrella repository](https://github.com/rabbitmq/rabbitmq-public-umbrella)
+ * `cd umbrella`, `make co`
+ * Create a branch with a descriptive name in the relevant repositories
+ * Make your changes, run tests, commit with a [descriptive message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html), push to your fork
+ * Submit pull requests with an explanation what has been changed and **why**
+ * Submit a filled out and signed [Contributor Agreement](https://github.com/rabbitmq/ca#how-to-submit) if needed (see below)
+ * Be patient. We will get to your pull request eventually
+
+If what you are going to work on is a substantial change, please first ask the core team
+of their opinion on [RabbitMQ mailing list](https://groups.google.com/forum/#!forum/rabbitmq-users).
+
+
+## Code of Conduct
+
+See [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
+
+
+## Contributor Agreement
+
+If you want to contribute a non-trivial change, please submit a signed copy of our
+[Contributor Agreement](https://github.com/rabbitmq/ca#how-to-submit) around the time
+you submit your pull request. This will make it much easier (in some cases, possible)
+for the RabbitMQ team at Pivotal to merge your contribution.
+
+
+## Where to Ask Questions
+
+If something isn't clear, feel free to ask on our [mailing list](https://groups.google.com/forum/#!forum/rabbitmq-users).
similarity index 82%
rename from rabbitmq-server/deps/rabbitmq_web_stomp_examples/Makefile
rename to deps/rabbitmq_web_stomp_examples/Makefile
index 5e23f1702c456e98a20935b893ea8fc20c95a0b8..c80fa97dbee9c552da407ee69702176a1b62fab3 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT = rabbitmq_web_stomp_examples
 
-DEPS = rabbitmq_web_dispatch rabbitmq_web_stomp
+DEPS = rabbit_common rabbit rabbitmq_web_dispatch rabbitmq_web_stomp
 
 DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
 
diff --git a/deps/rabbitmq_web_stomp_examples/erlang.mk b/deps/rabbitmq_web_stomp_examples/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/deps/rabbitmq_web_stomp_examples/rabbitmq-components.mk b/deps/rabbitmq_web_stomp_examples/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
similarity index 63%
rename from rabbitmq-server/deps/rabbitmq_web_stomp_examples/src/rabbitmq_web_stomp_examples.app.src
rename to deps/rabbitmq_web_stomp_examples/src/rabbitmq_web_stomp_examples.app.src
index 3a6e7ce06d4c12f3b9c4da46042405a6cc38611e..9de1420e4f10d0af7a7c52f196de38ee82b17529 100644 (file)
@@ -1,8 +1,8 @@
 {application, rabbitmq_web_stomp_examples,
  [{description, "Rabbit WEB-STOMP - examples"},
-  {vsn, "3.6.5"},
+  {vsn, "3.6.6"},
   {modules, []},
   {registered, []},
   {mod, {rabbit_web_stomp_examples_app, []}},
   {env, [{listener, [{port, 15670}]}]},
-  {applications, [kernel, stdlib, rabbitmq_web_dispatch, rabbitmq_web_stomp]}]}.
+  {applications, [kernel, stdlib, rabbit_common, rabbit, rabbitmq_web_dispatch, rabbitmq_web_stomp]}]}.
similarity index 88%
rename from rabbitmq-server/deps/sockjs/Makefile
rename to deps/sockjs/Makefile
index aacd7f5cc7bed290d0f8415ea34e88723478490e..0e10035f141e89ea181efa67bf68d9e4e56e1bff 100644 (file)
@@ -21,4 +21,6 @@ pre-deps::
 
 pre-app::
 
-include ../../erlang.mk
\ No newline at end of file
+include ../../erlang.mk
+
+ERLC_OPTS += $(SOCKJS_ERLC_OPTS)
diff --git a/erlang.mk b/erlang.mk
new file mode 100644 (file)
index 0000000..6d2a31c
--- /dev/null
+++ b/erlang.mk
@@ -0,0 +1,6738 @@
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+.PHONY: all app apps deps search rel docs install-docs check tests clean distclean help erlang-mk
+
+ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
+
+ERLANG_MK_VERSION = 2.0.0-pre.2-144-g647ffd1
+
+# Core configuration.
+
+PROJECT ?= $(notdir $(CURDIR))
+PROJECT := $(strip $(PROJECT))
+
+PROJECT_VERSION ?= rolling
+PROJECT_MOD ?= $(PROJECT)_app
+
+# Verbosity.
+
+V ?= 0
+
+verbose_0 = @
+verbose_2 = set -x;
+verbose = $(verbose_$(V))
+
+gen_verbose_0 = @echo " GEN   " $@;
+gen_verbose_2 = set -x;
+gen_verbose = $(gen_verbose_$(V))
+
+# Temporary files directory.
+
+ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
+export ERLANG_MK_TMP
+
+# "erl" command.
+
+ERL = erl +A0 -noinput -boot start_clean
+
+# Platform detection.
+
+ifeq ($(PLATFORM),)
+UNAME_S := $(shell uname -s)
+
+ifeq ($(UNAME_S),Linux)
+PLATFORM = linux
+else ifeq ($(UNAME_S),Darwin)
+PLATFORM = darwin
+else ifeq ($(UNAME_S),SunOS)
+PLATFORM = solaris
+else ifeq ($(UNAME_S),GNU)
+PLATFORM = gnu
+else ifeq ($(UNAME_S),FreeBSD)
+PLATFORM = freebsd
+else ifeq ($(UNAME_S),NetBSD)
+PLATFORM = netbsd
+else ifeq ($(UNAME_S),OpenBSD)
+PLATFORM = openbsd
+else ifeq ($(UNAME_S),DragonFly)
+PLATFORM = dragonfly
+else ifeq ($(shell uname -o),Msys)
+PLATFORM = msys2
+else
+$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
+endif
+
+export PLATFORM
+endif
+
+# Core targets.
+
+all:: deps app rel
+
+# Noop to avoid a Make warning when there's nothing to do.
+rel::
+       $(verbose) :
+
+check:: tests
+
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
+       $(gen_verbose) rm -f erl_crash.dump
+endif
+
+distclean:: clean distclean-tmp
+
+distclean-tmp:
+       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
+
+help::
+       $(verbose) printf "%s\n" \
+               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
+               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
+               "" \
+               "Usage: [V=1] $(MAKE) [target]..." \
+               "" \
+               "Core targets:" \
+               "  all           Run deps, app and rel targets in that order" \
+               "  app           Compile the project" \
+               "  deps          Fetch dependencies (if needed) and compile them" \
+               "  fetch-deps    Fetch dependencies recursively (if needed) without compiling them" \
+               "  list-deps     List dependencies recursively on stdout" \
+               "  search q=...  Search for a package in the built-in index" \
+               "  rel           Build a release for this project, if applicable" \
+               "  docs          Build the documentation for this project" \
+               "  install-docs  Install the man pages for this project" \
+               "  check         Compile and run all tests and analysis for this project" \
+               "  tests         Run the tests for this project" \
+               "  clean         Delete temporary and output files from most targets" \
+               "  distclean     Delete all temporary and output files" \
+               "  help          Display this help and exit" \
+               "  erlang-mk     Update erlang.mk to the latest version"
+
+# Core functions.
+
+empty :=
+space := $(empty) $(empty)
+tab := $(empty)        $(empty)
+comma := ,
+
+define newline
+
+
+endef
+
+define comma_list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
+define erlang
+$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
+endef
+
+ifeq ($(PLATFORM),msys2)
+core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
+else
+core_native_path = $1
+endif
+
+ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
+define core_http_get
+       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
+endef
+else
+define core_http_get.erl
+       ssl:start(),
+       inets:start(),
+       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
+               {ok, {{_, 200, _}, _, Body}} ->
+                       case file:write_file("$(1)", Body) of
+                               ok -> ok;
+                               {error, R1} -> halt(R1)
+                       end;
+               {error, R2} ->
+                       halt(R2)
+       end,
+       halt(0).
+endef
+
+define core_http_get
+       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
+endef
+endif
+
+core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
+
+core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
+
+core_ls = $(filter-out $(1),$(shell echo $(1)))
+
+# @todo Use a solution that does not require using perl.
+core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
+
+# Automated update.
+
+ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
+ERLANG_MK_COMMIT ?=
+ERLANG_MK_BUILD_CONFIG ?= build.config
+ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
+
+erlang-mk:
+       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
+ifdef ERLANG_MK_COMMIT
+       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
+endif
+       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
+       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
+       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
+       rm -rf $(ERLANG_MK_BUILD_DIR)
+
+# The erlang.mk package index is bundled in the default erlang.mk build.
+# Search for the string "copyright" to skip to the rest of the code.
+
+PACKAGES += aberth
+pkg_aberth_name = aberth
+pkg_aberth_description = Generic BERT-RPC server in Erlang
+pkg_aberth_homepage = https://github.com/a13x/aberth
+pkg_aberth_fetch = git
+pkg_aberth_repo = https://github.com/a13x/aberth
+pkg_aberth_commit = master
+
+PACKAGES += active
+pkg_active_name = active
+pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
+pkg_active_homepage = https://github.com/proger/active
+pkg_active_fetch = git
+pkg_active_repo = https://github.com/proger/active
+pkg_active_commit = master
+
+PACKAGES += actordb_core
+pkg_actordb_core_name = actordb_core
+pkg_actordb_core_description = ActorDB main source
+pkg_actordb_core_homepage = http://www.actordb.com/
+pkg_actordb_core_fetch = git
+pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
+pkg_actordb_core_commit = master
+
+PACKAGES += actordb_thrift
+pkg_actordb_thrift_name = actordb_thrift
+pkg_actordb_thrift_description = Thrift API for ActorDB
+pkg_actordb_thrift_homepage = http://www.actordb.com/
+pkg_actordb_thrift_fetch = git
+pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
+pkg_actordb_thrift_commit = master
+
+PACKAGES += aleppo
+pkg_aleppo_name = aleppo
+pkg_aleppo_description = Alternative Erlang Pre-Processor
+pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
+pkg_aleppo_fetch = git
+pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
+pkg_aleppo_commit = master
+
+PACKAGES += alog
+pkg_alog_name = alog
+pkg_alog_description = Simply the best logging framework for Erlang
+pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
+pkg_alog_fetch = git
+pkg_alog_repo = https://github.com/siberian-fast-food/alogger
+pkg_alog_commit = master
+
+PACKAGES += amqp_client
+pkg_amqp_client_name = amqp_client
+pkg_amqp_client_description = RabbitMQ Erlang AMQP client
+pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
+pkg_amqp_client_fetch = git
+pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
+pkg_amqp_client_commit = master
+
+PACKAGES += annotations
+pkg_annotations_name = annotations
+pkg_annotations_description = Simple code instrumentation utilities
+pkg_annotations_homepage = https://github.com/hyperthunk/annotations
+pkg_annotations_fetch = git
+pkg_annotations_repo = https://github.com/hyperthunk/annotations
+pkg_annotations_commit = master
+
+PACKAGES += antidote
+pkg_antidote_name = antidote
+pkg_antidote_description = Large-scale computation without synchronisation
+pkg_antidote_homepage = https://syncfree.lip6.fr/
+pkg_antidote_fetch = git
+pkg_antidote_repo = https://github.com/SyncFree/antidote
+pkg_antidote_commit = master
+
+PACKAGES += apns
+pkg_apns_name = apns
+pkg_apns_description = Apple Push Notification Server for Erlang
+pkg_apns_homepage = http://inaka.github.com/apns4erl
+pkg_apns_fetch = git
+pkg_apns_repo = https://github.com/inaka/apns4erl
+pkg_apns_commit = master
+
+PACKAGES += azdht
+pkg_azdht_name = azdht
+pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
+pkg_azdht_homepage = https://github.com/arcusfelis/azdht
+pkg_azdht_fetch = git
+pkg_azdht_repo = https://github.com/arcusfelis/azdht
+pkg_azdht_commit = master
+
+PACKAGES += backoff
+pkg_backoff_name = backoff
+pkg_backoff_description = Simple exponential backoffs in Erlang
+pkg_backoff_homepage = https://github.com/ferd/backoff
+pkg_backoff_fetch = git
+pkg_backoff_repo = https://github.com/ferd/backoff
+pkg_backoff_commit = master
+
+PACKAGES += barrel_tcp
+pkg_barrel_tcp_name = barrel_tcp
+pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
+pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_fetch = git
+pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
+pkg_barrel_tcp_commit = master
+
+PACKAGES += basho_bench
+pkg_basho_bench_name = basho_bench
+pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
+pkg_basho_bench_homepage = https://github.com/basho/basho_bench
+pkg_basho_bench_fetch = git
+pkg_basho_bench_repo = https://github.com/basho/basho_bench
+pkg_basho_bench_commit = master
+
+PACKAGES += bcrypt
+pkg_bcrypt_name = bcrypt
+pkg_bcrypt_description = Bcrypt Erlang / C library
+pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_fetch = git
+pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
+pkg_bcrypt_commit = master
+
+PACKAGES += beam
+pkg_beam_name = beam
+pkg_beam_description = BEAM emulator written in Erlang
+pkg_beam_homepage = https://github.com/tonyrog/beam
+pkg_beam_fetch = git
+pkg_beam_repo = https://github.com/tonyrog/beam
+pkg_beam_commit = master
+
+PACKAGES += beanstalk
+pkg_beanstalk_name = beanstalk
+pkg_beanstalk_description = An Erlang client for beanstalkd
+pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_fetch = git
+pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
+pkg_beanstalk_commit = master
+
+PACKAGES += bear
+pkg_bear_name = bear
+pkg_bear_description = a set of statistics functions for erlang
+pkg_bear_homepage = https://github.com/boundary/bear
+pkg_bear_fetch = git
+pkg_bear_repo = https://github.com/boundary/bear
+pkg_bear_commit = master
+
+PACKAGES += bertconf
+pkg_bertconf_name = bertconf
+pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
+pkg_bertconf_homepage = https://github.com/ferd/bertconf
+pkg_bertconf_fetch = git
+pkg_bertconf_repo = https://github.com/ferd/bertconf
+pkg_bertconf_commit = master
+
+PACKAGES += bifrost
+pkg_bifrost_name = bifrost
+pkg_bifrost_description = Erlang FTP Server Framework
+pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
+pkg_bifrost_fetch = git
+pkg_bifrost_repo = https://github.com/thorstadt/bifrost
+pkg_bifrost_commit = master
+
+PACKAGES += binpp
+pkg_binpp_name = binpp
+pkg_binpp_description = Erlang Binary Pretty Printer
+pkg_binpp_homepage = https://github.com/jtendo/binpp
+pkg_binpp_fetch = git
+pkg_binpp_repo = https://github.com/jtendo/binpp
+pkg_binpp_commit = master
+
+PACKAGES += bisect
+pkg_bisect_name = bisect
+pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
+pkg_bisect_homepage = https://github.com/knutin/bisect
+pkg_bisect_fetch = git
+pkg_bisect_repo = https://github.com/knutin/bisect
+pkg_bisect_commit = master
+
+PACKAGES += bitcask
+pkg_bitcask_name = bitcask
+pkg_bitcask_description = because you need another a key/value storage engine
+pkg_bitcask_homepage = https://github.com/basho/bitcask
+pkg_bitcask_fetch = git
+pkg_bitcask_repo = https://github.com/basho/bitcask
+pkg_bitcask_commit = develop
+
+PACKAGES += bitstore
+pkg_bitstore_name = bitstore
+pkg_bitstore_description = A document based ontology development environment
+pkg_bitstore_homepage = https://github.com/bdionne/bitstore
+pkg_bitstore_fetch = git
+pkg_bitstore_repo = https://github.com/bdionne/bitstore
+pkg_bitstore_commit = master
+
+PACKAGES += bootstrap
+pkg_bootstrap_name = bootstrap
+pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
+pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
+pkg_bootstrap_fetch = git
+pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
+pkg_bootstrap_commit = master
+
+PACKAGES += boss_db
+pkg_boss_db_name = boss_db
+pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
+pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
+pkg_boss_db_fetch = git
+pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
+pkg_boss_db_commit = master
+
+PACKAGES += boss
+pkg_boss_name = boss
+pkg_boss_description = Erlang web MVC, now featuring Comet
+pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_fetch = git
+pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
+pkg_boss_commit = master
+
+PACKAGES += brod
+pkg_brod_name = brod
+pkg_brod_description = Kafka client in Erlang
+pkg_brod_homepage = https://github.com/klarna/brod
+pkg_brod_fetch = git
+pkg_brod_repo = https://github.com/klarna/brod.git
+pkg_brod_commit = master
+
+PACKAGES += bson
+pkg_bson_name = bson
+pkg_bson_description = BSON documents in Erlang, see bsonspec.org
+pkg_bson_homepage = https://github.com/comtihon/bson-erlang
+pkg_bson_fetch = git
+pkg_bson_repo = https://github.com/comtihon/bson-erlang
+pkg_bson_commit = master
+
+PACKAGES += bullet
+pkg_bullet_name = bullet
+pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
+pkg_bullet_homepage = http://ninenines.eu
+pkg_bullet_fetch = git
+pkg_bullet_repo = https://github.com/ninenines/bullet
+pkg_bullet_commit = master
+
+PACKAGES += cache
+pkg_cache_name = cache
+pkg_cache_description = Erlang in-memory cache
+pkg_cache_homepage = https://github.com/fogfish/cache
+pkg_cache_fetch = git
+pkg_cache_repo = https://github.com/fogfish/cache
+pkg_cache_commit = master
+
+PACKAGES += cake
+pkg_cake_name = cake
+pkg_cake_description = Really simple terminal colorization
+pkg_cake_homepage = https://github.com/darach/cake-erl
+pkg_cake_fetch = git
+pkg_cake_repo = https://github.com/darach/cake-erl
+pkg_cake_commit = master
+
+PACKAGES += carotene
+pkg_carotene_name = carotene
+pkg_carotene_description = Real-time server
+pkg_carotene_homepage = https://github.com/carotene/carotene
+pkg_carotene_fetch = git
+pkg_carotene_repo = https://github.com/carotene/carotene
+pkg_carotene_commit = master
+
+PACKAGES += cberl
+pkg_cberl_name = cberl
+pkg_cberl_description = NIF based Erlang bindings for Couchbase
+pkg_cberl_homepage = https://github.com/chitika/cberl
+pkg_cberl_fetch = git
+pkg_cberl_repo = https://github.com/chitika/cberl
+pkg_cberl_commit = master
+
+PACKAGES += cecho
+pkg_cecho_name = cecho
+pkg_cecho_description = An ncurses library for Erlang
+pkg_cecho_homepage = https://github.com/mazenharake/cecho
+pkg_cecho_fetch = git
+pkg_cecho_repo = https://github.com/mazenharake/cecho
+pkg_cecho_commit = master
+
+PACKAGES += cferl
+pkg_cferl_name = cferl
+pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
+pkg_cferl_homepage = https://github.com/ddossot/cferl
+pkg_cferl_fetch = git
+pkg_cferl_repo = https://github.com/ddossot/cferl
+pkg_cferl_commit = master
+
+PACKAGES += chaos_monkey
+pkg_chaos_monkey_name = chaos_monkey
+pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
+pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_fetch = git
+pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
+pkg_chaos_monkey_commit = master
+
+PACKAGES += check_node
+pkg_check_node_name = check_node
+pkg_check_node_description = Nagios Scripts for monitoring Riak
+pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
+pkg_check_node_fetch = git
+pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
+pkg_check_node_commit = master
+
+PACKAGES += chronos
+pkg_chronos_name = chronos
+pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
+pkg_chronos_homepage = https://github.com/lehoff/chronos
+pkg_chronos_fetch = git
+pkg_chronos_repo = https://github.com/lehoff/chronos
+pkg_chronos_commit = master
+
+PACKAGES += chumak
+pkg_chumak_name = chumak
+pkg_chumak_description = Pure Erlang implementation of ZeroMQ Message Transport Protocol.
+pkg_chumak_homepage = http://choven.ca
+pkg_chumak_fetch = git
+pkg_chumak_repo = https://github.com/chovencorp/chumak
+pkg_chumak_commit = master
+
+PACKAGES += cl
+pkg_cl_name = cl
+pkg_cl_description = OpenCL binding for Erlang
+pkg_cl_homepage = https://github.com/tonyrog/cl
+pkg_cl_fetch = git
+pkg_cl_repo = https://github.com/tonyrog/cl
+pkg_cl_commit = master
+
+PACKAGES += classifier
+pkg_classifier_name = classifier
+pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
+pkg_classifier_homepage = https://github.com/inaka/classifier
+pkg_classifier_fetch = git
+pkg_classifier_repo = https://github.com/inaka/classifier
+pkg_classifier_commit = master
+
+PACKAGES += clique
+pkg_clique_name = clique
+pkg_clique_description = CLI Framework for Erlang
+pkg_clique_homepage = https://github.com/basho/clique
+pkg_clique_fetch = git
+pkg_clique_repo = https://github.com/basho/clique
+pkg_clique_commit = develop
+
+PACKAGES += cloudi_core
+pkg_cloudi_core_name = cloudi_core
+pkg_cloudi_core_description = CloudI internal service runtime
+pkg_cloudi_core_homepage = http://cloudi.org/
+pkg_cloudi_core_fetch = git
+pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
+pkg_cloudi_core_commit = master
+
+PACKAGES += cloudi_service_api_requests
+pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
+pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
+pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
+pkg_cloudi_service_api_requests_fetch = git
+pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
+pkg_cloudi_service_api_requests_commit = master
+
+PACKAGES += cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
+pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_cql_fetch = git
+pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
+pkg_cloudi_service_db_cassandra_cql_commit = master
+
+PACKAGES += cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
+pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
+pkg_cloudi_service_db_cassandra_fetch = git
+pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
+pkg_cloudi_service_db_cassandra_commit = master
+
+PACKAGES += cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
+pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
+pkg_cloudi_service_db_couchdb_fetch = git
+pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
+pkg_cloudi_service_db_couchdb_commit = master
+
+PACKAGES += cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
+pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
+pkg_cloudi_service_db_elasticsearch_fetch = git
+pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
+pkg_cloudi_service_db_elasticsearch_commit = master
+
+PACKAGES += cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_description = memcached CloudI Service
+pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
+pkg_cloudi_service_db_memcached_fetch = git
+pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
+pkg_cloudi_service_db_memcached_commit = master
+
+PACKAGES += cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
+pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_mysql_fetch = git
+pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
+pkg_cloudi_service_db_mysql_commit = master
+
+PACKAGES += cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
+pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
+pkg_cloudi_service_db_pgsql_fetch = git
+pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
+pkg_cloudi_service_db_pgsql_commit = master
+
+PACKAGES += cloudi_service_db_riak
+pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
+pkg_cloudi_service_db_riak_description = Riak CloudI Service
+pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
+pkg_cloudi_service_db_riak_fetch = git
+pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
+pkg_cloudi_service_db_riak_commit = master
+
+PACKAGES += cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
+pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
+pkg_cloudi_service_db_tokyotyrant_fetch = git
+pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
+pkg_cloudi_service_db_tokyotyrant_commit = master
+
+PACKAGES += cloudi_service_db
+pkg_cloudi_service_db_name = cloudi_service_db
+pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
+pkg_cloudi_service_db_homepage = http://cloudi.org/
+pkg_cloudi_service_db_fetch = git
+pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
+pkg_cloudi_service_db_commit = master
+
+PACKAGES += cloudi_service_filesystem
+pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
+pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
+pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
+pkg_cloudi_service_filesystem_fetch = git
+pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
+pkg_cloudi_service_filesystem_commit = master
+
+PACKAGES += cloudi_service_http_client
+pkg_cloudi_service_http_client_name = cloudi_service_http_client
+pkg_cloudi_service_http_client_description = HTTP client CloudI Service
+pkg_cloudi_service_http_client_homepage = http://cloudi.org/
+pkg_cloudi_service_http_client_fetch = git
+pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
+pkg_cloudi_service_http_client_commit = master
+
+PACKAGES += cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
+pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
+pkg_cloudi_service_http_cowboy_fetch = git
+pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
+pkg_cloudi_service_http_cowboy_commit = master
+
+PACKAGES += cloudi_service_http_elli
+pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
+pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
+pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
+pkg_cloudi_service_http_elli_fetch = git
+pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
+pkg_cloudi_service_http_elli_commit = master
+
+PACKAGES += cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
+pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
+pkg_cloudi_service_map_reduce_fetch = git
+pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
+pkg_cloudi_service_map_reduce_commit = master
+
+PACKAGES += cloudi_service_oauth1
+pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
+pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
+pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
+pkg_cloudi_service_oauth1_fetch = git
+pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
+pkg_cloudi_service_oauth1_commit = master
+
+PACKAGES += cloudi_service_queue
+pkg_cloudi_service_queue_name = cloudi_service_queue
+pkg_cloudi_service_queue_description = Persistent Queue Service
+pkg_cloudi_service_queue_homepage = http://cloudi.org/
+pkg_cloudi_service_queue_fetch = git
+pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
+pkg_cloudi_service_queue_commit = master
+
+PACKAGES += cloudi_service_quorum
+pkg_cloudi_service_quorum_name = cloudi_service_quorum
+pkg_cloudi_service_quorum_description = CloudI Quorum Service
+pkg_cloudi_service_quorum_homepage = http://cloudi.org/
+pkg_cloudi_service_quorum_fetch = git
+pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
+pkg_cloudi_service_quorum_commit = master
+
+PACKAGES += cloudi_service_router
+pkg_cloudi_service_router_name = cloudi_service_router
+pkg_cloudi_service_router_description = CloudI Router Service
+pkg_cloudi_service_router_homepage = http://cloudi.org/
+pkg_cloudi_service_router_fetch = git
+pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
+pkg_cloudi_service_router_commit = master
+
+PACKAGES += cloudi_service_tcp
+pkg_cloudi_service_tcp_name = cloudi_service_tcp
+pkg_cloudi_service_tcp_description = TCP CloudI Service
+pkg_cloudi_service_tcp_homepage = http://cloudi.org/
+pkg_cloudi_service_tcp_fetch = git
+pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
+pkg_cloudi_service_tcp_commit = master
+
+PACKAGES += cloudi_service_timers
+pkg_cloudi_service_timers_name = cloudi_service_timers
+pkg_cloudi_service_timers_description = Timers CloudI Service
+pkg_cloudi_service_timers_homepage = http://cloudi.org/
+pkg_cloudi_service_timers_fetch = git
+pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
+pkg_cloudi_service_timers_commit = master
+
+PACKAGES += cloudi_service_udp
+pkg_cloudi_service_udp_name = cloudi_service_udp
+pkg_cloudi_service_udp_description = UDP CloudI Service
+pkg_cloudi_service_udp_homepage = http://cloudi.org/
+pkg_cloudi_service_udp_fetch = git
+pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
+pkg_cloudi_service_udp_commit = master
+
+PACKAGES += cloudi_service_validate
+pkg_cloudi_service_validate_name = cloudi_service_validate
+pkg_cloudi_service_validate_description = CloudI Validate Service
+pkg_cloudi_service_validate_homepage = http://cloudi.org/
+pkg_cloudi_service_validate_fetch = git
+pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
+pkg_cloudi_service_validate_commit = master
+
+PACKAGES += cloudi_service_zeromq
+pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
+pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
+pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
+pkg_cloudi_service_zeromq_fetch = git
+pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
+pkg_cloudi_service_zeromq_commit = master
+
+PACKAGES += cluster_info
+pkg_cluster_info_name = cluster_info
+pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
+pkg_cluster_info_homepage = https://github.com/basho/cluster_info
+pkg_cluster_info_fetch = git
+pkg_cluster_info_repo = https://github.com/basho/cluster_info
+pkg_cluster_info_commit = master
+
+PACKAGES += color
+pkg_color_name = color
+pkg_color_description = ANSI colors for your Erlang
+pkg_color_homepage = https://github.com/julianduque/erlang-color
+pkg_color_fetch = git
+pkg_color_repo = https://github.com/julianduque/erlang-color
+pkg_color_commit = master
+
+PACKAGES += confetti
+pkg_confetti_name = confetti
+pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
+pkg_confetti_homepage = https://github.com/jtendo/confetti
+pkg_confetti_fetch = git
+pkg_confetti_repo = https://github.com/jtendo/confetti
+pkg_confetti_commit = master
+
+PACKAGES += couchbeam
+pkg_couchbeam_name = couchbeam
+pkg_couchbeam_description = Apache CouchDB client in Erlang
+pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
+pkg_couchbeam_fetch = git
+pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
+pkg_couchbeam_commit = master
+
+PACKAGES += covertool
+pkg_covertool_name = covertool
+pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
+pkg_covertool_homepage = https://github.com/idubrov/covertool
+pkg_covertool_fetch = git
+pkg_covertool_repo = https://github.com/idubrov/covertool
+pkg_covertool_commit = master
+
+PACKAGES += cowboy
+pkg_cowboy_name = cowboy
+pkg_cowboy_description = Small, fast and modular HTTP server.
+pkg_cowboy_homepage = http://ninenines.eu
+pkg_cowboy_fetch = git
+pkg_cowboy_repo = https://github.com/ninenines/cowboy
+pkg_cowboy_commit = 1.0.4
+
+PACKAGES += cowdb
+pkg_cowdb_name = cowdb
+pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
+pkg_cowdb_homepage = https://github.com/refuge/cowdb
+pkg_cowdb_fetch = git
+pkg_cowdb_repo = https://github.com/refuge/cowdb
+pkg_cowdb_commit = master
+
+PACKAGES += cowlib
+pkg_cowlib_name = cowlib
+pkg_cowlib_description = Support library for manipulating Web protocols.
+pkg_cowlib_homepage = http://ninenines.eu
+pkg_cowlib_fetch = git
+pkg_cowlib_repo = https://github.com/ninenines/cowlib
+pkg_cowlib_commit = 1.0.2
+
+PACKAGES += cpg
+pkg_cpg_name = cpg
+pkg_cpg_description = CloudI Process Groups
+pkg_cpg_homepage = https://github.com/okeuday/cpg
+pkg_cpg_fetch = git
+pkg_cpg_repo = https://github.com/okeuday/cpg
+pkg_cpg_commit = master
+
+PACKAGES += cqerl
+pkg_cqerl_name = cqerl
+pkg_cqerl_description = Native Erlang CQL client for Cassandra
+pkg_cqerl_homepage = https://matehat.github.io/cqerl/
+pkg_cqerl_fetch = git
+pkg_cqerl_repo = https://github.com/matehat/cqerl
+pkg_cqerl_commit = master
+
+PACKAGES += cr
+pkg_cr_name = cr
+pkg_cr_description = Chain Replication
+pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
+pkg_cr_fetch = git
+pkg_cr_repo = https://github.com/spawnproc/cr
+pkg_cr_commit = master
+
+PACKAGES += cuttlefish
+pkg_cuttlefish_name = cuttlefish
+pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
+pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
+pkg_cuttlefish_fetch = git
+pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
+pkg_cuttlefish_commit = master
+
+PACKAGES += damocles
+pkg_damocles_name = damocles
+pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
+pkg_damocles_homepage = https://github.com/lostcolony/damocles
+pkg_damocles_fetch = git
+pkg_damocles_repo = https://github.com/lostcolony/damocles
+pkg_damocles_commit = master
+
+PACKAGES += debbie
+pkg_debbie_name = debbie
+pkg_debbie_description = .DEB Built In Erlang
+pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
+pkg_debbie_fetch = git
+pkg_debbie_repo = https://github.com/crownedgrouse/debbie
+pkg_debbie_commit = master
+
+PACKAGES += decimal
+pkg_decimal_name = decimal
+pkg_decimal_description = An Erlang decimal arithmetic library
+pkg_decimal_homepage = https://github.com/tim/erlang-decimal
+pkg_decimal_fetch = git
+pkg_decimal_repo = https://github.com/tim/erlang-decimal
+pkg_decimal_commit = master
+
+PACKAGES += detergent
+pkg_detergent_name = detergent
+pkg_detergent_description = An emulsifying Erlang SOAP library
+pkg_detergent_homepage = https://github.com/devinus/detergent
+pkg_detergent_fetch = git
+pkg_detergent_repo = https://github.com/devinus/detergent
+pkg_detergent_commit = master
+
+PACKAGES += detest
+pkg_detest_name = detest
+pkg_detest_description = Tool for running tests on a cluster of erlang nodes
+pkg_detest_homepage = https://github.com/biokoda/detest
+pkg_detest_fetch = git
+pkg_detest_repo = https://github.com/biokoda/detest
+pkg_detest_commit = master
+
+PACKAGES += dh_date
+pkg_dh_date_name = dh_date
+pkg_dh_date_description = Date formatting / parsing library for erlang
+pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
+pkg_dh_date_fetch = git
+pkg_dh_date_repo = https://github.com/daleharvey/dh_date
+pkg_dh_date_commit = master
+
+PACKAGES += dirbusterl
+pkg_dirbusterl_name = dirbusterl
+pkg_dirbusterl_description = DirBuster successor in Erlang
+pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_fetch = git
+pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
+pkg_dirbusterl_commit = master
+
+PACKAGES += dispcount
+pkg_dispcount_name = dispcount
+pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
+pkg_dispcount_homepage = https://github.com/ferd/dispcount
+pkg_dispcount_fetch = git
+pkg_dispcount_repo = https://github.com/ferd/dispcount
+pkg_dispcount_commit = master
+
+PACKAGES += dlhttpc
+pkg_dlhttpc_name = dlhttpc
+pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
+pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_fetch = git
+pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
+pkg_dlhttpc_commit = master
+
+PACKAGES += dns
+pkg_dns_name = dns
+pkg_dns_description = Erlang DNS library
+pkg_dns_homepage = https://github.com/aetrion/dns_erlang
+pkg_dns_fetch = git
+pkg_dns_repo = https://github.com/aetrion/dns_erlang
+pkg_dns_commit = master
+
+PACKAGES += dnssd
+pkg_dnssd_name = dnssd
+pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
+pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_fetch = git
+pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
+pkg_dnssd_commit = master
+
+PACKAGES += dtl
+pkg_dtl_name = dtl
+pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
+pkg_dtl_homepage = https://github.com/oinksoft/dtl
+pkg_dtl_fetch = git
+pkg_dtl_repo = https://github.com/oinksoft/dtl
+pkg_dtl_commit = master
+
+PACKAGES += dynamic_compile
+pkg_dynamic_compile_name = dynamic_compile
+pkg_dynamic_compile_description = compile and load erlang modules from string input
+pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_fetch = git
+pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
+pkg_dynamic_compile_commit = master
+
+PACKAGES += e2
+pkg_e2_name = e2
+pkg_e2_description = Library to simply writing correct OTP applications.
+pkg_e2_homepage = http://e2project.org
+pkg_e2_fetch = git
+pkg_e2_repo = https://github.com/gar1t/e2
+pkg_e2_commit = master
+
+PACKAGES += eamf
+pkg_eamf_name = eamf
+pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
+pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_fetch = git
+pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
+pkg_eamf_commit = master
+
+PACKAGES += eavro
+pkg_eavro_name = eavro
+pkg_eavro_description = Apache Avro encoder/decoder
+pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_fetch = git
+pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
+pkg_eavro_commit = master
+
+PACKAGES += ecapnp
+pkg_ecapnp_name = ecapnp
+pkg_ecapnp_description = Cap'n Proto library for Erlang
+pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
+pkg_ecapnp_fetch = git
+pkg_ecapnp_repo = https://github.com/kaos/ecapnp
+pkg_ecapnp_commit = master
+
+PACKAGES += econfig
+pkg_econfig_name = econfig
+pkg_econfig_description = simple Erlang config handler using INI files
+pkg_econfig_homepage = https://github.com/benoitc/econfig
+pkg_econfig_fetch = git
+pkg_econfig_repo = https://github.com/benoitc/econfig
+pkg_econfig_commit = master
+
+PACKAGES += edate
+pkg_edate_name = edate
+pkg_edate_description = date manipulation library for erlang
+pkg_edate_homepage = https://github.com/dweldon/edate
+pkg_edate_fetch = git
+pkg_edate_repo = https://github.com/dweldon/edate
+pkg_edate_commit = master
+
+PACKAGES += edgar
+pkg_edgar_name = edgar
+pkg_edgar_description = Erlang Does GNU AR
+pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
+pkg_edgar_fetch = git
+pkg_edgar_repo = https://github.com/crownedgrouse/edgar
+pkg_edgar_commit = master
+
+PACKAGES += edis
+pkg_edis_name = edis
+pkg_edis_description = An Erlang implementation of Redis KV Store
+pkg_edis_homepage = http://inaka.github.com/edis/
+pkg_edis_fetch = git
+pkg_edis_repo = https://github.com/inaka/edis
+pkg_edis_commit = master
+
+PACKAGES += edns
+pkg_edns_name = edns
+pkg_edns_description = Erlang/OTP DNS server
+pkg_edns_homepage = https://github.com/hcvst/erlang-dns
+pkg_edns_fetch = git
+pkg_edns_repo = https://github.com/hcvst/erlang-dns
+pkg_edns_commit = master
+
+PACKAGES += edown
+pkg_edown_name = edown
+pkg_edown_description = EDoc extension for generating Github-flavored Markdown
+pkg_edown_homepage = https://github.com/uwiger/edown
+pkg_edown_fetch = git
+pkg_edown_repo = https://github.com/uwiger/edown
+pkg_edown_commit = master
+
+PACKAGES += eep_app
+pkg_eep_app_name = eep_app
+pkg_eep_app_description = Embedded Event Processing
+pkg_eep_app_homepage = https://github.com/darach/eep-erl
+pkg_eep_app_fetch = git
+pkg_eep_app_repo = https://github.com/darach/eep-erl
+pkg_eep_app_commit = master
+
+PACKAGES += eep
+pkg_eep_name = eep
+pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
+pkg_eep_homepage = https://github.com/virtan/eep
+pkg_eep_fetch = git
+pkg_eep_repo = https://github.com/virtan/eep
+pkg_eep_commit = master
+
+PACKAGES += efene
+pkg_efene_name = efene
+pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
+pkg_efene_homepage = https://github.com/efene/efene
+pkg_efene_fetch = git
+pkg_efene_repo = https://github.com/efene/efene
+pkg_efene_commit = master
+
+PACKAGES += egeoip
+pkg_egeoip_name = egeoip
+pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
+pkg_egeoip_homepage = https://github.com/mochi/egeoip
+pkg_egeoip_fetch = git
+pkg_egeoip_repo = https://github.com/mochi/egeoip
+pkg_egeoip_commit = master
+
+PACKAGES += ehsa
+pkg_ehsa_name = ehsa
+pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
+pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_fetch = hg
+pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
+pkg_ehsa_commit = default
+
+PACKAGES += ej
+pkg_ej_name = ej
+pkg_ej_description = Helper module for working with Erlang terms representing JSON
+pkg_ej_homepage = https://github.com/seth/ej
+pkg_ej_fetch = git
+pkg_ej_repo = https://github.com/seth/ej
+pkg_ej_commit = master
+
+PACKAGES += ejabberd
+pkg_ejabberd_name = ejabberd
+pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
+pkg_ejabberd_homepage = https://github.com/processone/ejabberd
+pkg_ejabberd_fetch = git
+pkg_ejabberd_repo = https://github.com/processone/ejabberd
+pkg_ejabberd_commit = master
+
+PACKAGES += ejwt
+pkg_ejwt_name = ejwt
+pkg_ejwt_description = erlang library for JSON Web Token
+pkg_ejwt_homepage = https://github.com/artefactop/ejwt
+pkg_ejwt_fetch = git
+pkg_ejwt_repo = https://github.com/artefactop/ejwt
+pkg_ejwt_commit = master
+
+PACKAGES += ekaf
+pkg_ekaf_name = ekaf
+pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
+pkg_ekaf_homepage = https://github.com/helpshift/ekaf
+pkg_ekaf_fetch = git
+pkg_ekaf_repo = https://github.com/helpshift/ekaf
+pkg_ekaf_commit = master
+
+PACKAGES += elarm
+pkg_elarm_name = elarm
+pkg_elarm_description = Alarm Manager for Erlang.
+pkg_elarm_homepage = https://github.com/esl/elarm
+pkg_elarm_fetch = git
+pkg_elarm_repo = https://github.com/esl/elarm
+pkg_elarm_commit = master
+
+PACKAGES += eleveldb
+pkg_eleveldb_name = eleveldb
+pkg_eleveldb_description = Erlang LevelDB API
+pkg_eleveldb_homepage = https://github.com/basho/eleveldb
+pkg_eleveldb_fetch = git
+pkg_eleveldb_repo = https://github.com/basho/eleveldb
+pkg_eleveldb_commit = master
+
+PACKAGES += elli
+pkg_elli_name = elli
+pkg_elli_description = Simple, robust and performant Erlang web server
+pkg_elli_homepage = https://github.com/knutin/elli
+pkg_elli_fetch = git
+pkg_elli_repo = https://github.com/knutin/elli
+pkg_elli_commit = master
+
+PACKAGES += elvis
+pkg_elvis_name = elvis
+pkg_elvis_description = Erlang Style Reviewer
+pkg_elvis_homepage = https://github.com/inaka/elvis
+pkg_elvis_fetch = git
+pkg_elvis_repo = https://github.com/inaka/elvis
+pkg_elvis_commit = master
+
+PACKAGES += emagick
+pkg_emagick_name = emagick
+pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
+pkg_emagick_homepage = https://github.com/kivra/emagick
+pkg_emagick_fetch = git
+pkg_emagick_repo = https://github.com/kivra/emagick
+pkg_emagick_commit = master
+
+PACKAGES += emysql
+pkg_emysql_name = emysql
+pkg_emysql_description = Stable, pure Erlang MySQL driver.
+pkg_emysql_homepage = https://github.com/Eonblast/Emysql
+pkg_emysql_fetch = git
+pkg_emysql_repo = https://github.com/Eonblast/Emysql
+pkg_emysql_commit = master
+
+PACKAGES += enm
+pkg_enm_name = enm
+pkg_enm_description = Erlang driver for nanomsg
+pkg_enm_homepage = https://github.com/basho/enm
+pkg_enm_fetch = git
+pkg_enm_repo = https://github.com/basho/enm
+pkg_enm_commit = master
+
+PACKAGES += entop
+pkg_entop_name = entop
+pkg_entop_description = A top-like tool for monitoring an Erlang node
+pkg_entop_homepage = https://github.com/mazenharake/entop
+pkg_entop_fetch = git
+pkg_entop_repo = https://github.com/mazenharake/entop
+pkg_entop_commit = master
+
+PACKAGES += epcap
+pkg_epcap_name = epcap
+pkg_epcap_description = Erlang packet capture interface using pcap
+pkg_epcap_homepage = https://github.com/msantos/epcap
+pkg_epcap_fetch = git
+pkg_epcap_repo = https://github.com/msantos/epcap
+pkg_epcap_commit = master
+
+PACKAGES += eper
+pkg_eper_name = eper
+pkg_eper_description = Erlang performance and debugging tools.
+pkg_eper_homepage = https://github.com/massemanet/eper
+pkg_eper_fetch = git
+pkg_eper_repo = https://github.com/massemanet/eper
+pkg_eper_commit = master
+
+PACKAGES += epgsql
+pkg_epgsql_name = epgsql
+pkg_epgsql_description = Erlang PostgreSQL client library.
+pkg_epgsql_homepage = https://github.com/epgsql/epgsql
+pkg_epgsql_fetch = git
+pkg_epgsql_repo = https://github.com/epgsql/epgsql
+pkg_epgsql_commit = master
+
+PACKAGES += episcina
+pkg_episcina_name = episcina
+pkg_episcina_description = A simple non intrusive resource pool for connections
+pkg_episcina_homepage = https://github.com/erlware/episcina
+pkg_episcina_fetch = git
+pkg_episcina_repo = https://github.com/erlware/episcina
+pkg_episcina_commit = master
+
+PACKAGES += eplot
+pkg_eplot_name = eplot
+pkg_eplot_description = A plot engine written in erlang.
+pkg_eplot_homepage = https://github.com/psyeugenic/eplot
+pkg_eplot_fetch = git
+pkg_eplot_repo = https://github.com/psyeugenic/eplot
+pkg_eplot_commit = master
+
+PACKAGES += epocxy
+pkg_epocxy_name = epocxy
+pkg_epocxy_description = Erlang Patterns of Concurrency
+pkg_epocxy_homepage = https://github.com/duomark/epocxy
+pkg_epocxy_fetch = git
+pkg_epocxy_repo = https://github.com/duomark/epocxy
+pkg_epocxy_commit = master
+
+PACKAGES += epubnub
+pkg_epubnub_name = epubnub
+pkg_epubnub_description = Erlang PubNub API
+pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
+pkg_epubnub_fetch = git
+pkg_epubnub_repo = https://github.com/tsloughter/epubnub
+pkg_epubnub_commit = master
+
+PACKAGES += eqm
+pkg_eqm_name = eqm
+pkg_eqm_description = Erlang pub sub with supply-demand channels
+pkg_eqm_homepage = https://github.com/loucash/eqm
+pkg_eqm_fetch = git
+pkg_eqm_repo = https://github.com/loucash/eqm
+pkg_eqm_commit = master
+
+PACKAGES += eredis_pool
+pkg_eredis_pool_name = eredis_pool
+pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
+pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_fetch = git
+pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
+pkg_eredis_pool_commit = master
+
+PACKAGES += eredis
+pkg_eredis_name = eredis
+pkg_eredis_description = Erlang Redis client
+pkg_eredis_homepage = https://github.com/wooga/eredis
+pkg_eredis_fetch = git
+pkg_eredis_repo = https://github.com/wooga/eredis
+pkg_eredis_commit = master
+
+PACKAGES += erl_streams
+pkg_erl_streams_name = erl_streams
+pkg_erl_streams_description = Streams in Erlang
+pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
+pkg_erl_streams_fetch = git
+pkg_erl_streams_repo = https://github.com/epappas/erl_streams
+pkg_erl_streams_commit = master
+
+PACKAGES += erlang_cep
+pkg_erlang_cep_name = erlang_cep
+pkg_erlang_cep_description = A basic CEP package written in erlang
+pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_fetch = git
+pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
+pkg_erlang_cep_commit = master
+
+PACKAGES += erlang_js
+pkg_erlang_js_name = erlang_js
+pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
+pkg_erlang_js_homepage = https://github.com/basho/erlang_js
+pkg_erlang_js_fetch = git
+pkg_erlang_js_repo = https://github.com/basho/erlang_js
+pkg_erlang_js_commit = master
+
+PACKAGES += erlang_localtime
+pkg_erlang_localtime_name = erlang_localtime
+pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
+pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_fetch = git
+pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
+pkg_erlang_localtime_commit = master
+
+PACKAGES += erlang_smtp
+pkg_erlang_smtp_name = erlang_smtp
+pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
+pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_fetch = git
+pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
+pkg_erlang_smtp_commit = master
+
+PACKAGES += erlang_term
+pkg_erlang_term_name = erlang_term
+pkg_erlang_term_description = Erlang Term Info
+pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
+pkg_erlang_term_fetch = git
+pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
+pkg_erlang_term_commit = master
+
+PACKAGES += erlastic_search
+pkg_erlastic_search_name = erlastic_search
+pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
+pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_fetch = git
+pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
+pkg_erlastic_search_commit = master
+
+PACKAGES += erlasticsearch
+pkg_erlasticsearch_name = erlasticsearch
+pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
+pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_fetch = git
+pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
+pkg_erlasticsearch_commit = master
+
+PACKAGES += erlbrake
+pkg_erlbrake_name = erlbrake
+pkg_erlbrake_description = Erlang Airbrake notification client
+pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_fetch = git
+pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
+pkg_erlbrake_commit = master
+
+PACKAGES += erlcloud
+pkg_erlcloud_name = erlcloud
+pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
+pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
+pkg_erlcloud_fetch = git
+pkg_erlcloud_repo = https://github.com/gleber/erlcloud
+pkg_erlcloud_commit = master
+
+PACKAGES += erlcron
+pkg_erlcron_name = erlcron
+pkg_erlcron_description = Erlang cronish system
+pkg_erlcron_homepage = https://github.com/erlware/erlcron
+pkg_erlcron_fetch = git
+pkg_erlcron_repo = https://github.com/erlware/erlcron
+pkg_erlcron_commit = master
+
+PACKAGES += erldb
+pkg_erldb_name = erldb
+pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
+pkg_erldb_homepage = http://erldb.org
+pkg_erldb_fetch = git
+pkg_erldb_repo = https://github.com/erldb/erldb
+pkg_erldb_commit = master
+
+PACKAGES += erldis
+pkg_erldis_name = erldis
+pkg_erldis_description = redis erlang client library
+pkg_erldis_homepage = https://github.com/cstar/erldis
+pkg_erldis_fetch = git
+pkg_erldis_repo = https://github.com/cstar/erldis
+pkg_erldis_commit = master
+
+PACKAGES += erldns
+pkg_erldns_name = erldns
+pkg_erldns_description = DNS server, in erlang.
+pkg_erldns_homepage = https://github.com/aetrion/erl-dns
+pkg_erldns_fetch = git
+pkg_erldns_repo = https://github.com/aetrion/erl-dns
+pkg_erldns_commit = master
+
+PACKAGES += erldocker
+pkg_erldocker_name = erldocker
+pkg_erldocker_description = Docker Remote API client for Erlang
+pkg_erldocker_homepage = https://github.com/proger/erldocker
+pkg_erldocker_fetch = git
+pkg_erldocker_repo = https://github.com/proger/erldocker
+pkg_erldocker_commit = master
+
+PACKAGES += erlfsmon
+pkg_erlfsmon_name = erlfsmon
+pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
+pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
+pkg_erlfsmon_fetch = git
+pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
+pkg_erlfsmon_commit = master
+
+PACKAGES += erlgit
+pkg_erlgit_name = erlgit
+pkg_erlgit_description = Erlang convenience wrapper around git executable
+pkg_erlgit_homepage = https://github.com/gleber/erlgit
+pkg_erlgit_fetch = git
+pkg_erlgit_repo = https://github.com/gleber/erlgit
+pkg_erlgit_commit = master
+
+PACKAGES += erlguten
+pkg_erlguten_name = erlguten
+pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
+pkg_erlguten_homepage = https://github.com/richcarl/erlguten
+pkg_erlguten_fetch = git
+pkg_erlguten_repo = https://github.com/richcarl/erlguten
+pkg_erlguten_commit = master
+
+PACKAGES += erlmc
+pkg_erlmc_name = erlmc
+pkg_erlmc_description = Erlang memcached binary protocol client
+pkg_erlmc_homepage = https://github.com/jkvor/erlmc
+pkg_erlmc_fetch = git
+pkg_erlmc_repo = https://github.com/jkvor/erlmc
+pkg_erlmc_commit = master
+
+PACKAGES += erlmongo
+pkg_erlmongo_name = erlmongo
+pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
+pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_fetch = git
+pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
+pkg_erlmongo_commit = master
+
+PACKAGES += erlog
+pkg_erlog_name = erlog
+pkg_erlog_description = Prolog interpreter in and for Erlang
+pkg_erlog_homepage = https://github.com/rvirding/erlog
+pkg_erlog_fetch = git
+pkg_erlog_repo = https://github.com/rvirding/erlog
+pkg_erlog_commit = master
+
+PACKAGES += erlpass
+pkg_erlpass_name = erlpass
+pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
+pkg_erlpass_homepage = https://github.com/ferd/erlpass
+pkg_erlpass_fetch = git
+pkg_erlpass_repo = https://github.com/ferd/erlpass
+pkg_erlpass_commit = master
+
+PACKAGES += erlport
+pkg_erlport_name = erlport
+pkg_erlport_description = ErlPort - connect Erlang to other languages
+pkg_erlport_homepage = https://github.com/hdima/erlport
+pkg_erlport_fetch = git
+pkg_erlport_repo = https://github.com/hdima/erlport
+pkg_erlport_commit = master
+
+PACKAGES += erlsh
+pkg_erlsh_name = erlsh
+pkg_erlsh_description = Erlang shell tools
+pkg_erlsh_homepage = https://github.com/proger/erlsh
+pkg_erlsh_fetch = git
+pkg_erlsh_repo = https://github.com/proger/erlsh
+pkg_erlsh_commit = master
+
+PACKAGES += erlsha2
+pkg_erlsha2_name = erlsha2
+pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
+pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
+pkg_erlsha2_fetch = git
+pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
+pkg_erlsha2_commit = master
+
+PACKAGES += erlsom
+pkg_erlsom_name = erlsom
+pkg_erlsom_description = XML parser for Erlang
+pkg_erlsom_homepage = https://github.com/willemdj/erlsom
+pkg_erlsom_fetch = git
+pkg_erlsom_repo = https://github.com/willemdj/erlsom
+pkg_erlsom_commit = master
+
+PACKAGES += erlubi
+pkg_erlubi_name = erlubi
+pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
+pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
+pkg_erlubi_fetch = git
+pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
+pkg_erlubi_commit = master
+
+PACKAGES += erlvolt
+pkg_erlvolt_name = erlvolt
+pkg_erlvolt_description = VoltDB Erlang Client Driver
+pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_fetch = git
+pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
+pkg_erlvolt_commit = master
+
+PACKAGES += erlware_commons
+pkg_erlware_commons_name = erlware_commons
+pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
+pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_fetch = git
+pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
+pkg_erlware_commons_commit = master
+
+PACKAGES += erlydtl
+pkg_erlydtl_name = erlydtl
+pkg_erlydtl_description = Django Template Language for Erlang.
+pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_fetch = git
+pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
+pkg_erlydtl_commit = master
+
+PACKAGES += errd
+pkg_errd_name = errd
+pkg_errd_description = Erlang RRDTool library
+pkg_errd_homepage = https://github.com/archaelus/errd
+pkg_errd_fetch = git
+pkg_errd_repo = https://github.com/archaelus/errd
+pkg_errd_commit = master
+
+PACKAGES += erserve
+pkg_erserve_name = erserve
+pkg_erserve_description = Erlang/Rserve communication interface
+pkg_erserve_homepage = https://github.com/del/erserve
+pkg_erserve_fetch = git
+pkg_erserve_repo = https://github.com/del/erserve
+pkg_erserve_commit = master
+
+PACKAGES += erwa
+pkg_erwa_name = erwa
+pkg_erwa_description = A WAMP router and client written in Erlang.
+pkg_erwa_homepage = https://github.com/bwegh/erwa
+pkg_erwa_fetch = git
+pkg_erwa_repo = https://github.com/bwegh/erwa
+pkg_erwa_commit = master
+
+PACKAGES += espec
+pkg_espec_name = espec
+pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
+pkg_espec_homepage = https://github.com/lucaspiller/espec
+pkg_espec_fetch = git
+pkg_espec_repo = https://github.com/lucaspiller/espec
+pkg_espec_commit = master
+
+PACKAGES += estatsd
+pkg_estatsd_name = estatsd
+pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
+pkg_estatsd_homepage = https://github.com/RJ/estatsd
+pkg_estatsd_fetch = git
+pkg_estatsd_repo = https://github.com/RJ/estatsd
+pkg_estatsd_commit = master
+
+PACKAGES += etap
+pkg_etap_name = etap
+pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
+pkg_etap_homepage = https://github.com/ngerakines/etap
+pkg_etap_fetch = git
+pkg_etap_repo = https://github.com/ngerakines/etap
+pkg_etap_commit = master
+
+PACKAGES += etest_http
+pkg_etest_http_name = etest_http
+pkg_etest_http_description = etest Assertions around HTTP (client-side)
+pkg_etest_http_homepage = https://github.com/wooga/etest_http
+pkg_etest_http_fetch = git
+pkg_etest_http_repo = https://github.com/wooga/etest_http
+pkg_etest_http_commit = master
+
+PACKAGES += etest
+pkg_etest_name = etest
+pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
+pkg_etest_homepage = https://github.com/wooga/etest
+pkg_etest_fetch = git
+pkg_etest_repo = https://github.com/wooga/etest
+pkg_etest_commit = master
+
+PACKAGES += etoml
+pkg_etoml_name = etoml
+pkg_etoml_description = TOML language erlang parser
+pkg_etoml_homepage = https://github.com/kalta/etoml
+pkg_etoml_fetch = git
+pkg_etoml_repo = https://github.com/kalta/etoml
+pkg_etoml_commit = master
+
+PACKAGES += eunit_formatters
+pkg_eunit_formatters_name = eunit_formatters
+pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
+pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_fetch = git
+pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
+pkg_eunit_formatters_commit = master
+
+PACKAGES += eunit
+pkg_eunit_name = eunit
+pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
+pkg_eunit_homepage = https://github.com/richcarl/eunit
+pkg_eunit_fetch = git
+pkg_eunit_repo = https://github.com/richcarl/eunit
+pkg_eunit_commit = master
+
+PACKAGES += euthanasia
+pkg_euthanasia_name = euthanasia
+pkg_euthanasia_description = Merciful killer for your Erlang processes
+pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_fetch = git
+pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
+pkg_euthanasia_commit = master
+
+PACKAGES += evum
+pkg_evum_name = evum
+pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
+pkg_evum_homepage = https://github.com/msantos/evum
+pkg_evum_fetch = git
+pkg_evum_repo = https://github.com/msantos/evum
+pkg_evum_commit = master
+
+PACKAGES += exec
+pkg_exec_name = exec
+pkg_exec_description = Execute and control OS processes from Erlang/OTP.
+pkg_exec_homepage = http://saleyn.github.com/erlexec
+pkg_exec_fetch = git
+pkg_exec_repo = https://github.com/saleyn/erlexec
+pkg_exec_commit = master
+
+PACKAGES += exml
+pkg_exml_name = exml
+pkg_exml_description = XML parsing library in Erlang
+pkg_exml_homepage = https://github.com/paulgray/exml
+pkg_exml_fetch = git
+pkg_exml_repo = https://github.com/paulgray/exml
+pkg_exml_commit = master
+
+PACKAGES += exometer
+pkg_exometer_name = exometer
+pkg_exometer_description = Basic measurement objects and probe behavior
+pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
+pkg_exometer_fetch = git
+pkg_exometer_repo = https://github.com/Feuerlabs/exometer
+pkg_exometer_commit = master
+
+PACKAGES += exs1024
+pkg_exs1024_name = exs1024
+pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
+pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
+pkg_exs1024_fetch = git
+pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
+pkg_exs1024_commit = master
+
+PACKAGES += exs64
+pkg_exs64_name = exs64
+pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
+pkg_exs64_homepage = https://github.com/jj1bdx/exs64
+pkg_exs64_fetch = git
+pkg_exs64_repo = https://github.com/jj1bdx/exs64
+pkg_exs64_commit = master
+
+PACKAGES += exsplus116
+pkg_exsplus116_name = exsplus116
+pkg_exsplus116_description = Xorshift116plus for Erlang
+pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_fetch = git
+pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
+pkg_exsplus116_commit = master
+
+PACKAGES += exsplus128
+pkg_exsplus128_name = exsplus128
+pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
+pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_fetch = git
+pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
+pkg_exsplus128_commit = master
+
+PACKAGES += ezmq
+pkg_ezmq_name = ezmq
+pkg_ezmq_description = zMQ implemented in Erlang
+pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_fetch = git
+pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
+pkg_ezmq_commit = master
+
+PACKAGES += ezmtp
+pkg_ezmtp_name = ezmtp
+pkg_ezmtp_description = ZMTP protocol in pure Erlang.
+pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
+pkg_ezmtp_fetch = git
+pkg_ezmtp_repo = https://github.com/a13x/ezmtp
+pkg_ezmtp_commit = master
+
+PACKAGES += fast_disk_log
+pkg_fast_disk_log_name = fast_disk_log
+pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
+pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_fetch = git
+pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
+pkg_fast_disk_log_commit = master
+
+PACKAGES += feeder
+pkg_feeder_name = feeder
+pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
+pkg_feeder_homepage = https://github.com/michaelnisi/feeder
+pkg_feeder_fetch = git
+pkg_feeder_repo = https://github.com/michaelnisi/feeder
+pkg_feeder_commit = master
+
+PACKAGES += find_crate
+pkg_find_crate_name = find_crate
+pkg_find_crate_description = Find Rust libs and exes in Erlang application priv directory
+pkg_find_crate_homepage = https://github.com/goertzenator/find_crate
+pkg_find_crate_fetch = git
+pkg_find_crate_repo = https://github.com/goertzenator/find_crate
+pkg_find_crate_commit = master
+
+PACKAGES += fix
+pkg_fix_name = fix
+pkg_fix_description = http://fixprotocol.org/ implementation.
+pkg_fix_homepage = https://github.com/maxlapshin/fix
+pkg_fix_fetch = git
+pkg_fix_repo = https://github.com/maxlapshin/fix
+pkg_fix_commit = master
+
+PACKAGES += flower
+pkg_flower_name = flower
+pkg_flower_description = FlowER - a Erlang OpenFlow development platform
+pkg_flower_homepage = https://github.com/travelping/flower
+pkg_flower_fetch = git
+pkg_flower_repo = https://github.com/travelping/flower
+pkg_flower_commit = master
+
+PACKAGES += fn
+pkg_fn_name = fn
+pkg_fn_description = Function utilities for Erlang
+pkg_fn_homepage = https://github.com/reiddraper/fn
+pkg_fn_fetch = git
+pkg_fn_repo = https://github.com/reiddraper/fn
+pkg_fn_commit = master
+
+PACKAGES += folsom_cowboy
+pkg_folsom_cowboy_name = folsom_cowboy
+pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
+pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_fetch = git
+pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
+pkg_folsom_cowboy_commit = master
+
+PACKAGES += folsom
+pkg_folsom_name = folsom
+pkg_folsom_description = Expose Erlang Events and Metrics
+pkg_folsom_homepage = https://github.com/boundary/folsom
+pkg_folsom_fetch = git
+pkg_folsom_repo = https://github.com/boundary/folsom
+pkg_folsom_commit = master
+
+PACKAGES += folsomite
+pkg_folsomite_name = folsomite
+pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
+pkg_folsomite_homepage = https://github.com/campanja/folsomite
+pkg_folsomite_fetch = git
+pkg_folsomite_repo = https://github.com/campanja/folsomite
+pkg_folsomite_commit = master
+
+PACKAGES += fs
+pkg_fs_name = fs
+pkg_fs_description = Erlang FileSystem Listener
+pkg_fs_homepage = https://github.com/synrc/fs
+pkg_fs_fetch = git
+pkg_fs_repo = https://github.com/synrc/fs
+pkg_fs_commit = master
+
+PACKAGES += fuse
+pkg_fuse_name = fuse
+pkg_fuse_description = A Circuit Breaker for Erlang
+pkg_fuse_homepage = https://github.com/jlouis/fuse
+pkg_fuse_fetch = git
+pkg_fuse_repo = https://github.com/jlouis/fuse
+pkg_fuse_commit = master
+
+PACKAGES += gcm
+pkg_gcm_name = gcm
+pkg_gcm_description = An Erlang application for Google Cloud Messaging
+pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
+pkg_gcm_fetch = git
+pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
+pkg_gcm_commit = master
+
+PACKAGES += gcprof
+pkg_gcprof_name = gcprof
+pkg_gcprof_description = Garbage Collection profiler for Erlang
+pkg_gcprof_homepage = https://github.com/knutin/gcprof
+pkg_gcprof_fetch = git
+pkg_gcprof_repo = https://github.com/knutin/gcprof
+pkg_gcprof_commit = master
+
+PACKAGES += geas
+pkg_geas_name = geas
+pkg_geas_description = Guess Erlang Application Scattering
+pkg_geas_homepage = https://github.com/crownedgrouse/geas
+pkg_geas_fetch = git
+pkg_geas_repo = https://github.com/crownedgrouse/geas
+pkg_geas_commit = master
+
+PACKAGES += geef
+pkg_geef_name = geef
+pkg_geef_description = Git NEEEEF (Erlang NIF)
+pkg_geef_homepage = https://github.com/carlosmn/geef
+pkg_geef_fetch = git
+pkg_geef_repo = https://github.com/carlosmn/geef
+pkg_geef_commit = master
+
+PACKAGES += gen_coap
+pkg_gen_coap_name = gen_coap
+pkg_gen_coap_description = Generic Erlang CoAP Client/Server
+pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_fetch = git
+pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
+pkg_gen_coap_commit = master
+
+PACKAGES += gen_cycle
+pkg_gen_cycle_name = gen_cycle
+pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
+pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_fetch = git
+pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
+pkg_gen_cycle_commit = develop
+
+PACKAGES += gen_icmp
+pkg_gen_icmp_name = gen_icmp
+pkg_gen_icmp_description = Erlang interface to ICMP sockets
+pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_fetch = git
+pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
+pkg_gen_icmp_commit = master
+
+PACKAGES += gen_nb_server
+pkg_gen_nb_server_name = gen_nb_server
+pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
+pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_fetch = git
+pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
+pkg_gen_nb_server_commit = master
+
+PACKAGES += gen_paxos
+pkg_gen_paxos_name = gen_paxos
+pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
+pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_fetch = git
+pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
+pkg_gen_paxos_commit = master
+
+PACKAGES += gen_smtp
+pkg_gen_smtp_name = gen_smtp
+pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
+pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_fetch = git
+pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
+pkg_gen_smtp_commit = master
+
+PACKAGES += gen_tracker
+pkg_gen_tracker_name = gen_tracker
+pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
+pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_fetch = git
+pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
+pkg_gen_tracker_commit = master
+
+PACKAGES += gen_unix
+pkg_gen_unix_name = gen_unix
+pkg_gen_unix_description = Erlang Unix socket interface
+pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
+pkg_gen_unix_fetch = git
+pkg_gen_unix_repo = https://github.com/msantos/gen_unix
+pkg_gen_unix_commit = master
+
+PACKAGES += geode
+pkg_geode_name = geode
+pkg_geode_description = geohash/proximity lookup in pure, uncut erlang.
+pkg_geode_homepage = https://github.com/bradfordw/geode
+pkg_geode_fetch = git
+pkg_geode_repo = https://github.com/bradfordw/geode
+pkg_geode_commit = master
+
+PACKAGES += getopt
+pkg_getopt_name = getopt
+pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
+pkg_getopt_homepage = https://github.com/jcomellas/getopt
+pkg_getopt_fetch = git
+pkg_getopt_repo = https://github.com/jcomellas/getopt
+pkg_getopt_commit = master
+
+PACKAGES += gettext
+pkg_gettext_name = gettext
+pkg_gettext_description = Erlang internationalization library.
+pkg_gettext_homepage = https://github.com/etnt/gettext
+pkg_gettext_fetch = git
+pkg_gettext_repo = https://github.com/etnt/gettext
+pkg_gettext_commit = master
+
+PACKAGES += giallo
+pkg_giallo_name = giallo
+pkg_giallo_description = Small and flexible web framework on top of Cowboy
+pkg_giallo_homepage = https://github.com/kivra/giallo
+pkg_giallo_fetch = git
+pkg_giallo_repo = https://github.com/kivra/giallo
+pkg_giallo_commit = master
+
+PACKAGES += gin
+pkg_gin_name = gin
+pkg_gin_description = The guards  and  for Erlang parse_transform
+pkg_gin_homepage = https://github.com/mad-cocktail/gin
+pkg_gin_fetch = git
+pkg_gin_repo = https://github.com/mad-cocktail/gin
+pkg_gin_commit = master
+
+PACKAGES += gitty
+pkg_gitty_name = gitty
+pkg_gitty_description = Git access in erlang
+pkg_gitty_homepage = https://github.com/maxlapshin/gitty
+pkg_gitty_fetch = git
+pkg_gitty_repo = https://github.com/maxlapshin/gitty
+pkg_gitty_commit = master
+
+PACKAGES += gold_fever
+pkg_gold_fever_name = gold_fever
+pkg_gold_fever_description = A Treasure Hunt for Erlangers
+pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
+pkg_gold_fever_fetch = git
+pkg_gold_fever_repo = https://github.com/inaka/gold_fever
+pkg_gold_fever_commit = master
+
+PACKAGES += gossiperl
+pkg_gossiperl_name = gossiperl
+pkg_gossiperl_description = Gossip middleware in Erlang
+pkg_gossiperl_homepage = http://gossiperl.com/
+pkg_gossiperl_fetch = git
+pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
+pkg_gossiperl_commit = master
+
+PACKAGES += gpb
+pkg_gpb_name = gpb
+pkg_gpb_description = A Google Protobuf implementation for Erlang
+pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_fetch = git
+pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
+pkg_gpb_commit = master
+
+PACKAGES += gproc
+pkg_gproc_name = gproc
+pkg_gproc_description = Extended process registry for Erlang
+pkg_gproc_homepage = https://github.com/uwiger/gproc
+pkg_gproc_fetch = git
+pkg_gproc_repo = https://github.com/uwiger/gproc
+pkg_gproc_commit = master
+
+PACKAGES += grapherl
+pkg_grapherl_name = grapherl
+pkg_grapherl_description = Create graphs of Erlang systems and programs
+pkg_grapherl_homepage = https://github.com/eproxus/grapherl
+pkg_grapherl_fetch = git
+pkg_grapherl_repo = https://github.com/eproxus/grapherl
+pkg_grapherl_commit = master
+
+PACKAGES += gun
+pkg_gun_name = gun
+pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
+pkg_gun_homepage = http//ninenines.eu
+pkg_gun_fetch = git
+pkg_gun_repo = https://github.com/ninenines/gun
+pkg_gun_commit = master
+
+PACKAGES += gut
+pkg_gut_name = gut
+pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
+pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
+pkg_gut_fetch = git
+pkg_gut_repo = https://github.com/unbalancedparentheses/gut
+pkg_gut_commit = master
+
+PACKAGES += hackney
+pkg_hackney_name = hackney
+pkg_hackney_description = simple HTTP client in Erlang
+pkg_hackney_homepage = https://github.com/benoitc/hackney
+pkg_hackney_fetch = git
+pkg_hackney_repo = https://github.com/benoitc/hackney
+pkg_hackney_commit = master
+
+PACKAGES += hamcrest
+pkg_hamcrest_name = hamcrest
+pkg_hamcrest_description = Erlang port of Hamcrest
+pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_fetch = git
+pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
+pkg_hamcrest_commit = master
+
+PACKAGES += hanoidb
+pkg_hanoidb_name = hanoidb
+pkg_hanoidb_description = Erlang LSM BTree Storage
+pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_fetch = git
+pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
+pkg_hanoidb_commit = master
+
+PACKAGES += hottub
+pkg_hottub_name = hottub
+pkg_hottub_description = Permanent Erlang Worker Pool
+pkg_hottub_homepage = https://github.com/bfrog/hottub
+pkg_hottub_fetch = git
+pkg_hottub_repo = https://github.com/bfrog/hottub
+pkg_hottub_commit = master
+
+PACKAGES += hpack
+pkg_hpack_name = hpack
+pkg_hpack_description = HPACK Implementation for Erlang
+pkg_hpack_homepage = https://github.com/joedevivo/hpack
+pkg_hpack_fetch = git
+pkg_hpack_repo = https://github.com/joedevivo/hpack
+pkg_hpack_commit = master
+
+PACKAGES += hyper
+pkg_hyper_name = hyper
+pkg_hyper_description = Erlang implementation of HyperLogLog
+pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
+pkg_hyper_fetch = git
+pkg_hyper_repo = https://github.com/GameAnalytics/hyper
+pkg_hyper_commit = master
+
+PACKAGES += i18n
+pkg_i18n_name = i18n
+pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
+pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
+pkg_i18n_fetch = git
+pkg_i18n_repo = https://github.com/erlang-unicode/i18n
+pkg_i18n_commit = master
+
+PACKAGES += ibrowse
+pkg_ibrowse_name = ibrowse
+pkg_ibrowse_description = Erlang HTTP client
+pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_fetch = git
+pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
+pkg_ibrowse_commit = master
+
+PACKAGES += ierlang
+pkg_ierlang_name = ierlang
+pkg_ierlang_description = An Erlang language kernel for IPython.
+pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
+pkg_ierlang_fetch = git
+pkg_ierlang_repo = https://github.com/robbielynch/ierlang
+pkg_ierlang_commit = master
+
+PACKAGES += iota
+pkg_iota_name = iota
+pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
+pkg_iota_homepage = https://github.com/jpgneves/iota
+pkg_iota_fetch = git
+pkg_iota_repo = https://github.com/jpgneves/iota
+pkg_iota_commit = master
+
+PACKAGES += irc_lib
+pkg_irc_lib_name = irc_lib
+pkg_irc_lib_description = Erlang irc client library
+pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_fetch = git
+pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
+pkg_irc_lib_commit = master
+
+PACKAGES += ircd
+pkg_ircd_name = ircd
+pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
+pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
+pkg_ircd_fetch = git
+pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
+pkg_ircd_commit = master
+
+PACKAGES += iris
+pkg_iris_name = iris
+pkg_iris_description = Iris Erlang binding
+pkg_iris_homepage = https://github.com/project-iris/iris-erl
+pkg_iris_fetch = git
+pkg_iris_repo = https://github.com/project-iris/iris-erl
+pkg_iris_commit = master
+
+PACKAGES += iso8601
+pkg_iso8601_name = iso8601
+pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
+pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_fetch = git
+pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
+pkg_iso8601_commit = master
+
+PACKAGES += jamdb_sybase
+pkg_jamdb_sybase_name = jamdb_sybase
+pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
+pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_fetch = git
+pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
+pkg_jamdb_sybase_commit = master
+
+PACKAGES += jerg
+pkg_jerg_name = jerg
+pkg_jerg_description = JSON Schema to Erlang Records Generator
+pkg_jerg_homepage = https://github.com/ddossot/jerg
+pkg_jerg_fetch = git
+pkg_jerg_repo = https://github.com/ddossot/jerg
+pkg_jerg_commit = master
+
+PACKAGES += jesse
+pkg_jesse_name = jesse
+pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
+pkg_jesse_homepage = https://github.com/for-GET/jesse
+pkg_jesse_fetch = git
+pkg_jesse_repo = https://github.com/for-GET/jesse
+pkg_jesse_commit = master
+
+PACKAGES += jiffy_v
+pkg_jiffy_v_name = jiffy_v
+pkg_jiffy_v_description = JSON validation utility
+pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_fetch = git
+pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
+pkg_jiffy_v_commit = master
+
+PACKAGES += jiffy
+pkg_jiffy_name = jiffy
+pkg_jiffy_description = JSON NIFs for Erlang.
+pkg_jiffy_homepage = https://github.com/davisp/jiffy
+pkg_jiffy_fetch = git
+pkg_jiffy_repo = https://github.com/davisp/jiffy
+pkg_jiffy_commit = master
+
+PACKAGES += jobs
+pkg_jobs_name = jobs
+pkg_jobs_description = a Job scheduler for load regulation
+pkg_jobs_homepage = https://github.com/esl/jobs
+pkg_jobs_fetch = git
+pkg_jobs_repo = https://github.com/esl/jobs
+pkg_jobs_commit = master
+
+PACKAGES += joxa
+pkg_joxa_name = joxa
+pkg_joxa_description = A Modern Lisp for the Erlang VM
+pkg_joxa_homepage = https://github.com/joxa/joxa
+pkg_joxa_fetch = git
+pkg_joxa_repo = https://github.com/joxa/joxa
+pkg_joxa_commit = master
+
+PACKAGES += json_rec
+pkg_json_rec_name = json_rec
+pkg_json_rec_description = JSON to erlang record
+pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
+pkg_json_rec_fetch = git
+pkg_json_rec_repo = https://github.com/justinkirby/json_rec
+pkg_json_rec_commit = master
+
+PACKAGES += json
+pkg_json_name = json
+pkg_json_description = a high level json library for erlang (17.0+)
+pkg_json_homepage = https://github.com/talentdeficit/json
+pkg_json_fetch = git
+pkg_json_repo = https://github.com/talentdeficit/json
+pkg_json_commit = master
+
+PACKAGES += jsone
+pkg_jsone_name = jsone
+pkg_jsone_description = An Erlang library for encoding, decoding JSON data.
+pkg_jsone_homepage = https://github.com/sile/jsone.git
+pkg_jsone_fetch = git
+pkg_jsone_repo = https://github.com/sile/jsone.git
+pkg_jsone_commit = master
+
+PACKAGES += jsonerl
+pkg_jsonerl_name = jsonerl
+pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
+pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
+pkg_jsonerl_fetch = git
+pkg_jsonerl_repo = https://github.com/lambder/jsonerl
+pkg_jsonerl_commit = master
+
+PACKAGES += jsonpath
+pkg_jsonpath_name = jsonpath
+pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
+pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_fetch = git
+pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
+pkg_jsonpath_commit = master
+
+PACKAGES += jsonx
+pkg_jsonx_name = jsonx
+pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
+pkg_jsonx_homepage = https://github.com/iskra/jsonx
+pkg_jsonx_fetch = git
+pkg_jsonx_repo = https://github.com/iskra/jsonx
+pkg_jsonx_commit = master
+
+PACKAGES += jsx
+pkg_jsx_name = jsx
+pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
+pkg_jsx_homepage = https://github.com/talentdeficit/jsx
+pkg_jsx_fetch = git
+pkg_jsx_repo = https://github.com/talentdeficit/jsx
+pkg_jsx_commit = master
+
+PACKAGES += kafka_protocol
+pkg_kafka_protocol_name = kafka_protocol
+pkg_kafka_protocol_description = Kafka protocol Erlang library
+pkg_kafka_protocol_homepage = https://github.com/klarna/kafka_protocol
+pkg_kafka_protocol_fetch = git
+pkg_kafka_protocol_repo = https://github.com/klarna/kafka_protocol.git
+pkg_kafka_protocol_commit = master
+
+PACKAGES += kafka
+pkg_kafka_name = kafka
+pkg_kafka_description = Kafka consumer and producer in Erlang
+pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
+pkg_kafka_fetch = git
+pkg_kafka_repo = https://github.com/wooga/kafka-erlang
+pkg_kafka_commit = master
+
+PACKAGES += kai
+pkg_kai_name = kai
+pkg_kai_description = DHT storage by Takeshi Inoue
+pkg_kai_homepage = https://github.com/synrc/kai
+pkg_kai_fetch = git
+pkg_kai_repo = https://github.com/synrc/kai
+pkg_kai_commit = master
+
+PACKAGES += katja
+pkg_katja_name = katja
+pkg_katja_description = A simple Riemann client written in Erlang.
+pkg_katja_homepage = https://github.com/nifoc/katja
+pkg_katja_fetch = git
+pkg_katja_repo = https://github.com/nifoc/katja
+pkg_katja_commit = master
+
+PACKAGES += kdht
+pkg_kdht_name = kdht
+pkg_kdht_description = kdht is an erlang DHT implementation
+pkg_kdht_homepage = https://github.com/kevinlynx/kdht
+pkg_kdht_fetch = git
+pkg_kdht_repo = https://github.com/kevinlynx/kdht
+pkg_kdht_commit = master
+
+PACKAGES += key2value
+pkg_key2value_name = key2value
+pkg_key2value_description = Erlang 2-way map
+pkg_key2value_homepage = https://github.com/okeuday/key2value
+pkg_key2value_fetch = git
+pkg_key2value_repo = https://github.com/okeuday/key2value
+pkg_key2value_commit = master
+
+PACKAGES += keys1value
+pkg_keys1value_name = keys1value
+pkg_keys1value_description = Erlang set associative map for key lists
+pkg_keys1value_homepage = https://github.com/okeuday/keys1value
+pkg_keys1value_fetch = git
+pkg_keys1value_repo = https://github.com/okeuday/keys1value
+pkg_keys1value_commit = master
+
+PACKAGES += kinetic
+pkg_kinetic_name = kinetic
+pkg_kinetic_description = Erlang Kinesis Client
+pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
+pkg_kinetic_fetch = git
+pkg_kinetic_repo = https://github.com/AdRoll/kinetic
+pkg_kinetic_commit = master
+
+PACKAGES += kjell
+pkg_kjell_name = kjell
+pkg_kjell_description = Erlang Shell
+pkg_kjell_homepage = https://github.com/karlll/kjell
+pkg_kjell_fetch = git
+pkg_kjell_repo = https://github.com/karlll/kjell
+pkg_kjell_commit = master
+
+PACKAGES += kraken
+pkg_kraken_name = kraken
+pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
+pkg_kraken_homepage = https://github.com/Asana/kraken
+pkg_kraken_fetch = git
+pkg_kraken_repo = https://github.com/Asana/kraken
+pkg_kraken_commit = master
+
+PACKAGES += kucumberl
+pkg_kucumberl_name = kucumberl
+pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
+pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
+pkg_kucumberl_fetch = git
+pkg_kucumberl_repo = https://github.com/openshine/kucumberl
+pkg_kucumberl_commit = master
+
+PACKAGES += kvc
+pkg_kvc_name = kvc
+pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
+pkg_kvc_homepage = https://github.com/etrepum/kvc
+pkg_kvc_fetch = git
+pkg_kvc_repo = https://github.com/etrepum/kvc
+pkg_kvc_commit = master
+
+PACKAGES += kvlists
+pkg_kvlists_name = kvlists
+pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
+pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
+pkg_kvlists_fetch = git
+pkg_kvlists_repo = https://github.com/jcomellas/kvlists
+pkg_kvlists_commit = master
+
+PACKAGES += kvs
+pkg_kvs_name = kvs
+pkg_kvs_description = Container and Iterator
+pkg_kvs_homepage = https://github.com/synrc/kvs
+pkg_kvs_fetch = git
+pkg_kvs_repo = https://github.com/synrc/kvs
+pkg_kvs_commit = master
+
+PACKAGES += lager_amqp_backend
+pkg_lager_amqp_backend_name = lager_amqp_backend
+pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
+pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_fetch = git
+pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
+pkg_lager_amqp_backend_commit = master
+
+PACKAGES += lager_syslog
+pkg_lager_syslog_name = lager_syslog
+pkg_lager_syslog_description = Syslog backend for lager
+pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
+pkg_lager_syslog_fetch = git
+pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
+pkg_lager_syslog_commit = master
+
+PACKAGES += lager
+pkg_lager_name = lager
+pkg_lager_description = A logging framework for Erlang/OTP.
+pkg_lager_homepage = https://github.com/basho/lager
+pkg_lager_fetch = git
+pkg_lager_repo = https://github.com/basho/lager
+pkg_lager_commit = master
+
+PACKAGES += lambdapad
+pkg_lambdapad_name = lambdapad
+pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
+pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
+pkg_lambdapad_fetch = git
+pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
+pkg_lambdapad_commit = master
+
+PACKAGES += lasp
+pkg_lasp_name = lasp
+pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
+pkg_lasp_homepage = http://lasp-lang.org/
+pkg_lasp_fetch = git
+pkg_lasp_repo = https://github.com/lasp-lang/lasp
+pkg_lasp_commit = master
+
+PACKAGES += lasse
+pkg_lasse_name = lasse
+pkg_lasse_description = SSE handler for Cowboy
+pkg_lasse_homepage = https://github.com/inaka/lasse
+pkg_lasse_fetch = git
+pkg_lasse_repo = https://github.com/inaka/lasse
+pkg_lasse_commit = master
+
+PACKAGES += ldap
+pkg_ldap_name = ldap
+pkg_ldap_description = LDAP server written in Erlang
+pkg_ldap_homepage = https://github.com/spawnproc/ldap
+pkg_ldap_fetch = git
+pkg_ldap_repo = https://github.com/spawnproc/ldap
+pkg_ldap_commit = master
+
+PACKAGES += lethink
+pkg_lethink_name = lethink
+pkg_lethink_description = erlang driver for rethinkdb
+pkg_lethink_homepage = https://github.com/taybin/lethink
+pkg_lethink_fetch = git
+pkg_lethink_repo = https://github.com/taybin/lethink
+pkg_lethink_commit = master
+
+PACKAGES += lfe
+pkg_lfe_name = lfe
+pkg_lfe_description = Lisp Flavoured Erlang (LFE)
+pkg_lfe_homepage = https://github.com/rvirding/lfe
+pkg_lfe_fetch = git
+pkg_lfe_repo = https://github.com/rvirding/lfe
+pkg_lfe_commit = master
+
+PACKAGES += ling
+pkg_ling_name = ling
+pkg_ling_description = Erlang on Xen
+pkg_ling_homepage = https://github.com/cloudozer/ling
+pkg_ling_fetch = git
+pkg_ling_repo = https://github.com/cloudozer/ling
+pkg_ling_commit = master
+
+PACKAGES += live
+pkg_live_name = live
+pkg_live_description = Automated module and configuration reloader.
+pkg_live_homepage = http://ninenines.eu
+pkg_live_fetch = git
+pkg_live_repo = https://github.com/ninenines/live
+pkg_live_commit = master
+
+PACKAGES += lmq
+pkg_lmq_name = lmq
+pkg_lmq_description = Lightweight Message Queue
+pkg_lmq_homepage = https://github.com/iij/lmq
+pkg_lmq_fetch = git
+pkg_lmq_repo = https://github.com/iij/lmq
+pkg_lmq_commit = master
+
+PACKAGES += locker
+pkg_locker_name = locker
+pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
+pkg_locker_homepage = https://github.com/wooga/locker
+pkg_locker_fetch = git
+pkg_locker_repo = https://github.com/wooga/locker
+pkg_locker_commit = master
+
+PACKAGES += locks
+pkg_locks_name = locks
+pkg_locks_description = A scalable, deadlock-resolving resource locker
+pkg_locks_homepage = https://github.com/uwiger/locks
+pkg_locks_fetch = git
+pkg_locks_repo = https://github.com/uwiger/locks
+pkg_locks_commit = master
+
+PACKAGES += log4erl
+pkg_log4erl_name = log4erl
+pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
+pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
+pkg_log4erl_fetch = git
+pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
+pkg_log4erl_commit = master
+
+PACKAGES += lol
+pkg_lol_name = lol
+pkg_lol_description = Lisp on erLang, and programming is fun again
+pkg_lol_homepage = https://github.com/b0oh/lol
+pkg_lol_fetch = git
+pkg_lol_repo = https://github.com/b0oh/lol
+pkg_lol_commit = master
+
+PACKAGES += lucid
+pkg_lucid_name = lucid
+pkg_lucid_description = HTTP/2 server written in Erlang
+pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_fetch = git
+pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
+pkg_lucid_commit = master
+
+PACKAGES += luerl
+pkg_luerl_name = luerl
+pkg_luerl_description = Lua in Erlang
+pkg_luerl_homepage = https://github.com/rvirding/luerl
+pkg_luerl_fetch = git
+pkg_luerl_repo = https://github.com/rvirding/luerl
+pkg_luerl_commit = develop
+
+PACKAGES += luwak
+pkg_luwak_name = luwak
+pkg_luwak_description = Large-object storage interface for Riak
+pkg_luwak_homepage = https://github.com/basho/luwak
+pkg_luwak_fetch = git
+pkg_luwak_repo = https://github.com/basho/luwak
+pkg_luwak_commit = master
+
+PACKAGES += lux
+pkg_lux_name = lux
+pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
+pkg_lux_homepage = https://github.com/hawk/lux
+pkg_lux_fetch = git
+pkg_lux_repo = https://github.com/hawk/lux
+pkg_lux_commit = master
+
+PACKAGES += machi
+pkg_machi_name = machi
+pkg_machi_description = Machi file store
+pkg_machi_homepage = https://github.com/basho/machi
+pkg_machi_fetch = git
+pkg_machi_repo = https://github.com/basho/machi
+pkg_machi_commit = master
+
+PACKAGES += mad
+pkg_mad_name = mad
+pkg_mad_description = Small and Fast Rebar Replacement
+pkg_mad_homepage = https://github.com/synrc/mad
+pkg_mad_fetch = git
+pkg_mad_repo = https://github.com/synrc/mad
+pkg_mad_commit = master
+
+PACKAGES += marina
+pkg_marina_name = marina
+pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
+pkg_marina_homepage = https://github.com/lpgauth/marina
+pkg_marina_fetch = git
+pkg_marina_repo = https://github.com/lpgauth/marina
+pkg_marina_commit = master
+
+PACKAGES += mavg
+pkg_mavg_name = mavg
+pkg_mavg_description = Erlang :: Exponential moving average library
+pkg_mavg_homepage = https://github.com/EchoTeam/mavg
+pkg_mavg_fetch = git
+pkg_mavg_repo = https://github.com/EchoTeam/mavg
+pkg_mavg_commit = master
+
+PACKAGES += mc_erl
+pkg_mc_erl_name = mc_erl
+pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
+pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
+pkg_mc_erl_fetch = git
+pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
+pkg_mc_erl_commit = master
+
+PACKAGES += mcd
+pkg_mcd_name = mcd
+pkg_mcd_description = Fast memcached protocol client in pure Erlang
+pkg_mcd_homepage = https://github.com/EchoTeam/mcd
+pkg_mcd_fetch = git
+pkg_mcd_repo = https://github.com/EchoTeam/mcd
+pkg_mcd_commit = master
+
+PACKAGES += mcerlang
+pkg_mcerlang_name = mcerlang
+pkg_mcerlang_description = The McErlang model checker for Erlang
+pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
+pkg_mcerlang_fetch = git
+pkg_mcerlang_repo = https://github.com/fredlund/McErlang
+pkg_mcerlang_commit = master
+
+PACKAGES += meck
+pkg_meck_name = meck
+pkg_meck_description = A mocking library for Erlang
+pkg_meck_homepage = https://github.com/eproxus/meck
+pkg_meck_fetch = git
+pkg_meck_repo = https://github.com/eproxus/meck
+pkg_meck_commit = master
+
+PACKAGES += mekao
+pkg_mekao_name = mekao
+pkg_mekao_description = SQL constructor
+pkg_mekao_homepage = https://github.com/ddosia/mekao
+pkg_mekao_fetch = git
+pkg_mekao_repo = https://github.com/ddosia/mekao
+pkg_mekao_commit = master
+
+PACKAGES += memo
+pkg_memo_name = memo
+pkg_memo_description = Erlang memoization server
+pkg_memo_homepage = https://github.com/tuncer/memo
+pkg_memo_fetch = git
+pkg_memo_repo = https://github.com/tuncer/memo
+pkg_memo_commit = master
+
+PACKAGES += merge_index
+pkg_merge_index_name = merge_index
+pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
+pkg_merge_index_homepage = https://github.com/basho/merge_index
+pkg_merge_index_fetch = git
+pkg_merge_index_repo = https://github.com/basho/merge_index
+pkg_merge_index_commit = master
+
+PACKAGES += merl
+pkg_merl_name = merl
+pkg_merl_description = Metaprogramming in Erlang
+pkg_merl_homepage = https://github.com/richcarl/merl
+pkg_merl_fetch = git
+pkg_merl_repo = https://github.com/richcarl/merl
+pkg_merl_commit = master
+
+PACKAGES += mimerl
+pkg_mimerl_name = mimerl
+pkg_mimerl_description = library to handle mimetypes
+pkg_mimerl_homepage = https://github.com/benoitc/mimerl
+pkg_mimerl_fetch = git
+pkg_mimerl_repo = https://github.com/benoitc/mimerl
+pkg_mimerl_commit = master
+
+PACKAGES += mimetypes
+pkg_mimetypes_name = mimetypes
+pkg_mimetypes_description = Erlang MIME types library
+pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_fetch = git
+pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
+pkg_mimetypes_commit = master
+
+PACKAGES += mixer
+pkg_mixer_name = mixer
+pkg_mixer_description = Mix in functions from other modules
+pkg_mixer_homepage = https://github.com/chef/mixer
+pkg_mixer_fetch = git
+pkg_mixer_repo = https://github.com/chef/mixer
+pkg_mixer_commit = master
+
+PACKAGES += mochiweb_xpath
+pkg_mochiweb_xpath_name = mochiweb_xpath
+pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
+pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_fetch = git
+pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
+pkg_mochiweb_xpath_commit = master
+
+PACKAGES += mochiweb
+pkg_mochiweb_name = mochiweb
+pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
+pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
+pkg_mochiweb_fetch = git
+pkg_mochiweb_repo = https://github.com/mochi/mochiweb
+pkg_mochiweb_commit = master
+
+PACKAGES += mockgyver
+pkg_mockgyver_name = mockgyver
+pkg_mockgyver_description = A mocking library for Erlang
+pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
+pkg_mockgyver_fetch = git
+pkg_mockgyver_repo = https://github.com/klajo/mockgyver
+pkg_mockgyver_commit = master
+
+PACKAGES += modlib
+pkg_modlib_name = modlib
+pkg_modlib_description = Web framework based on Erlang's inets httpd
+pkg_modlib_homepage = https://github.com/gar1t/modlib
+pkg_modlib_fetch = git
+pkg_modlib_repo = https://github.com/gar1t/modlib
+pkg_modlib_commit = master
+
+PACKAGES += mongodb
+pkg_mongodb_name = mongodb
+pkg_mongodb_description = MongoDB driver for Erlang
+pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_fetch = git
+pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
+pkg_mongodb_commit = master
+
+PACKAGES += mongooseim
+pkg_mongooseim_name = mongooseim
+pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
+pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
+pkg_mongooseim_fetch = git
+pkg_mongooseim_repo = https://github.com/esl/MongooseIM
+pkg_mongooseim_commit = master
+
+PACKAGES += moyo
+pkg_moyo_name = moyo
+pkg_moyo_description = Erlang utility functions library
+pkg_moyo_homepage = https://github.com/dwango/moyo
+pkg_moyo_fetch = git
+pkg_moyo_repo = https://github.com/dwango/moyo
+pkg_moyo_commit = master
+
+PACKAGES += msgpack
+pkg_msgpack_name = msgpack
+pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
+pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_fetch = git
+pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
+pkg_msgpack_commit = master
+
+PACKAGES += mu2
+pkg_mu2_name = mu2
+pkg_mu2_description = Erlang mutation testing tool
+pkg_mu2_homepage = https://github.com/ramsay-t/mu2
+pkg_mu2_fetch = git
+pkg_mu2_repo = https://github.com/ramsay-t/mu2
+pkg_mu2_commit = master
+
+PACKAGES += mustache
+pkg_mustache_name = mustache
+pkg_mustache_description = Mustache template engine for Erlang.
+pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
+pkg_mustache_fetch = git
+pkg_mustache_repo = https://github.com/mojombo/mustache.erl
+pkg_mustache_commit = master
+
+PACKAGES += myproto
+pkg_myproto_name = myproto
+pkg_myproto_description = MySQL Server Protocol in Erlang
+pkg_myproto_homepage = https://github.com/altenwald/myproto
+pkg_myproto_fetch = git
+pkg_myproto_repo = https://github.com/altenwald/myproto
+pkg_myproto_commit = master
+
+PACKAGES += mysql
+pkg_mysql_name = mysql
+pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
+pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_fetch = git
+pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
+pkg_mysql_commit = master
+
+PACKAGES += n2o
+pkg_n2o_name = n2o
+pkg_n2o_description = WebSocket Application Server
+pkg_n2o_homepage = https://github.com/5HT/n2o
+pkg_n2o_fetch = git
+pkg_n2o_repo = https://github.com/5HT/n2o
+pkg_n2o_commit = master
+
+PACKAGES += nat_upnp
+pkg_nat_upnp_name = nat_upnp
+pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
+pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_fetch = git
+pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
+pkg_nat_upnp_commit = master
+
+PACKAGES += neo4j
+pkg_neo4j_name = neo4j
+pkg_neo4j_description = Erlang client library for Neo4J.
+pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_fetch = git
+pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
+pkg_neo4j_commit = master
+
+PACKAGES += neotoma
+pkg_neotoma_name = neotoma
+pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
+pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
+pkg_neotoma_fetch = git
+pkg_neotoma_repo = https://github.com/seancribbs/neotoma
+pkg_neotoma_commit = master
+
+PACKAGES += newrelic
+pkg_newrelic_name = newrelic
+pkg_newrelic_description = Erlang library for sending metrics to New Relic
+pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_fetch = git
+pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
+pkg_newrelic_commit = master
+
+PACKAGES += nifty
+pkg_nifty_name = nifty
+pkg_nifty_description = Erlang NIF wrapper generator
+pkg_nifty_homepage = https://github.com/parapluu/nifty
+pkg_nifty_fetch = git
+pkg_nifty_repo = https://github.com/parapluu/nifty
+pkg_nifty_commit = master
+
+PACKAGES += nitrogen_core
+pkg_nitrogen_core_name = nitrogen_core
+pkg_nitrogen_core_description = The core Nitrogen library.
+pkg_nitrogen_core_homepage = http://nitrogenproject.com/
+pkg_nitrogen_core_fetch = git
+pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
+pkg_nitrogen_core_commit = master
+
+PACKAGES += nkbase
+pkg_nkbase_name = nkbase
+pkg_nkbase_description = NkBASE distributed database
+pkg_nkbase_homepage = https://github.com/Nekso/nkbase
+pkg_nkbase_fetch = git
+pkg_nkbase_repo = https://github.com/Nekso/nkbase
+pkg_nkbase_commit = develop
+
+PACKAGES += nkdocker
+pkg_nkdocker_name = nkdocker
+pkg_nkdocker_description = Erlang Docker client
+pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
+pkg_nkdocker_fetch = git
+pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
+pkg_nkdocker_commit = master
+
+PACKAGES += nkpacket
+pkg_nkpacket_name = nkpacket
+pkg_nkpacket_description = Generic Erlang transport layer
+pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
+pkg_nkpacket_fetch = git
+pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
+pkg_nkpacket_commit = master
+
+PACKAGES += nksip
+pkg_nksip_name = nksip
+pkg_nksip_description = Erlang SIP application server
+pkg_nksip_homepage = https://github.com/kalta/nksip
+pkg_nksip_fetch = git
+pkg_nksip_repo = https://github.com/kalta/nksip
+pkg_nksip_commit = master
+
+PACKAGES += nodefinder
+pkg_nodefinder_name = nodefinder
+pkg_nodefinder_description = automatic node discovery via UDP multicast
+pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
+pkg_nodefinder_fetch = git
+pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
+pkg_nodefinder_commit = master
+
+PACKAGES += nprocreg
+pkg_nprocreg_name = nprocreg
+pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
+pkg_nprocreg_homepage = http://nitrogenproject.com/
+pkg_nprocreg_fetch = git
+pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
+pkg_nprocreg_commit = master
+
+PACKAGES += oauth
+pkg_oauth_name = oauth
+pkg_oauth_description = An Erlang OAuth 1.0 implementation
+pkg_oauth_homepage = https://github.com/tim/erlang-oauth
+pkg_oauth_fetch = git
+pkg_oauth_repo = https://github.com/tim/erlang-oauth
+pkg_oauth_commit = master
+
+PACKAGES += oauth2
+pkg_oauth2_name = oauth2
+pkg_oauth2_description = Erlang Oauth2 implementation
+pkg_oauth2_homepage = https://github.com/kivra/oauth2
+pkg_oauth2_fetch = git
+pkg_oauth2_repo = https://github.com/kivra/oauth2
+pkg_oauth2_commit = master
+
+PACKAGES += octopus
+pkg_octopus_name = octopus
+pkg_octopus_description = Small and flexible pool manager written in Erlang
+pkg_octopus_homepage = https://github.com/erlangbureau/octopus
+pkg_octopus_fetch = git
+pkg_octopus_repo = https://github.com/erlangbureau/octopus
+pkg_octopus_commit = master
+
+PACKAGES += of_protocol
+pkg_of_protocol_name = of_protocol
+pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
+pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_fetch = git
+pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
+pkg_of_protocol_commit = master
+
+PACKAGES += opencouch
+pkg_opencouch_name = couch
+pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
+pkg_opencouch_homepage = https://github.com/benoitc/opencouch
+pkg_opencouch_fetch = git
+pkg_opencouch_repo = https://github.com/benoitc/opencouch
+pkg_opencouch_commit = master
+
+PACKAGES += openflow
+pkg_openflow_name = openflow
+pkg_openflow_description = An OpenFlow controller written in pure erlang
+pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_fetch = git
+pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
+pkg_openflow_commit = master
+
+PACKAGES += openid
+pkg_openid_name = openid
+pkg_openid_description = Erlang OpenID
+pkg_openid_homepage = https://github.com/brendonh/erl_openid
+pkg_openid_fetch = git
+pkg_openid_repo = https://github.com/brendonh/erl_openid
+pkg_openid_commit = master
+
+PACKAGES += openpoker
+pkg_openpoker_name = openpoker
+pkg_openpoker_description = Genesis Texas hold'em Game Server
+pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
+pkg_openpoker_fetch = git
+pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
+pkg_openpoker_commit = master
+
+PACKAGES += pal
+pkg_pal_name = pal
+pkg_pal_description = Pragmatic Authentication Library
+pkg_pal_homepage = https://github.com/manifest/pal
+pkg_pal_fetch = git
+pkg_pal_repo = https://github.com/manifest/pal
+pkg_pal_commit = master
+
+PACKAGES += parse_trans
+pkg_parse_trans_name = parse_trans
+pkg_parse_trans_description = Parse transform utilities for Erlang
+pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
+pkg_parse_trans_fetch = git
+pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
+pkg_parse_trans_commit = master
+
+PACKAGES += parsexml
+pkg_parsexml_name = parsexml
+pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
+pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
+pkg_parsexml_fetch = git
+pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
+pkg_parsexml_commit = master
+
+PACKAGES += pegjs
+pkg_pegjs_name = pegjs
+pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
+pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
+pkg_pegjs_fetch = git
+pkg_pegjs_repo = https://github.com/dmitriid/pegjs
+pkg_pegjs_commit = master
+
+PACKAGES += percept2
+pkg_percept2_name = percept2
+pkg_percept2_description = Concurrent profiling tool for Erlang
+pkg_percept2_homepage = https://github.com/huiqing/percept2
+pkg_percept2_fetch = git
+pkg_percept2_repo = https://github.com/huiqing/percept2
+pkg_percept2_commit = master
+
+PACKAGES += pgsql
+pkg_pgsql_name = pgsql
+pkg_pgsql_description = Erlang PostgreSQL driver
+pkg_pgsql_homepage = https://github.com/semiocast/pgsql
+pkg_pgsql_fetch = git
+pkg_pgsql_repo = https://github.com/semiocast/pgsql
+pkg_pgsql_commit = master
+
+PACKAGES += pkgx
+pkg_pkgx_name = pkgx
+pkg_pkgx_description = Build .deb packages from Erlang releases
+pkg_pkgx_homepage = https://github.com/arjan/pkgx
+pkg_pkgx_fetch = git
+pkg_pkgx_repo = https://github.com/arjan/pkgx
+pkg_pkgx_commit = master
+
+PACKAGES += pkt
+pkg_pkt_name = pkt
+pkg_pkt_description = Erlang network protocol library
+pkg_pkt_homepage = https://github.com/msantos/pkt
+pkg_pkt_fetch = git
+pkg_pkt_repo = https://github.com/msantos/pkt
+pkg_pkt_commit = master
+
+PACKAGES += plain_fsm
+pkg_plain_fsm_name = plain_fsm
+pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
+pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_fetch = git
+pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
+pkg_plain_fsm_commit = master
+
+PACKAGES += plumtree
+pkg_plumtree_name = plumtree
+pkg_plumtree_description = Epidemic Broadcast Trees
+pkg_plumtree_homepage = https://github.com/helium/plumtree
+pkg_plumtree_fetch = git
+pkg_plumtree_repo = https://github.com/helium/plumtree
+pkg_plumtree_commit = master
+
+PACKAGES += pmod_transform
+pkg_pmod_transform_name = pmod_transform
+pkg_pmod_transform_description = Parse transform for parameterized modules
+pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_fetch = git
+pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
+pkg_pmod_transform_commit = master
+
+PACKAGES += pobox
+pkg_pobox_name = pobox
+pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
+pkg_pobox_homepage = https://github.com/ferd/pobox
+pkg_pobox_fetch = git
+pkg_pobox_repo = https://github.com/ferd/pobox
+pkg_pobox_commit = master
+
+PACKAGES += ponos
+pkg_ponos_name = ponos
+pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
+pkg_ponos_homepage = https://github.com/klarna/ponos
+pkg_ponos_fetch = git
+pkg_ponos_repo = https://github.com/klarna/ponos
+pkg_ponos_commit = master
+
+PACKAGES += poolboy
+pkg_poolboy_name = poolboy
+pkg_poolboy_description = A hunky Erlang worker pool factory
+pkg_poolboy_homepage = https://github.com/devinus/poolboy
+pkg_poolboy_fetch = git
+pkg_poolboy_repo = https://github.com/devinus/poolboy
+pkg_poolboy_commit = master
+
+PACKAGES += pooler
+pkg_pooler_name = pooler
+pkg_pooler_description = An OTP Process Pool Application
+pkg_pooler_homepage = https://github.com/seth/pooler
+pkg_pooler_fetch = git
+pkg_pooler_repo = https://github.com/seth/pooler
+pkg_pooler_commit = master
+
+PACKAGES += pqueue
+pkg_pqueue_name = pqueue
+pkg_pqueue_description = Erlang Priority Queues
+pkg_pqueue_homepage = https://github.com/okeuday/pqueue
+pkg_pqueue_fetch = git
+pkg_pqueue_repo = https://github.com/okeuday/pqueue
+pkg_pqueue_commit = master
+
+PACKAGES += procket
+pkg_procket_name = procket
+pkg_procket_description = Erlang interface to low level socket operations
+pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
+pkg_procket_fetch = git
+pkg_procket_repo = https://github.com/msantos/procket
+pkg_procket_commit = master
+
+PACKAGES += prop
+pkg_prop_name = prop
+pkg_prop_description = An Erlang code scaffolding and generator system.
+pkg_prop_homepage = https://github.com/nuex/prop
+pkg_prop_fetch = git
+pkg_prop_repo = https://github.com/nuex/prop
+pkg_prop_commit = master
+
+PACKAGES += proper
+pkg_proper_name = proper
+pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
+pkg_proper_homepage = http://proper.softlab.ntua.gr
+pkg_proper_fetch = git
+pkg_proper_repo = https://github.com/manopapad/proper
+pkg_proper_commit = master
+
+PACKAGES += props
+pkg_props_name = props
+pkg_props_description = Property structure library
+pkg_props_homepage = https://github.com/greyarea/props
+pkg_props_fetch = git
+pkg_props_repo = https://github.com/greyarea/props
+pkg_props_commit = master
+
+PACKAGES += protobuffs
+pkg_protobuffs_name = protobuffs
+pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
+pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_fetch = git
+pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
+pkg_protobuffs_commit = master
+
+PACKAGES += psycho
+pkg_psycho_name = psycho
+pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
+pkg_psycho_homepage = https://github.com/gar1t/psycho
+pkg_psycho_fetch = git
+pkg_psycho_repo = https://github.com/gar1t/psycho
+pkg_psycho_commit = master
+
+PACKAGES += purity
+pkg_purity_name = purity
+pkg_purity_description = A side-effect analyzer for Erlang
+pkg_purity_homepage = https://github.com/mpitid/purity
+pkg_purity_fetch = git
+pkg_purity_repo = https://github.com/mpitid/purity
+pkg_purity_commit = master
+
+PACKAGES += push_service
+pkg_push_service_name = push_service
+pkg_push_service_description = Push service
+pkg_push_service_homepage = https://github.com/hairyhum/push_service
+pkg_push_service_fetch = git
+pkg_push_service_repo = https://github.com/hairyhum/push_service
+pkg_push_service_commit = master
+
+PACKAGES += qdate
+pkg_qdate_name = qdate
+pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
+pkg_qdate_homepage = https://github.com/choptastic/qdate
+pkg_qdate_fetch = git
+pkg_qdate_repo = https://github.com/choptastic/qdate
+pkg_qdate_commit = master
+
+PACKAGES += qrcode
+pkg_qrcode_name = qrcode
+pkg_qrcode_description = QR Code encoder in Erlang
+pkg_qrcode_homepage = https://github.com/komone/qrcode
+pkg_qrcode_fetch = git
+pkg_qrcode_repo = https://github.com/komone/qrcode
+pkg_qrcode_commit = master
+
+PACKAGES += quest
+pkg_quest_name = quest
+pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
+pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
+pkg_quest_fetch = git
+pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
+pkg_quest_commit = master
+
+PACKAGES += quickrand
+pkg_quickrand_name = quickrand
+pkg_quickrand_description = Quick Erlang Random Number Generation
+pkg_quickrand_homepage = https://github.com/okeuday/quickrand
+pkg_quickrand_fetch = git
+pkg_quickrand_repo = https://github.com/okeuday/quickrand
+pkg_quickrand_commit = master
+
+PACKAGES += rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
+pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
+pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_fetch = git
+pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
+pkg_rabbit_exchange_type_riak_commit = master
+
+PACKAGES += rabbit
+pkg_rabbit_name = rabbit
+pkg_rabbit_description = RabbitMQ Server
+pkg_rabbit_homepage = https://www.rabbitmq.com/
+pkg_rabbit_fetch = git
+pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
+pkg_rabbit_commit = master
+
+PACKAGES += rack
+pkg_rack_name = rack
+pkg_rack_description = Rack handler for erlang
+pkg_rack_homepage = https://github.com/erlyvideo/rack
+pkg_rack_fetch = git
+pkg_rack_repo = https://github.com/erlyvideo/rack
+pkg_rack_commit = master
+
+PACKAGES += radierl
+pkg_radierl_name = radierl
+pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
+pkg_radierl_homepage = https://github.com/vances/radierl
+pkg_radierl_fetch = git
+pkg_radierl_repo = https://github.com/vances/radierl
+pkg_radierl_commit = master
+
+PACKAGES += rafter
+pkg_rafter_name = rafter
+pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
+pkg_rafter_homepage = https://github.com/andrewjstone/rafter
+pkg_rafter_fetch = git
+pkg_rafter_repo = https://github.com/andrewjstone/rafter
+pkg_rafter_commit = master
+
+PACKAGES += ranch
+pkg_ranch_name = ranch
+pkg_ranch_description = Socket acceptor pool for TCP protocols.
+pkg_ranch_homepage = http://ninenines.eu
+pkg_ranch_fetch = git
+pkg_ranch_repo = https://github.com/ninenines/ranch
+pkg_ranch_commit = 1.2.1
+
+PACKAGES += rbeacon
+pkg_rbeacon_name = rbeacon
+pkg_rbeacon_description = LAN discovery and presence in Erlang.
+pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
+pkg_rbeacon_fetch = git
+pkg_rbeacon_repo = https://github.com/refuge/rbeacon
+pkg_rbeacon_commit = master
+
+PACKAGES += rebar
+pkg_rebar_name = rebar
+pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
+pkg_rebar_homepage = http://www.rebar3.org
+pkg_rebar_fetch = git
+pkg_rebar_repo = https://github.com/rebar/rebar3
+pkg_rebar_commit = master
+
+PACKAGES += rebus
+pkg_rebus_name = rebus
+pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
+pkg_rebus_homepage = https://github.com/olle/rebus
+pkg_rebus_fetch = git
+pkg_rebus_repo = https://github.com/olle/rebus
+pkg_rebus_commit = master
+
+PACKAGES += rec2json
+pkg_rec2json_name = rec2json
+pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
+pkg_rec2json_homepage = https://github.com/lordnull/rec2json
+pkg_rec2json_fetch = git
+pkg_rec2json_repo = https://github.com/lordnull/rec2json
+pkg_rec2json_commit = master
+
+PACKAGES += recon
+pkg_recon_name = recon
+pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
+pkg_recon_homepage = https://github.com/ferd/recon
+pkg_recon_fetch = git
+pkg_recon_repo = https://github.com/ferd/recon
+pkg_recon_commit = master
+
+PACKAGES += record_info
+pkg_record_info_name = record_info
+pkg_record_info_description = Convert between record and proplist
+pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_fetch = git
+pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
+pkg_record_info_commit = master
+
+PACKAGES += redgrid
+pkg_redgrid_name = redgrid
+pkg_redgrid_description = automatic Erlang node discovery via redis
+pkg_redgrid_homepage = https://github.com/jkvor/redgrid
+pkg_redgrid_fetch = git
+pkg_redgrid_repo = https://github.com/jkvor/redgrid
+pkg_redgrid_commit = master
+
+PACKAGES += redo
+pkg_redo_name = redo
+pkg_redo_description = pipelined erlang redis client
+pkg_redo_homepage = https://github.com/jkvor/redo
+pkg_redo_fetch = git
+pkg_redo_repo = https://github.com/jkvor/redo
+pkg_redo_commit = master
+
+PACKAGES += reload_mk
+pkg_reload_mk_name = reload_mk
+pkg_reload_mk_description = Live reload plugin for erlang.mk.
+pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
+pkg_reload_mk_fetch = git
+pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
+pkg_reload_mk_commit = master
+
+PACKAGES += reltool_util
+pkg_reltool_util_name = reltool_util
+pkg_reltool_util_description = Erlang reltool utility functionality application
+pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
+pkg_reltool_util_fetch = git
+pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
+pkg_reltool_util_commit = master
+
+PACKAGES += relx
+pkg_relx_name = relx
+pkg_relx_description = Sane, simple release creation for Erlang
+pkg_relx_homepage = https://github.com/erlware/relx
+pkg_relx_fetch = git
+pkg_relx_repo = https://github.com/erlware/relx
+pkg_relx_commit = master
+
+PACKAGES += resource_discovery
+pkg_resource_discovery_name = resource_discovery
+pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
+pkg_resource_discovery_homepage = http://erlware.org/
+pkg_resource_discovery_fetch = git
+pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
+pkg_resource_discovery_commit = master
+
+PACKAGES += restc
+pkg_restc_name = restc
+pkg_restc_description = Erlang Rest Client
+pkg_restc_homepage = https://github.com/kivra/restclient
+pkg_restc_fetch = git
+pkg_restc_repo = https://github.com/kivra/restclient
+pkg_restc_commit = master
+
+PACKAGES += rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
+pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
+pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_fetch = git
+pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
+pkg_rfc4627_jsonrpc_commit = master
+
+PACKAGES += riak_control
+pkg_riak_control_name = riak_control
+pkg_riak_control_description = Webmachine-based administration interface for Riak.
+pkg_riak_control_homepage = https://github.com/basho/riak_control
+pkg_riak_control_fetch = git
+pkg_riak_control_repo = https://github.com/basho/riak_control
+pkg_riak_control_commit = master
+
+PACKAGES += riak_core
+pkg_riak_core_name = riak_core
+pkg_riak_core_description = Distributed systems infrastructure used by Riak.
+pkg_riak_core_homepage = https://github.com/basho/riak_core
+pkg_riak_core_fetch = git
+pkg_riak_core_repo = https://github.com/basho/riak_core
+pkg_riak_core_commit = master
+
+PACKAGES += riak_dt
+pkg_riak_dt_name = riak_dt
+pkg_riak_dt_description = Convergent replicated datatypes in Erlang
+pkg_riak_dt_homepage = https://github.com/basho/riak_dt
+pkg_riak_dt_fetch = git
+pkg_riak_dt_repo = https://github.com/basho/riak_dt
+pkg_riak_dt_commit = master
+
+PACKAGES += riak_ensemble
+pkg_riak_ensemble_name = riak_ensemble
+pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
+pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_fetch = git
+pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
+pkg_riak_ensemble_commit = master
+
+PACKAGES += riak_kv
+pkg_riak_kv_name = riak_kv
+pkg_riak_kv_description = Riak Key/Value Store
+pkg_riak_kv_homepage = https://github.com/basho/riak_kv
+pkg_riak_kv_fetch = git
+pkg_riak_kv_repo = https://github.com/basho/riak_kv
+pkg_riak_kv_commit = master
+
+PACKAGES += riak_pg
+pkg_riak_pg_name = riak_pg
+pkg_riak_pg_description = Distributed process groups with riak_core.
+pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_fetch = git
+pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
+pkg_riak_pg_commit = master
+
+PACKAGES += riak_pipe
+pkg_riak_pipe_name = riak_pipe
+pkg_riak_pipe_description = Riak Pipelines
+pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
+pkg_riak_pipe_fetch = git
+pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
+pkg_riak_pipe_commit = master
+
+PACKAGES += riak_sysmon
+pkg_riak_sysmon_name = riak_sysmon
+pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
+pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_fetch = git
+pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
+pkg_riak_sysmon_commit = master
+
+PACKAGES += riak_test
+pkg_riak_test_name = riak_test
+pkg_riak_test_description = I'm in your cluster, testing your riaks
+pkg_riak_test_homepage = https://github.com/basho/riak_test
+pkg_riak_test_fetch = git
+pkg_riak_test_repo = https://github.com/basho/riak_test
+pkg_riak_test_commit = master
+
+PACKAGES += riakc
+pkg_riakc_name = riakc
+pkg_riakc_description = Erlang clients for Riak.
+pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
+pkg_riakc_fetch = git
+pkg_riakc_repo = https://github.com/basho/riak-erlang-client
+pkg_riakc_commit = master
+
+PACKAGES += riakhttpc
+pkg_riakhttpc_name = riakhttpc
+pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
+pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_fetch = git
+pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
+pkg_riakhttpc_commit = master
+
+PACKAGES += riaknostic
+pkg_riaknostic_name = riaknostic
+pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
+pkg_riaknostic_homepage = https://github.com/basho/riaknostic
+pkg_riaknostic_fetch = git
+pkg_riaknostic_repo = https://github.com/basho/riaknostic
+pkg_riaknostic_commit = master
+
+PACKAGES += riakpool
+pkg_riakpool_name = riakpool
+pkg_riakpool_description = erlang riak client pool
+pkg_riakpool_homepage = https://github.com/dweldon/riakpool
+pkg_riakpool_fetch = git
+pkg_riakpool_repo = https://github.com/dweldon/riakpool
+pkg_riakpool_commit = master
+
+PACKAGES += rivus_cep
+pkg_rivus_cep_name = rivus_cep
+pkg_rivus_cep_description = Complex event processing in Erlang
+pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_fetch = git
+pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
+pkg_rivus_cep_commit = master
+
+PACKAGES += rlimit
+pkg_rlimit_name = rlimit
+pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
+pkg_rlimit_homepage = https://github.com/jlouis/rlimit
+pkg_rlimit_fetch = git
+pkg_rlimit_repo = https://github.com/jlouis/rlimit
+pkg_rlimit_commit = master
+
+PACKAGES += rust_mk
+pkg_rust_mk_name = rust_mk
+pkg_rust_mk_description = Build Rust crates in an Erlang application
+pkg_rust_mk_homepage = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_fetch = git
+pkg_rust_mk_repo = https://github.com/goertzenator/rust.mk
+pkg_rust_mk_commit = master
+
+PACKAGES += safetyvalve
+pkg_safetyvalve_name = safetyvalve
+pkg_safetyvalve_description = A safety valve for your erlang node
+pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_fetch = git
+pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
+pkg_safetyvalve_commit = master
+
+PACKAGES += seestar
+pkg_seestar_name = seestar
+pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
+pkg_seestar_homepage = https://github.com/iamaleksey/seestar
+pkg_seestar_fetch = git
+pkg_seestar_repo = https://github.com/iamaleksey/seestar
+pkg_seestar_commit = master
+
+PACKAGES += service
+pkg_service_name = service
+pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
+pkg_service_homepage = http://cloudi.org/
+pkg_service_fetch = git
+pkg_service_repo = https://github.com/CloudI/service
+pkg_service_commit = master
+
+PACKAGES += setup
+pkg_setup_name = setup
+pkg_setup_description = Generic setup utility for Erlang-based systems
+pkg_setup_homepage = https://github.com/uwiger/setup
+pkg_setup_fetch = git
+pkg_setup_repo = https://github.com/uwiger/setup
+pkg_setup_commit = master
+
+PACKAGES += sext
+pkg_sext_name = sext
+pkg_sext_description = Sortable Erlang Term Serialization
+pkg_sext_homepage = https://github.com/uwiger/sext
+pkg_sext_fetch = git
+pkg_sext_repo = https://github.com/uwiger/sext
+pkg_sext_commit = master
+
+PACKAGES += sfmt
+pkg_sfmt_name = sfmt
+pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
+pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_fetch = git
+pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
+pkg_sfmt_commit = master
+
+PACKAGES += sgte
+pkg_sgte_name = sgte
+pkg_sgte_description = A simple Erlang Template Engine
+pkg_sgte_homepage = https://github.com/filippo/sgte
+pkg_sgte_fetch = git
+pkg_sgte_repo = https://github.com/filippo/sgte
+pkg_sgte_commit = master
+
+PACKAGES += sheriff
+pkg_sheriff_name = sheriff
+pkg_sheriff_description = Parse transform for type based validation.
+pkg_sheriff_homepage = http://ninenines.eu
+pkg_sheriff_fetch = git
+pkg_sheriff_repo = https://github.com/extend/sheriff
+pkg_sheriff_commit = master
+
+PACKAGES += shotgun
+pkg_shotgun_name = shotgun
+pkg_shotgun_description = better than just a gun
+pkg_shotgun_homepage = https://github.com/inaka/shotgun
+pkg_shotgun_fetch = git
+pkg_shotgun_repo = https://github.com/inaka/shotgun
+pkg_shotgun_commit = master
+
+PACKAGES += sidejob
+pkg_sidejob_name = sidejob
+pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
+pkg_sidejob_homepage = https://github.com/basho/sidejob
+pkg_sidejob_fetch = git
+pkg_sidejob_repo = https://github.com/basho/sidejob
+pkg_sidejob_commit = master
+
+PACKAGES += sieve
+pkg_sieve_name = sieve
+pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
+pkg_sieve_homepage = https://github.com/benoitc/sieve
+pkg_sieve_fetch = git
+pkg_sieve_repo = https://github.com/benoitc/sieve
+pkg_sieve_commit = master
+
+PACKAGES += sighandler
+pkg_sighandler_name = sighandler
+pkg_sighandler_description = Handle UNIX signals in Er    lang
+pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
+pkg_sighandler_fetch = git
+pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
+pkg_sighandler_commit = master
+
+PACKAGES += simhash
+pkg_simhash_name = simhash
+pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
+pkg_simhash_homepage = https://github.com/ferd/simhash
+pkg_simhash_fetch = git
+pkg_simhash_repo = https://github.com/ferd/simhash
+pkg_simhash_commit = master
+
+PACKAGES += simple_bridge
+pkg_simple_bridge_name = simple_bridge
+pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
+pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_fetch = git
+pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
+pkg_simple_bridge_commit = master
+
+PACKAGES += simple_oauth2
+pkg_simple_oauth2_name = simple_oauth2
+pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
+pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_fetch = git
+pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
+pkg_simple_oauth2_commit = master
+
+PACKAGES += skel
+pkg_skel_name = skel
+pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
+pkg_skel_homepage = https://github.com/ParaPhrase/skel
+pkg_skel_fetch = git
+pkg_skel_repo = https://github.com/ParaPhrase/skel
+pkg_skel_commit = master
+
+PACKAGES += slack
+pkg_slack_name = slack
+pkg_slack_description = Minimal slack notification OTP library.
+pkg_slack_homepage = https://github.com/DonBranson/slack
+pkg_slack_fetch = git
+pkg_slack_repo = https://github.com/DonBranson/slack.git
+pkg_slack_commit = master
+
+PACKAGES += smother
+pkg_smother_name = smother
+pkg_smother_description = Extended code coverage metrics for Erlang.
+pkg_smother_homepage = https://ramsay-t.github.io/Smother/
+pkg_smother_fetch = git
+pkg_smother_repo = https://github.com/ramsay-t/Smother
+pkg_smother_commit = master
+
+PACKAGES += social
+pkg_social_name = social
+pkg_social_description = Cowboy handler for social login via OAuth2 providers
+pkg_social_homepage = https://github.com/dvv/social
+pkg_social_fetch = git
+pkg_social_repo = https://github.com/dvv/social
+pkg_social_commit = master
+
+PACKAGES += spapi_router
+pkg_spapi_router_name = spapi_router
+pkg_spapi_router_description = Partially-connected Erlang clustering
+pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
+pkg_spapi_router_fetch = git
+pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
+pkg_spapi_router_commit = master
+
+PACKAGES += sqerl
+pkg_sqerl_name = sqerl
+pkg_sqerl_description = An Erlang-flavoured SQL DSL
+pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
+pkg_sqerl_fetch = git
+pkg_sqerl_repo = https://github.com/hairyhum/sqerl
+pkg_sqerl_commit = master
+
+PACKAGES += srly
+pkg_srly_name = srly
+pkg_srly_description = Native Erlang Unix serial interface
+pkg_srly_homepage = https://github.com/msantos/srly
+pkg_srly_fetch = git
+pkg_srly_repo = https://github.com/msantos/srly
+pkg_srly_commit = master
+
+PACKAGES += sshrpc
+pkg_sshrpc_name = sshrpc
+pkg_sshrpc_description = Erlang SSH RPC module (experimental)
+pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_fetch = git
+pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
+pkg_sshrpc_commit = master
+
+PACKAGES += stable
+pkg_stable_name = stable
+pkg_stable_description = Library of assorted helpers for Cowboy web server.
+pkg_stable_homepage = https://github.com/dvv/stable
+pkg_stable_fetch = git
+pkg_stable_repo = https://github.com/dvv/stable
+pkg_stable_commit = master
+
+PACKAGES += statebox_riak
+pkg_statebox_riak_name = statebox_riak
+pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
+pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_fetch = git
+pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
+pkg_statebox_riak_commit = master
+
+PACKAGES += statebox
+pkg_statebox_name = statebox
+pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
+pkg_statebox_homepage = https://github.com/mochi/statebox
+pkg_statebox_fetch = git
+pkg_statebox_repo = https://github.com/mochi/statebox
+pkg_statebox_commit = master
+
+PACKAGES += statman
+pkg_statman_name = statman
+pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
+pkg_statman_homepage = https://github.com/knutin/statman
+pkg_statman_fetch = git
+pkg_statman_repo = https://github.com/knutin/statman
+pkg_statman_commit = master
+
+PACKAGES += statsderl
+pkg_statsderl_name = statsderl
+pkg_statsderl_description = StatsD client (erlang)
+pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
+pkg_statsderl_fetch = git
+pkg_statsderl_repo = https://github.com/lpgauth/statsderl
+pkg_statsderl_commit = master
+
+PACKAGES += stdinout_pool
+pkg_stdinout_pool_name = stdinout_pool
+pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
+pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_fetch = git
+pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
+pkg_stdinout_pool_commit = master
+
+PACKAGES += stockdb
+pkg_stockdb_name = stockdb
+pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
+pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
+pkg_stockdb_fetch = git
+pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
+pkg_stockdb_commit = master
+
+PACKAGES += stripe
+pkg_stripe_name = stripe
+pkg_stripe_description = Erlang interface to the stripe.com API
+pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
+pkg_stripe_fetch = git
+pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
+pkg_stripe_commit = v1
+
+PACKAGES += supervisor3
+pkg_supervisor3_name = supervisor3
+pkg_supervisor3_description = OTP supervisor with additional strategies
+pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
+pkg_supervisor3_fetch = git
+pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
+pkg_supervisor3_commit = master
+
+PACKAGES += surrogate
+pkg_surrogate_name = surrogate
+pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
+pkg_surrogate_homepage = https://github.com/skruger/Surrogate
+pkg_surrogate_fetch = git
+pkg_surrogate_repo = https://github.com/skruger/Surrogate
+pkg_surrogate_commit = master
+
+PACKAGES += swab
+pkg_swab_name = swab
+pkg_swab_description = General purpose buffer handling module
+pkg_swab_homepage = https://github.com/crownedgrouse/swab
+pkg_swab_fetch = git
+pkg_swab_repo = https://github.com/crownedgrouse/swab
+pkg_swab_commit = master
+
+PACKAGES += swarm
+pkg_swarm_name = swarm
+pkg_swarm_description = Fast and simple acceptor pool for Erlang
+pkg_swarm_homepage = https://github.com/jeremey/swarm
+pkg_swarm_fetch = git
+pkg_swarm_repo = https://github.com/jeremey/swarm
+pkg_swarm_commit = master
+
+PACKAGES += switchboard
+pkg_switchboard_name = switchboard
+pkg_switchboard_description = A framework for processing email using worker plugins.
+pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
+pkg_switchboard_fetch = git
+pkg_switchboard_repo = https://github.com/thusfresh/switchboard
+pkg_switchboard_commit = master
+
+PACKAGES += syn
+pkg_syn_name = syn
+pkg_syn_description = A global Process Registry and Process Group manager for Erlang.
+pkg_syn_homepage = https://github.com/ostinelli/syn
+pkg_syn_fetch = git
+pkg_syn_repo = https://github.com/ostinelli/syn
+pkg_syn_commit = master
+
+PACKAGES += sync
+pkg_sync_name = sync
+pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
+pkg_sync_homepage = https://github.com/rustyio/sync
+pkg_sync_fetch = git
+pkg_sync_repo = https://github.com/rustyio/sync
+pkg_sync_commit = master
+
+PACKAGES += syntaxerl
+pkg_syntaxerl_name = syntaxerl
+pkg_syntaxerl_description = Syntax checker for Erlang
+pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_fetch = git
+pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
+pkg_syntaxerl_commit = master
+
+PACKAGES += syslog
+pkg_syslog_name = syslog
+pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
+pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_fetch = git
+pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
+pkg_syslog_commit = master
+
+PACKAGES += taskforce
+pkg_taskforce_name = taskforce
+pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
+pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
+pkg_taskforce_fetch = git
+pkg_taskforce_repo = https://github.com/g-andrade/taskforce
+pkg_taskforce_commit = master
+
+PACKAGES += tddreloader
+pkg_tddreloader_name = tddreloader
+pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
+pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
+pkg_tddreloader_fetch = git
+pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
+pkg_tddreloader_commit = master
+
+PACKAGES += tempo
+pkg_tempo_name = tempo
+pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
+pkg_tempo_homepage = https://github.com/selectel/tempo
+pkg_tempo_fetch = git
+pkg_tempo_repo = https://github.com/selectel/tempo
+pkg_tempo_commit = master
+
+PACKAGES += ticktick
+pkg_ticktick_name = ticktick
+pkg_ticktick_description = Ticktick is an id generator for message service.
+pkg_ticktick_homepage = https://github.com/ericliang/ticktick
+pkg_ticktick_fetch = git
+pkg_ticktick_repo = https://github.com/ericliang/ticktick
+pkg_ticktick_commit = master
+
+PACKAGES += tinymq
+pkg_tinymq_name = tinymq
+pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
+pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_fetch = git
+pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
+pkg_tinymq_commit = master
+
+PACKAGES += tinymt
+pkg_tinymt_name = tinymt
+pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
+pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_fetch = git
+pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
+pkg_tinymt_commit = master
+
+PACKAGES += tirerl
+pkg_tirerl_name = tirerl
+pkg_tirerl_description = Erlang interface to Elastic Search
+pkg_tirerl_homepage = https://github.com/inaka/tirerl
+pkg_tirerl_fetch = git
+pkg_tirerl_repo = https://github.com/inaka/tirerl
+pkg_tirerl_commit = master
+
+PACKAGES += traffic_tools
+pkg_traffic_tools_name = traffic_tools
+pkg_traffic_tools_description = Simple traffic limiting library
+pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
+pkg_traffic_tools_fetch = git
+pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
+pkg_traffic_tools_commit = master
+
+PACKAGES += trails
+pkg_trails_name = trails
+pkg_trails_description = A couple of improvements over Cowboy Routes
+pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
+pkg_trails_fetch = git
+pkg_trails_repo = https://github.com/inaka/cowboy-trails
+pkg_trails_commit = master
+
+PACKAGES += trane
+pkg_trane_name = trane
+pkg_trane_description = SAX style broken HTML parser in Erlang
+pkg_trane_homepage = https://github.com/massemanet/trane
+pkg_trane_fetch = git
+pkg_trane_repo = https://github.com/massemanet/trane
+pkg_trane_commit = master
+
+PACKAGES += transit
+pkg_transit_name = transit
+pkg_transit_description = transit format for erlang
+pkg_transit_homepage = https://github.com/isaiah/transit-erlang
+pkg_transit_fetch = git
+pkg_transit_repo = https://github.com/isaiah/transit-erlang
+pkg_transit_commit = master
+
+PACKAGES += trie
+pkg_trie_name = trie
+pkg_trie_description = Erlang Trie Implementation
+pkg_trie_homepage = https://github.com/okeuday/trie
+pkg_trie_fetch = git
+pkg_trie_repo = https://github.com/okeuday/trie
+pkg_trie_commit = master
+
+PACKAGES += triq
+pkg_triq_name = triq
+pkg_triq_description = Trifork QuickCheck
+pkg_triq_homepage = https://github.com/krestenkrab/triq
+pkg_triq_fetch = git
+pkg_triq_repo = https://github.com/krestenkrab/triq
+pkg_triq_commit = master
+
+PACKAGES += tunctl
+pkg_tunctl_name = tunctl
+pkg_tunctl_description = Erlang TUN/TAP interface
+pkg_tunctl_homepage = https://github.com/msantos/tunctl
+pkg_tunctl_fetch = git
+pkg_tunctl_repo = https://github.com/msantos/tunctl
+pkg_tunctl_commit = master
+
+PACKAGES += twerl
+pkg_twerl_name = twerl
+pkg_twerl_description = Erlang client for the Twitter Streaming API
+pkg_twerl_homepage = https://github.com/lucaspiller/twerl
+pkg_twerl_fetch = git
+pkg_twerl_repo = https://github.com/lucaspiller/twerl
+pkg_twerl_commit = oauth
+
+PACKAGES += twitter_erlang
+pkg_twitter_erlang_name = twitter_erlang
+pkg_twitter_erlang_description = An Erlang twitter client
+pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_fetch = git
+pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
+pkg_twitter_erlang_commit = master
+
+PACKAGES += ucol_nif
+pkg_ucol_nif_name = ucol_nif
+pkg_ucol_nif_description = ICU based collation Erlang module
+pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_fetch = git
+pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
+pkg_ucol_nif_commit = master
+
+PACKAGES += unicorn
+pkg_unicorn_name = unicorn
+pkg_unicorn_description = Generic configuration server
+pkg_unicorn_homepage = https://github.com/shizzard/unicorn
+pkg_unicorn_fetch = git
+pkg_unicorn_repo = https://github.com/shizzard/unicorn
+pkg_unicorn_commit = master
+
+PACKAGES += unsplit
+pkg_unsplit_name = unsplit
+pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
+pkg_unsplit_homepage = https://github.com/uwiger/unsplit
+pkg_unsplit_fetch = git
+pkg_unsplit_repo = https://github.com/uwiger/unsplit
+pkg_unsplit_commit = master
+
+PACKAGES += uuid
+pkg_uuid_name = uuid
+pkg_uuid_description = Erlang UUID Implementation
+pkg_uuid_homepage = https://github.com/okeuday/uuid
+pkg_uuid_fetch = git
+pkg_uuid_repo = https://github.com/okeuday/uuid
+pkg_uuid_commit = master
+
+PACKAGES += ux
+pkg_ux_name = ux
+pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
+pkg_ux_homepage = https://github.com/erlang-unicode/ux
+pkg_ux_fetch = git
+pkg_ux_repo = https://github.com/erlang-unicode/ux
+pkg_ux_commit = master
+
+PACKAGES += vert
+pkg_vert_name = vert
+pkg_vert_description = Erlang binding to libvirt virtualization API
+pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
+pkg_vert_fetch = git
+pkg_vert_repo = https://github.com/msantos/erlang-libvirt
+pkg_vert_commit = master
+
+PACKAGES += verx
+pkg_verx_name = verx
+pkg_verx_description = Erlang implementation of the libvirtd remote protocol
+pkg_verx_homepage = https://github.com/msantos/verx
+pkg_verx_fetch = git
+pkg_verx_repo = https://github.com/msantos/verx
+pkg_verx_commit = master
+
+PACKAGES += vmq_acl
+pkg_vmq_acl_name = vmq_acl
+pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_acl_homepage = https://verne.mq/
+pkg_vmq_acl_fetch = git
+pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
+pkg_vmq_acl_commit = master
+
+PACKAGES += vmq_bridge
+pkg_vmq_bridge_name = vmq_bridge
+pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_bridge_homepage = https://verne.mq/
+pkg_vmq_bridge_fetch = git
+pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
+pkg_vmq_bridge_commit = master
+
+PACKAGES += vmq_graphite
+pkg_vmq_graphite_name = vmq_graphite
+pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_graphite_homepage = https://verne.mq/
+pkg_vmq_graphite_fetch = git
+pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
+pkg_vmq_graphite_commit = master
+
+PACKAGES += vmq_passwd
+pkg_vmq_passwd_name = vmq_passwd
+pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_passwd_homepage = https://verne.mq/
+pkg_vmq_passwd_fetch = git
+pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
+pkg_vmq_passwd_commit = master
+
+PACKAGES += vmq_server
+pkg_vmq_server_name = vmq_server
+pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_server_homepage = https://verne.mq/
+pkg_vmq_server_fetch = git
+pkg_vmq_server_repo = https://github.com/erlio/vmq_server
+pkg_vmq_server_commit = master
+
+PACKAGES += vmq_snmp
+pkg_vmq_snmp_name = vmq_snmp
+pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_snmp_homepage = https://verne.mq/
+pkg_vmq_snmp_fetch = git
+pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
+pkg_vmq_snmp_commit = master
+
+PACKAGES += vmq_systree
+pkg_vmq_systree_name = vmq_systree
+pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
+pkg_vmq_systree_homepage = https://verne.mq/
+pkg_vmq_systree_fetch = git
+pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
+pkg_vmq_systree_commit = master
+
+PACKAGES += vmstats
+pkg_vmstats_name = vmstats
+pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
+pkg_vmstats_homepage = https://github.com/ferd/vmstats
+pkg_vmstats_fetch = git
+pkg_vmstats_repo = https://github.com/ferd/vmstats
+pkg_vmstats_commit = master
+
+PACKAGES += walrus
+pkg_walrus_name = walrus
+pkg_walrus_description = Walrus - Mustache-like Templating
+pkg_walrus_homepage = https://github.com/devinus/walrus
+pkg_walrus_fetch = git
+pkg_walrus_repo = https://github.com/devinus/walrus
+pkg_walrus_commit = master
+
+PACKAGES += webmachine
+pkg_webmachine_name = webmachine
+pkg_webmachine_description = A REST-based system for building web applications.
+pkg_webmachine_homepage = https://github.com/basho/webmachine
+pkg_webmachine_fetch = git
+pkg_webmachine_repo = https://github.com/basho/webmachine
+pkg_webmachine_commit = master
+
+PACKAGES += websocket_client
+pkg_websocket_client_name = websocket_client
+pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
+pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_fetch = git
+pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
+pkg_websocket_client_commit = master
+
+PACKAGES += worker_pool
+pkg_worker_pool_name = worker_pool
+pkg_worker_pool_description = a simple erlang worker pool
+pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
+pkg_worker_pool_fetch = git
+pkg_worker_pool_repo = https://github.com/inaka/worker_pool
+pkg_worker_pool_commit = master
+
+PACKAGES += wrangler
+pkg_wrangler_name = wrangler
+pkg_wrangler_description = Import of the Wrangler svn repository.
+pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
+pkg_wrangler_fetch = git
+pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
+pkg_wrangler_commit = master
+
+PACKAGES += wsock
+pkg_wsock_name = wsock
+pkg_wsock_description = Erlang library to build WebSocket clients and servers
+pkg_wsock_homepage = https://github.com/madtrick/wsock
+pkg_wsock_fetch = git
+pkg_wsock_repo = https://github.com/madtrick/wsock
+pkg_wsock_commit = master
+
+PACKAGES += xhttpc
+pkg_xhttpc_name = xhttpc
+pkg_xhttpc_description = Extensible HTTP Client for Erlang
+pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
+pkg_xhttpc_fetch = git
+pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
+pkg_xhttpc_commit = master
+
+PACKAGES += xref_runner
+pkg_xref_runner_name = xref_runner
+pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
+pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
+pkg_xref_runner_fetch = git
+pkg_xref_runner_repo = https://github.com/inaka/xref_runner
+pkg_xref_runner_commit = master
+
+PACKAGES += yamerl
+pkg_yamerl_name = yamerl
+pkg_yamerl_description = YAML 1.2 parser in pure Erlang
+pkg_yamerl_homepage = https://github.com/yakaz/yamerl
+pkg_yamerl_fetch = git
+pkg_yamerl_repo = https://github.com/yakaz/yamerl
+pkg_yamerl_commit = master
+
+PACKAGES += yamler
+pkg_yamler_name = yamler
+pkg_yamler_description = libyaml-based yaml loader for Erlang
+pkg_yamler_homepage = https://github.com/goertzenator/yamler
+pkg_yamler_fetch = git
+pkg_yamler_repo = https://github.com/goertzenator/yamler
+pkg_yamler_commit = master
+
+PACKAGES += yaws
+pkg_yaws_name = yaws
+pkg_yaws_description = Yaws webserver
+pkg_yaws_homepage = http://yaws.hyber.org
+pkg_yaws_fetch = git
+pkg_yaws_repo = https://github.com/klacke/yaws
+pkg_yaws_commit = master
+
+PACKAGES += zab_engine
+pkg_zab_engine_name = zab_engine
+pkg_zab_engine_description = zab propotocol implement by erlang
+pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_fetch = git
+pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
+pkg_zab_engine_commit = master
+
+PACKAGES += zabbix_sender
+pkg_zabbix_sender_name = zabbix_sender
+pkg_zabbix_sender_description = Zabbix trapper for sending data to Zabbix in pure Erlang
+pkg_zabbix_sender_homepage = https://github.com/stalkermn/zabbix_sender
+pkg_zabbix_sender_fetch = git
+pkg_zabbix_sender_repo = https://github.com/stalkermn/zabbix_sender.git
+pkg_zabbix_sender_commit = master
+
+PACKAGES += zeta
+pkg_zeta_name = zeta
+pkg_zeta_description = HTTP access log parser in Erlang
+pkg_zeta_homepage = https://github.com/s1n4/zeta
+pkg_zeta_fetch = git
+pkg_zeta_repo = https://github.com/s1n4/zeta
+pkg_zeta_commit = master
+
+PACKAGES += zippers
+pkg_zippers_name = zippers
+pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
+pkg_zippers_homepage = https://github.com/ferd/zippers
+pkg_zippers_fetch = git
+pkg_zippers_repo = https://github.com/ferd/zippers
+pkg_zippers_commit = master
+
+PACKAGES += zlists
+pkg_zlists_name = zlists
+pkg_zlists_description = Erlang lazy lists library.
+pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
+pkg_zlists_fetch = git
+pkg_zlists_repo = https://github.com/vjache/erlang-zlists
+pkg_zlists_commit = master
+
+PACKAGES += zraft_lib
+pkg_zraft_lib_name = zraft_lib
+pkg_zraft_lib_description = Erlang raft consensus protocol implementation
+pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_fetch = git
+pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
+pkg_zraft_lib_commit = master
+
+PACKAGES += zucchini
+pkg_zucchini_name = zucchini
+pkg_zucchini_description = An Erlang INI parser
+pkg_zucchini_homepage = https://github.com/devinus/zucchini
+pkg_zucchini_fetch = git
+pkg_zucchini_repo = https://github.com/devinus/zucchini
+pkg_zucchini_commit = master
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: search
+
+define pkg_print
+       $(verbose) printf "%s\n" \
+               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
+               "App name:    $(pkg_$(1)_name)" \
+               "Description: $(pkg_$(1)_description)" \
+               "Home page:   $(pkg_$(1)_homepage)" \
+               "Fetch with:  $(pkg_$(1)_fetch)" \
+               "Repository:  $(pkg_$(1)_repo)" \
+               "Commit:      $(pkg_$(1)_commit)" \
+               ""
+
+endef
+
+search:
+ifdef q
+       $(foreach p,$(PACKAGES), \
+               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
+                       $(call pkg_print,$(p))))
+else
+       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-deps
+
+# Configuration.
+
+ifdef OTP_DEPS
+$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
+endif
+
+IGNORE_DEPS ?=
+export IGNORE_DEPS
+
+APPS_DIR ?= $(CURDIR)/apps
+export APPS_DIR
+
+DEPS_DIR ?= $(CURDIR)/deps
+export DEPS_DIR
+
+REBAR_DEPS_DIR = $(DEPS_DIR)
+export REBAR_DEPS_DIR
+
+dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
+dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
+       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
+dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
+
+ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
+ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
+
+ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
+ifeq ($(ERL_LIBS),)
+       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
+else
+       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
+endif
+endif
+export ERL_LIBS
+
+export NO_AUTOPATCH
+
+# Verbosity.
+
+dep_verbose_0 = @echo " DEP   " $(1);
+dep_verbose_2 = set -x;
+dep_verbose = $(dep_verbose_$(V))
+
+# Core targets.
+
+ifdef IS_APP
+apps::
+else
+apps:: $(ALL_APPS_DIRS)
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/apps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+# Create ebin directory for all apps to make sure Erlang recognizes them
+# as proper OTP applications when using -include_lib. This is a temporary
+# fix, a proper fix would be to compile apps/* in the right order.
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               mkdir -p $$dep/ebin || exit $$?; \
+       done
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/apps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/apps.log; \
+                       $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
+               fi \
+       done
+endif
+
+ifneq ($(SKIP_DEPS),)
+deps::
+else
+deps:: $(ALL_DEPS_DIRS) apps
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
+endif
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
+               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
+                       :; \
+               else \
+                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
+                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
+                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
+                       else \
+                               echo "Error: No Makefile to build dependency $$dep."; \
+                               exit 2; \
+                       fi \
+               fi \
+       done
+endif
+
+# Deps related targets.
+
+# @todo rename GNUmakefile and makefile into Makefile first, if they exist
+# While Makefile file could be GNUmakefile or makefile,
+# in practice only Makefile is needed so far.
+define dep_autopatch
+       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+               $(call dep_autopatch_erlang_mk,$(1)); \
+       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
+                       $(call dep_autopatch2,$(1)); \
+               else \
+                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
+               fi \
+       else \
+               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
+                       $(call dep_autopatch_noop,$(1)); \
+               else \
+                       $(call dep_autopatch2,$(1)); \
+               fi \
+       fi
+endef
+
+define dep_autopatch2
+       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
+               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
+       fi; \
+       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
+       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
+               $(call dep_autopatch_fetch_rebar); \
+               $(call dep_autopatch_rebar,$(1)); \
+       else \
+               $(call dep_autopatch_gen,$(1)); \
+       fi
+endef
+
+define dep_autopatch_noop
+       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+# Overwrite erlang.mk with the current file by default.
+ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
+define dep_autopatch_erlang_mk
+       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
+               > $(DEPS_DIR)/$1/erlang.mk
+endef
+else
+define dep_autopatch_erlang_mk
+       :
+endef
+endif
+
+define dep_autopatch_gen
+       printf "%s\n" \
+               "ERLC_OPTS = +debug_info" \
+               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
+endef
+
+define dep_autopatch_fetch_rebar
+       mkdir -p $(ERLANG_MK_TMP); \
+       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
+               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
+               cd $(ERLANG_MK_TMP)/rebar; \
+               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
+               $(MAKE); \
+               cd -; \
+       fi
+endef
+
+define dep_autopatch_rebar
+       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
+               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
+       fi; \
+       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
+       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
+endef
+
+define dep_autopatch_rebar.erl
+       application:load(rebar),
+       application:set_env(rebar, log_level, debug),
+       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
+               {ok, Conf0} -> Conf0;
+               _ -> []
+       end,
+       {Conf, OsEnv} = fun() ->
+               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
+                       false -> {Conf1, []};
+                       true ->
+                               Bindings0 = erl_eval:new_bindings(),
+                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
+                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
+                               Before = os:getenv(),
+                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
+                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
+               end
+       end(),
+       Write = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
+       end,
+       Escape = fun (Text) ->
+               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
+       end,
+       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
+               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
+       Write("C_SRC_DIR = /path/do/not/exist\n"),
+       Write("C_SRC_TYPE = rebar\n"),
+       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
+       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
+       fun() ->
+               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
+               case lists:keyfind(erl_opts, 1, Conf) of
+                       false -> ok;
+                       {_, ErlOpts} ->
+                               lists:foreach(fun
+                                       ({d, D}) ->
+                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                       ({i, I}) ->
+                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
+                                       ({platform_define, Regex, D}) ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
+                                                       false -> ok
+                                               end;
+                                       ({parse_transform, PT}) ->
+                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
+                                       (_) -> ok
+                               end, ErlOpts)
+               end,
+               Write("\n")
+       end(),
+       fun() ->
+               File = case lists:keyfind(deps, 1, Conf) of
+                       false -> [];
+                       {_, Deps} ->
+                               [begin case case Dep of
+                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
+                                                       {N, S} when is_tuple(S) -> {N, S};
+                                                       {N, _, S} -> {N, S};
+                                                       {N, _, S, _} -> {N, S};
+                                                       _ -> false
+                                               end of
+                                       false -> ok;
+                                       {Name, Source} ->
+                                               {Method, Repo, Commit} = case Source of
+                                                       {hex, V} -> {hex, V, undefined};
+                                                       {git, R} -> {git, R, master};
+                                                       {M, R, {branch, C}} -> {M, R, C};
+                                                       {M, R, {ref, C}} -> {M, R, C};
+                                                       {M, R, {tag, C}} -> {M, R, C};
+                                                       {M, R, C} -> {M, R, C}
+                                               end,
+                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
+                               end end || Dep <- Deps]
+               end
+       end(),
+       fun() ->
+               case lists:keyfind(erl_first_files, 1, Conf) of
+                       false -> ok;
+                       {_, Files} ->
+                               Names = [[" ", case lists:reverse(F) of
+                                       "lre." ++ Elif -> lists:reverse(Elif);
+                                       Elif -> lists:reverse(Elif)
+                               end] || "src/" ++ F <- Files],
+                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
+               end
+       end(),
+       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
+       Write("\npreprocess::\n"),
+       Write("\npre-deps::\n"),
+       Write("\npre-app::\n"),
+       PatchHook = fun(Cmd) ->
+               case Cmd of
+                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
+                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
+                       _ -> Escape(Cmd)
+               end
+       end,
+       fun() ->
+               case lists:keyfind(pre_hooks, 1, Conf) of
+                       false -> ok;
+                       {_, Hooks} ->
+                               [case H of
+                                       {'get-deps', Cmd} ->
+                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
+                                       {compile, Cmd} ->
+                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                       {Regex, compile, Cmd} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
+                                                       false -> ok
+                                               end;
+                                       _ -> ok
+                               end || H <- Hooks]
+               end
+       end(),
+       ShellToMk = fun(V) ->
+               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
+                       "-Werror\\\\b", "", [{return, list}, global])
+       end,
+       PortSpecs = fun() ->
+               case lists:keyfind(port_specs, 1, Conf) of
+                       false ->
+                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
+                                       false -> [];
+                                       true ->
+                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
+                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
+                               end;
+                       {_, Specs} ->
+                               lists:flatten([case S of
+                                       {Output, Input} -> {ShellToMk(Output), Input, []};
+                                       {Regex, Output, Input} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, []};
+                                                       false -> []
+                                               end;
+                                       {Regex, Output, Input, [{env, Env}]} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {ShellToMk(Output), Input, Env};
+                                                       false -> []
+                                               end
+                               end || S <- Specs])
+               end
+       end(),
+       PortSpecWrite = fun (Text) ->
+               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
+       end,
+       case PortSpecs of
+               [] -> ok;
+               _ ->
+                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
+                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I \\"~s/erts-~s/include\\" -I \\"~s\\"\n",
+                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
+                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L \\"~s\\" -lerl_interface -lei\n",
+                               [code:lib_dir(erl_interface, lib)])),
+                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
+                       FilterEnv = fun(Env) ->
+                               lists:flatten([case E of
+                                       {_, _} -> E;
+                                       {Regex, K, V} ->
+                                               case rebar_utils:is_arch(Regex) of
+                                                       true -> {K, V};
+                                                       false -> []
+                                               end
+                               end || E <- Env])
+                       end,
+                       MergeEnv = fun(Env) ->
+                               lists:foldl(fun ({K, V}, Acc) ->
+                                       case lists:keyfind(K, 1, Acc) of
+                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
+                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
+                                       end
+                               end, [], Env)
+                       end,
+                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
+                               false -> [];
+                               {_, PortEnv0} -> FilterEnv(PortEnv0)
+                       end,
+                       PortSpec = fun ({Output, Input0, Env}) ->
+                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
+                               Input = [[" ", I] || I <- Input0],
+                               PortSpecWrite([
+                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
+                                       case $(PLATFORM) of
+                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
+                                               _ -> ""
+                                       end,
+                                       "\n\nall:: ", Output, "\n\n",
+                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
+                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
+                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
+                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
+                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
+                                       case {filename:extension(Output), $(PLATFORM)} of
+                                           {[], _} -> "\n";
+                                           {_, darwin} -> "\n";
+                                           _ -> " -shared\n"
+                                       end])
+                       end,
+                       [PortSpec(S) || S <- PortSpecs]
+       end,
+       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
+       RunPlugin = fun(Plugin, Step) ->
+               case erlang:function_exported(Plugin, Step, 2) of
+                       false -> ok;
+                       true ->
+                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
+                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
+                                       dict:store(base_dir, "", dict:new())}, undefined),
+                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
+               end
+       end,
+       fun() ->
+               case lists:keyfind(plugins, 1, Conf) of
+                       false -> ok;
+                       {_, Plugins} ->
+                               [begin
+                                       case lists:keyfind(deps, 1, Conf) of
+                                               false -> ok;
+                                               {_, Deps} ->
+                                                       case lists:keyfind(P, 1, Deps) of
+                                                               false -> ok;
+                                                               _ ->
+                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
+                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
+                                                                       code:add_patha(Path ++ "/ebin")
+                                                       end
+                                       end
+                               end || P <- Plugins],
+                               [case code:load_file(P) of
+                                       {module, P} -> ok;
+                                       _ ->
+                                               case lists:keyfind(plugin_dir, 1, Conf) of
+                                                       false -> ok;
+                                                       {_, PluginsDir} ->
+                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
+                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
+                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
+                                               end
+                               end || P <- Plugins],
+                               [RunPlugin(P, preprocess) || P <- Plugins],
+                               [RunPlugin(P, pre_compile) || P <- Plugins],
+                               [RunPlugin(P, compile) || P <- Plugins]
+               end
+       end(),
+       halt()
+endef
+
+define dep_autopatch_app.erl
+       UpdateModules = fun(App) ->
+               case filelib:is_regular(App) of
+                       false -> ok;
+                       true ->
+                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
+                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
+                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
+                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
+                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
+               end
+       end,
+       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
+       halt()
+endef
+
+define dep_autopatch_appsrc_script.erl
+       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcScript = AppSrc ++ ".script",
+       Bindings = erl_eval:new_bindings(),
+       {ok, Conf} = file:script(AppSrcScript, Bindings),
+       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
+       halt()
+endef
+
+define dep_autopatch_appsrc.erl
+       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
+       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
+       case filelib:is_regular(AppSrcIn) of
+               false -> ok;
+               true ->
+                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
+                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
+                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
+                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
+                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
+                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
+       end,
+       halt()
+endef
+
+define dep_fetch_git
+       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_git-submodule
+       git submodule update --init -- $(DEPS_DIR)/$1;
+endef
+
+define dep_fetch_hg
+       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
+endef
+
+define dep_fetch_svn
+       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_cp
+       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
+endef
+
+define dep_fetch_hex.erl
+       ssl:start(),
+       inets:start(),
+       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
+               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
+               [], [{body_format, binary}]),
+       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
+       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
+       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
+       halt()
+endef
+
+# Hex only has a package version. No need to look in the Erlang.mk packages.
+define dep_fetch_hex
+       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
+endef
+
+define dep_fetch_fail
+       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
+       exit 78;
+endef
+
+# Kept for compatibility purposes with older Erlang.mk configuration.
+define dep_fetch_legacy
+       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
+       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
+       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
+endef
+
+define dep_fetch
+       $(if $(dep_$(1)), \
+               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
+                       $(word 1,$(dep_$(1))), \
+                       $(if $(IS_DEP),legacy,fail)), \
+               $(if $(filter $(1),$(PACKAGES)), \
+                       $(pkg_$(1)_fetch), \
+                       fail))
+endef
+
+define dep_target
+$(DEPS_DIR)/$(call dep_name,$1):
+       $(eval DEP_NAME := $(call dep_name,$1))
+       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
+       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
+               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
+               exit 17; \
+       fi
+       $(verbose) mkdir -p $(DEPS_DIR)
+       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
+       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
+                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
+               echo " AUTO  " $(1); \
+               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
+       fi
+       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
+               echo " CONF  " $(DEP_STR); \
+               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
+       fi
+ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
+       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi; \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
+                       echo " PATCH  Downloading rabbitmq-server"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
+               fi; \
+               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
+       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
+               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
+                       echo " PATCH  Downloading rabbitmq-codegen"; \
+                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
+               fi \
+       else \
+               $$(call dep_autopatch,$(DEP_NAME)) \
+       fi
+endif
+endef
+
+$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
+
+ifndef IS_APP
+clean:: clean-apps
+
+clean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
+       done
+
+distclean:: distclean-apps
+
+distclean-apps:
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
+       done
+endif
+
+ifndef SKIP_DEPS
+distclean:: distclean-deps
+
+distclean-deps:
+       $(gen_verbose) rm -rf $(DEPS_DIR)
+endif
+
+# Forward-declare variables used in core/deps-tools.mk. This is required
+# in case plugins use them.
+
+ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-deps-list.log
+ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-doc-deps-list.log
+ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-rel-deps-list.log
+ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-test-deps-list.log
+ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/recursive-shell-deps-list.log
+
+# External plugins.
+
+DEP_PLUGINS ?=
+
+define core_dep_plugin
+-include $(DEPS_DIR)/$(1)
+
+$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
+endef
+
+$(foreach p,$(DEP_PLUGINS),\
+       $(eval $(if $(findstring /,$p),\
+               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
+               $(call core_dep_plugin,$p/plugins.mk,$p))))
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Configuration.
+
+DTL_FULL_PATH ?=
+DTL_PATH ?= templates/
+DTL_SUFFIX ?= _dtl
+DTL_OPTS ?=
+
+# Verbosity.
+
+dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
+dtl_verbose = $(dtl_verbose_$(V))
+
+# Core targets.
+
+DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
+
+ifneq ($(DTL_FILES),)
+
+ifdef DTL_FULL_PATH
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
+else
+BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
+endif
+
+ifneq ($(words $(DTL_FILES)),0)
+# Rebuild templates when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(DTL_FILES); \
+       fi
+       @touch $@
+
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
+endif
+
+define erlydtl_compile.erl
+       [begin
+               Module0 = case "$(strip $(DTL_FULL_PATH))" of
+                       "" ->
+                               filename:basename(F, ".dtl");
+                       _ ->
+                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
+                               re:replace(F2, "/",  "_",  [{return, list}, global])
+               end,
+               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
+               case erlydtl:compile(F, Module, [$(DTL_OPTS)] ++ [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
+                       ok -> ok;
+                       {ok, _} -> ok
+               end
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
+       $(if $(strip $?),\
+               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
+
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Verbosity.
+
+proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
+proto_verbose = $(proto_verbose_$(V))
+
+# Core targets.
+
+define compile_proto
+       $(verbose) mkdir -p ebin/ include/
+       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
+       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
+       $(verbose) rm ebin/*.erl
+endef
+
+define compile_proto.erl
+       [begin
+               Dir = filename:dirname(filename:dirname(F)),
+               protobuffs_compile:generate_source(F,
+                       [{output_include_dir, Dir ++ "/include"},
+                               {output_src_dir, Dir ++ "/ebin"}])
+       end || F <- string:tokens("$(1)", " ")],
+       halt().
+endef
+
+ifneq ($(wildcard src/),)
+ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
+       $(if $(strip $?),$(call compile_proto,$?))
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-app
+
+# Configuration.
+
+ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
+       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
+COMPILE_FIRST ?=
+COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
+ERLC_EXCLUDE ?=
+ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
+
+ERLC_MIB_OPTS ?=
+COMPILE_MIB_FIRST ?=
+COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
+
+# Verbosity.
+
+app_verbose_0 = @echo " APP   " $(PROJECT);
+app_verbose_2 = set -x;
+app_verbose = $(app_verbose_$(V))
+
+appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
+appsrc_verbose_2 = set -x;
+appsrc_verbose = $(appsrc_verbose_$(V))
+
+makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
+makedep_verbose_2 = set -x;
+makedep_verbose = $(makedep_verbose_$(V))
+
+erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
+       $(filter %.erl %.core,$(?F)));
+erlc_verbose_2 = set -x;
+erlc_verbose = $(erlc_verbose_$(V))
+
+xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
+xyrl_verbose_2 = set -x;
+xyrl_verbose = $(xyrl_verbose_$(V))
+
+asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
+asn1_verbose_2 = set -x;
+asn1_verbose = $(asn1_verbose_$(V))
+
+mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
+mib_verbose_2 = set -x;
+mib_verbose = $(mib_verbose_$(V))
+
+ifneq ($(wildcard src/),)
+
+# Targets.
+
+ifeq ($(wildcard ebin/test),)
+app:: deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+else
+app:: clean deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build
+endif
+
+ifeq ($(wildcard src/$(PROJECT_MOD).erl),)
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, []},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
+]}.
+endef
+else
+define app_file
+{application, $(PROJECT), [
+       {description, "$(PROJECT_DESCRIPTION)"},
+       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
+       {id$(comma)$(space)"$(1)"}$(comma))
+       {modules, [$(call comma_list,$(2))]},
+       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
+       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
+       {mod, {$(PROJECT_MOD), []}}
+]}.
+endef
+endif
+
+app-build: ebin/$(PROJECT).app
+       $(verbose) :
+
+# Source files.
+
+ERL_FILES = $(sort $(call core_find,src/,*.erl))
+CORE_FILES = $(sort $(call core_find,src/,*.core))
+
+# ASN.1 files.
+
+ifneq ($(wildcard asn1/),)
+ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
+ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+define compile_asn1
+       $(verbose) mkdir -p include/
+       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
+       $(verbose) mv asn1/*.erl src/
+       $(verbose) mv asn1/*.hrl include/
+       $(verbose) mv asn1/*.asn1db include/
+endef
+
+$(PROJECT).d:: $(ASN1_FILES)
+       $(if $(strip $?),$(call compile_asn1,$?))
+endif
+
+# SNMP MIB files.
+
+ifneq ($(wildcard mibs/),)
+MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
+
+$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
+       $(verbose) mkdir -p include/ priv/mibs/
+       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
+       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
+endif
+
+# Leex and Yecc files.
+
+XRL_FILES = $(sort $(call core_find,src/,*.xrl))
+XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
+ERL_FILES += $(XRL_ERL_FILES)
+
+YRL_FILES = $(sort $(call core_find,src/,*.yrl))
+YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
+ERL_FILES += $(YRL_ERL_FILES)
+
+$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
+       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
+
+# Erlang and Core Erlang files.
+
+define makedep.erl
+       E = ets:new(makedep, [bag]),
+       G = digraph:new([acyclic]),
+       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
+       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
+       Add = fun (Mod, Dep) ->
+               case lists:keyfind(Dep, 1, Modules) of
+                       false -> ok;
+                       {_, DepFile} ->
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile}),
+                               digraph:add_vertex(G, Mod),
+                               digraph:add_vertex(G, Dep),
+                               digraph:add_edge(G, Mod, Dep)
+               end
+       end,
+       AddHd = fun (F, Mod, DepFile) ->
+               case file:open(DepFile, [read]) of
+                       {error, enoent} -> ok;
+                       {ok, Fd} ->
+                               F(F, Fd, Mod),
+                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
+                               ets:insert(E, {ModFile, DepFile})
+               end
+       end,
+       Attr = fun
+               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
+               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
+               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
+               (F, Mod, compile, Opts) when is_list(Opts) ->
+                       case proplists:get_value(parse_transform, Opts) of
+                               undefined -> ok;
+                               Dep -> Add(Mod, Dep)
+                       end;
+               (F, Mod, include, Hrl) ->
+                       case filelib:is_file("include/" ++ Hrl) of
+                               true -> AddHd(F, Mod, "include/" ++ Hrl);
+                               false ->
+                                       case filelib:is_file("src/" ++ Hrl) of
+                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
+                                               false -> false
+                                       end
+                       end;
+               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
+               (F, Mod, import, {Imp, _}) ->
+                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
+                               false -> ok;
+                               true -> Add(Mod, Imp)
+                       end;
+               (_, _, _, _) -> ok
+       end,
+       MakeDepend = fun(F, Fd, Mod) ->
+               case io:parse_erl_form(Fd, undefined) of
+                       {ok, {attribute, _, Key, Value}, _} ->
+                               Attr(F, Mod, Key, Value),
+                               F(F, Fd, Mod);
+                       {eof, _} ->
+                               file:close(Fd);
+                       _ ->
+                               F(F, Fd, Mod)
+               end
+       end,
+       [begin
+               Mod = list_to_atom(filename:basename(F, ".erl")),
+               {ok, Fd} = file:open(F, [read]),
+               MakeDepend(MakeDepend, Fd, Mod)
+       end || F <- ErlFiles],
+       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
+       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
+       ok = file:write_file("$(1)", [
+               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
+               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
+       ]),
+       halt()
+endef
+
+ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
+$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
+       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
+endif
+
+ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
+# Rebuild everything when the Makefile changes.
+$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
+       @mkdir -p $(ERLANG_MK_TMP)
+       @if test -f $@; then \
+               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
+               touch -c $(PROJECT).d; \
+       fi
+       @touch $@
+
+$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
+ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
+endif
+
+-include $(PROJECT).d
+
+ebin/$(PROJECT).app:: ebin/
+
+ebin/:
+       $(verbose) mkdir -p ebin/
+
+define compile_erl
+       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
+               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
+endef
+
+ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
+       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
+       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
+       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
+               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
+ifeq ($(wildcard src/$(PROJECT).app.src),)
+       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
+               > ebin/$(PROJECT).app
+else
+       $(verbose) if [ -z "$$(grep -e '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
+               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
+               exit 1; \
+       fi
+       $(appsrc_verbose) cat src/$(PROJECT).app.src \
+               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
+               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(subst /,\/,$(GITDESCRIBE))\"}/" \
+               > ebin/$(PROJECT).app
+endif
+
+clean:: clean-app
+
+clean-app:
+       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
+               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
+               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
+               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
+
+endif
+
+# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: docs-deps
+
+# Configuration.
+
+ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
+
+# Targets.
+
+$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+doc-deps:
+else
+doc-deps: $(ALL_DOC_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rel-deps
+
+# Configuration.
+
+ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
+
+# Targets.
+
+$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+rel-deps:
+else
+rel-deps: $(ALL_REL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= $(CURDIR)/test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+ifneq ($(SKIP_DEPS),)
+test-deps:
+else
+test-deps: $(ALL_TEST_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
+endif
+
+ifneq ($(wildcard $(TEST_DIR)),)
+test-dir:
+       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard src),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps
+       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+else
+ifeq ($(wildcard ebin/test),)
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: clean deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+       $(gen_verbose) touch ebin/test
+else
+test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build:: deps test-deps $(PROJECT).d
+       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: rebar.config
+
+# We strip out -Werror because we don't want to fail due to
+# warnings when used as a dependency.
+
+compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/g')
+
+define compat_convert_erlc_opts
+$(if $(filter-out -Werror,$1),\
+       $(if $(findstring +,$1),\
+               $(shell echo $1 | cut -b 2-)))
+endef
+
+define compat_erlc_opts_to_list
+[$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
+endef
+
+define compat_rebar_config
+{deps, [
+$(call comma_list,$(foreach d,$(DEPS),\
+       $(if $(filter hex,$(call dep_fetch,$d)),\
+               {$(call dep_name,$d)$(comma)"$(call dep_repo,$d)"},\
+               {$(call dep_name,$d)$(comma)".*"$(comma){git,"$(call dep_repo,$d)"$(comma)"$(call dep_commit,$d)"}})))
+]}.
+{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
+endef
+
+$(eval _compat_rebar_config = $$(compat_rebar_config))
+$(eval export _compat_rebar_config)
+
+rebar.config:
+       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
+
+MAN_INSTALL_PATH ?= /usr/local/share/man
+MAN_SECTIONS ?= 3 7
+
+docs:: asciidoc
+
+asciidoc: asciidoc-guide asciidoc-manual
+
+ifeq ($(wildcard doc/src/guide/book.asciidoc),)
+asciidoc-guide:
+else
+asciidoc-guide: distclean-asciidoc doc-deps
+       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
+       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
+endif
+
+ifeq ($(wildcard doc/src/manual/*.asciidoc),)
+asciidoc-manual:
+else
+asciidoc-manual: distclean-asciidoc doc-deps
+       for f in doc/src/manual/*.asciidoc ; do \
+               a2x -v -f manpage $$f ; \
+       done
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p doc/man$$s/ ; \
+               mv doc/src/manual/*.$$s doc/man$$s/ ; \
+               gzip doc/man$$s/*.$$s ; \
+       done
+
+install-docs:: install-asciidoc
+
+install-asciidoc: asciidoc-manual
+       for s in $(MAN_SECTIONS); do \
+               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
+               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
+       done
+endif
+
+distclean:: distclean-asciidoc
+
+distclean-asciidoc:
+       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Bootstrap targets:" \
+               "  bootstrap          Generate a skeleton of an OTP application" \
+               "  bootstrap-lib      Generate a skeleton of an OTP library" \
+               "  bootstrap-rel      Generate the files needed to build a release" \
+               "  new-app in=NAME    Create a new local OTP application NAME" \
+               "  new-lib in=NAME    Create a new local OTP library NAME" \
+               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
+               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
+               "  list-templates     List available templates"
+
+# Bootstrap templates.
+
+define bs_appsrc
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]},
+       {mod, {$p_app, []}},
+       {env, []}
+]}.
+endef
+
+define bs_appsrc_lib
+{application, $p, [
+       {description, ""},
+       {vsn, "0.1.0"},
+       {id, "git"},
+       {modules, []},
+       {registered, []},
+       {applications, [
+               kernel,
+               stdlib
+       ]}
+]}.
+endef
+
+# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
+# separately during the actual bootstrap.
+ifdef SP
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+# Whitespace to be used when creating files from templates.
+SP = $(SP)
+
+endef
+else
+define bs_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+endef
+endif
+
+define bs_apps_Makefile
+PROJECT = $p
+PROJECT_DESCRIPTION = New project
+PROJECT_VERSION = 0.0.1
+
+include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
+endef
+
+define bs_app
+-module($p_app).
+-behaviour(application).
+
+-export([start/2]).
+-export([stop/1]).
+
+start(_Type, _Args) ->
+       $p_sup:start_link().
+
+stop(_State) ->
+       ok.
+endef
+
+define bs_relx_config
+{release, {$p_release, "1"}, [$p]}.
+{extended_start_script, true}.
+{sys_config, "rel/sys.config"}.
+{vm_args, "rel/vm.args"}.
+endef
+
+define bs_sys_config
+[
+].
+endef
+
+define bs_vm_args
+-name $p@127.0.0.1
+-setcookie $p
+-heart
+endef
+
+# Normal templates.
+
+define tpl_supervisor
+-module($(n)).
+-behaviour(supervisor).
+
+-export([start_link/0]).
+-export([init/1]).
+
+start_link() ->
+       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+       Procs = [],
+       {ok, {{one_for_one, 1, 5}, Procs}}.
+endef
+
+define tpl_gen_server
+-module($(n)).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_server.
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_info/2]).
+-export([terminate/2]).
+-export([code_change/3]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_server:start_link(?MODULE, [], []).
+
+%% gen_server.
+
+init([]) ->
+       {ok, #state{}}.
+
+handle_call(_Request, _From, State) ->
+       {reply, ignored, State}.
+
+handle_cast(_Msg, State) ->
+       {noreply, State}.
+
+handle_info(_Info, State) ->
+       {noreply, State}.
+
+terminate(_Reason, _State) ->
+       ok.
+
+code_change(_OldVsn, State, _Extra) ->
+       {ok, State}.
+endef
+
+define tpl_module
+-module($(n)).
+-export([]).
+endef
+
+define tpl_cowboy_http
+-module($(n)).
+-behaviour(cowboy_http_handler).
+
+-export([init/3]).
+-export([handle/2]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {ok, Req, #state{}}.
+
+handle(Req, State=#state{}) ->
+       {ok, Req2} = cowboy_req:reply(200, Req),
+       {ok, Req2, State}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_gen_fsm
+-module($(n)).
+-behaviour(gen_fsm).
+
+%% API.
+-export([start_link/0]).
+
+%% gen_fsm.
+-export([init/1]).
+-export([state_name/2]).
+-export([handle_event/3]).
+-export([state_name/3]).
+-export([handle_sync_event/4]).
+-export([handle_info/3]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+-record(state, {
+}).
+
+%% API.
+
+-spec start_link() -> {ok, pid()}.
+start_link() ->
+       gen_fsm:start_link(?MODULE, [], []).
+
+%% gen_fsm.
+
+init([]) ->
+       {ok, state_name, #state{}}.
+
+state_name(_Event, StateData) ->
+       {next_state, state_name, StateData}.
+
+handle_event(_Event, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+state_name(_Event, _From, StateData) ->
+       {reply, ignored, state_name, StateData}.
+
+handle_sync_event(_Event, _From, StateName, StateData) ->
+       {reply, ignored, StateName, StateData}.
+
+handle_info(_Info, StateName, StateData) ->
+       {next_state, StateName, StateData}.
+
+terminate(_Reason, _StateName, _StateData) ->
+       ok.
+
+code_change(_OldVsn, StateName, StateData, _Extra) ->
+       {ok, StateName, StateData}.
+endef
+
+define tpl_cowboy_loop
+-module($(n)).
+-behaviour(cowboy_loop_handler).
+
+-export([init/3]).
+-export([info/3]).
+-export([terminate/3]).
+
+-record(state, {
+}).
+
+init(_, Req, _Opts) ->
+       {loop, Req, #state{}, 5000, hibernate}.
+
+info(_Info, Req, State) ->
+       {loop, Req, State, hibernate}.
+
+terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_cowboy_rest
+-module($(n)).
+
+-export([init/3]).
+-export([content_types_provided/2]).
+-export([get_html/2]).
+
+init(_, _Req, _Opts) ->
+       {upgrade, protocol, cowboy_rest}.
+
+content_types_provided(Req, State) ->
+       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
+
+get_html(Req, State) ->
+       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
+endef
+
+define tpl_cowboy_ws
+-module($(n)).
+-behaviour(cowboy_websocket_handler).
+
+-export([init/3]).
+-export([websocket_init/3]).
+-export([websocket_handle/3]).
+-export([websocket_info/3]).
+-export([websocket_terminate/3]).
+
+-record(state, {
+}).
+
+init(_, _, _) ->
+       {upgrade, protocol, cowboy_websocket}.
+
+websocket_init(_, Req, _Opts) ->
+       Req2 = cowboy_req:compact(Req),
+       {ok, Req2, #state{}}.
+
+websocket_handle({text, Data}, Req, State) ->
+       {reply, {text, Data}, Req, State};
+websocket_handle({binary, Data}, Req, State) ->
+       {reply, {binary, Data}, Req, State};
+websocket_handle(_Frame, Req, State) ->
+       {ok, Req, State}.
+
+websocket_info(_Info, Req, State) ->
+       {ok, Req, State}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+       ok.
+endef
+
+define tpl_ranch_protocol
+-module($(n)).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+-type opts() :: [].
+-export_type([opts/0]).
+
+-record(state, {
+       socket :: inet:socket(),
+       transport :: module()
+}).
+
+start_link(Ref, Socket, Transport, Opts) ->
+       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+       {ok, Pid}.
+
+-spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
+init(Ref, Socket, Transport, _Opts) ->
+       ok = ranch:accept_ack(Ref),
+       loop(#state{socket=Socket, transport=Transport}).
+
+loop(State) ->
+       loop(State).
+endef
+
+# Plugin-specific targets.
+
+define render_template
+       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
+endef
+
+ifndef WS
+ifdef SP
+WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
+else
+WS = $(tab)
+endif
+endif
+
+bootstrap:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(eval n := $(PROJECT)_sup)
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
+endif
+       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
+       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
+
+bootstrap-lib:
+ifneq ($(wildcard src/),)
+       $(error Error: src/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_Makefile,Makefile)
+       $(verbose) echo "include erlang.mk" >> Makefile
+       $(verbose) mkdir src/
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
+endif
+
+bootstrap-rel:
+ifneq ($(wildcard relx.config),)
+       $(error Error: relx.config already exists)
+endif
+ifneq ($(wildcard rel/),)
+       $(error Error: rel/ directory already exists)
+endif
+       $(eval p := $(PROJECT))
+       $(call render_template,bs_relx_config,relx.config)
+       $(verbose) mkdir rel/
+       $(call render_template,bs_sys_config,rel/sys.config)
+       $(call render_template,bs_vm_args,rel/vm.args)
+
+new-app:
+ifndef in
+       $(error Usage: $(MAKE) new-app in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(eval n := $(in)_sup)
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
+       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
+
+new-lib:
+ifndef in
+       $(error Usage: $(MAKE) new-lib in=APP)
+endif
+ifneq ($(wildcard $(APPS_DIR)/$in),)
+       $(error Error: Application $in already exists)
+endif
+       $(eval p := $(in))
+       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
+       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
+ifdef LEGACY
+       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
+endif
+
+new:
+ifeq ($(wildcard src/)$(in),)
+       $(error Error: src/ directory does not exist)
+endif
+ifndef t
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifndef tpl_$(t)
+       $(error Unknown template)
+endif
+ifndef n
+       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
+else
+       $(call render_template,tpl_$(t),src/$(n).erl)
+endif
+
+list-templates:
+       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
+
+# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: clean-c_src distclean-c_src-env
+
+# Configuration.
+
+C_SRC_DIR ?= $(CURDIR)/c_src
+C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
+C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
+C_SRC_TYPE ?= shared
+
+# System type and C compiler/flags.
+
+ifeq ($(PLATFORM),msys2)
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
+else
+       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
+       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
+endif
+
+ifeq ($(C_SRC_TYPE),shared)
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
+else
+       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
+endif
+
+ifeq ($(PLATFORM),msys2)
+# We hardcode the compiler used on MSYS2. The default CC=cc does
+# not produce working code. The "gcc" MSYS2 package also doesn't.
+       CC = /mingw64/bin/gcc
+       export CC
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),darwin)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
+       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
+else ifeq ($(PLATFORM),freebsd)
+       CC ?= cc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+else ifeq ($(PLATFORM),linux)
+       CC ?= gcc
+       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
+       CXXFLAGS ?= -O3 -finline-functions -Wall
+endif
+
+ifneq ($(PLATFORM),msys2)
+       CFLAGS += -fPIC
+       CXXFLAGS += -fPIC
+endif
+
+CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
+
+LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
+
+# Verbosity.
+
+c_verbose_0 = @echo " C     " $(?F);
+c_verbose = $(c_verbose_$(V))
+
+cpp_verbose_0 = @echo " CPP   " $(?F);
+cpp_verbose = $(cpp_verbose_$(V))
+
+link_verbose_0 = @echo " LD    " $(@F);
+link_verbose = $(link_verbose_$(V))
+
+# Targets.
+
+ifeq ($(wildcard $(C_SRC_DIR)),)
+else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
+app:: app-c_src
+
+test-build:: app-c_src
+
+app-c_src:
+       $(MAKE) -C $(C_SRC_DIR)
+
+clean::
+       $(MAKE) -C $(C_SRC_DIR) clean
+
+else
+
+ifeq ($(SOURCES),)
+SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
+endif
+OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+
+COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
+COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
+
+app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
+
+$(C_SRC_OUTPUT_FILE): $(OBJECTS)
+       $(verbose) mkdir -p priv/
+       $(link_verbose) $(CC) $(OBJECTS) \
+               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
+               -o $(C_SRC_OUTPUT_FILE)
+
+%.o: %.c
+       $(COMPILE_C) $(OUTPUT_OPTION) $<
+
+%.o: %.cc
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.C
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+%.o: %.cpp
+       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
+
+clean:: clean-c_src
+
+clean-c_src:
+       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
+
+endif
+
+ifneq ($(wildcard $(C_SRC_DIR)),)
+$(C_SRC_ENV):
+       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
+               io_lib:format( \
+                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
+                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
+                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
+                       [code:root_dir(), erlang:system_info(version), \
+                       code:lib_dir(erl_interface, include), \
+                       code:lib_dir(erl_interface, lib)])), \
+               halt()."
+
+distclean:: distclean-c_src-env
+
+distclean-c_src-env:
+       $(gen_verbose) rm -f $(C_SRC_ENV)
+
+-include $(C_SRC_ENV)
+endif
+
+# Templates.
+
+define bs_c_nif
+#include "erl_nif.h"
+
+static int loads = 0;
+
+static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
+{
+       /* Initialize private data. */
+       *priv_data = NULL;
+
+       loads++;
+
+       return 0;
+}
+
+static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
+{
+       /* Convert the private data to the new version. */
+       *priv_data = *old_priv_data;
+
+       loads++;
+
+       return 0;
+}
+
+static void unload(ErlNifEnv* env, void* priv_data)
+{
+       if (loads == 1) {
+               /* Destroy the private data. */
+       }
+
+       loads--;
+}
+
+static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+       if (enif_is_atom(env, argv[0])) {
+               return enif_make_tuple2(env,
+                       enif_make_atom(env, "hello"),
+                       argv[0]);
+       }
+
+       return enif_make_tuple2(env,
+               enif_make_atom(env, "error"),
+               enif_make_atom(env, "badarg"));
+}
+
+static ErlNifFunc nif_funcs[] = {
+       {"hello", 1, hello}
+};
+
+ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
+endef
+
+define bs_erl_nif
+-module($n).
+
+-export([hello/1]).
+
+-on_load(on_load/0).
+on_load() ->
+       PrivDir = case code:priv_dir(?MODULE) of
+               {error, _} ->
+                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
+                       filename:join(AppPath, "priv");
+               Path ->
+                       Path
+       end,
+       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
+
+hello(_) ->
+       erlang:nif_error({not_loaded, ?MODULE}).
+endef
+
+new-nif:
+ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
+       $(error Error: $(C_SRC_DIR)/$n.c already exists)
+endif
+ifneq ($(wildcard src/$n.erl),)
+       $(error Error: src/$n.erl already exists)
+endif
+ifdef in
+       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
+else
+       $(verbose) mkdir -p $(C_SRC_DIR) src/
+       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
+       $(call render_template,bs_erl_nif,src/$n.erl)
+endif
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ci ci-setup distclean-kerl
+
+KERL ?= $(CURDIR)/kerl
+export KERL
+
+KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
+
+OTP_GIT ?= https://github.com/erlang/otp
+
+CI_INSTALL_DIR ?= $(HOME)/erlang
+CI_OTP ?=
+
+ifeq ($(strip $(CI_OTP)),)
+ci::
+else
+ci:: $(addprefix ci-,$(CI_OTP))
+
+ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
+
+ci-setup::
+
+ci_verbose_0 = @echo " CI    " $(1);
+ci_verbose = $(ci_verbose_$(V))
+
+define ci_target
+ci-$(1): $(CI_INSTALL_DIR)/$(1)
+       $(ci_verbose) \
+               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
+               CI_OTP_RELEASE="$(1)" \
+               CT_OPTS="-label $(1)" \
+               $(MAKE) clean ci-setup tests
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
+
+define ci_otp_target
+ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
+$(CI_INSTALL_DIR)/$(1): $(KERL)
+       $(KERL) build git $(OTP_GIT) $(1) $(1)
+       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
+endif
+endef
+
+$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
+
+$(KERL):
+       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
+       $(verbose) chmod +x $(KERL)
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Continuous Integration targets:" \
+               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
+               "" \
+               "The CI_OTP variable must be defined with the Erlang versions" \
+               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
+
+distclean:: distclean-kerl
+
+distclean-kerl:
+       $(gen_verbose) rm -rf $(KERL)
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: ct apps-ct distclean-ct
+
+# Configuration.
+
+CT_OPTS ?=
+ifneq ($(wildcard $(TEST_DIR)),)
+       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
+else
+       CT_SUITES ?=
+endif
+
+# Core targets.
+
+tests:: ct
+
+distclean:: distclean-ct
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Common_test targets:" \
+               "  ct          Run all the common_test suites for this project" \
+               "" \
+               "All your common_test suites have their associated targets." \
+               "A suite named http_SUITE can be ran using the ct-http target."
+
+# Plugin-specific targets.
+
+CT_RUN = ct_run \
+       -no_auto_compile \
+       -noinput \
+       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(TEST_DIR) \
+       -dir $(TEST_DIR) \
+       -logdir $(CURDIR)/logs
+
+ifeq ($(CT_SUITES),)
+ct: $(if $(IS_APP),,apps-ct)
+else
+ct: test-build $(if $(IS_APP),,apps-ct)
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
+
+ifneq ($(ALL_APPS_DIRS),)
+define ct_app_target
+apps-ct-$1:
+       $(MAKE) -C $1 ct IS_APP=1
+endef
+
+$(foreach app,$(ALL_APPS_DIRS),$(eval $(call ct_app_target,$(app))))
+
+apps-ct: test-build $(addprefix apps-ct-,$(ALL_APPS_DIRS))
+endif
+
+ifndef t
+CT_EXTRA =
+else
+ifeq (,$(findstring :,$t))
+CT_EXTRA = -group $t
+else
+t_words = $(subst :, ,$t)
+CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
+endif
+endif
+
+define ct_suite_target
+ct-$(1): test-build
+       $(verbose) mkdir -p $(CURDIR)/logs/
+       $(gen_verbose) $(CT_RUN) -sname ct_$(PROJECT) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
+endef
+
+$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
+
+distclean-ct:
+       $(gen_verbose) rm -rf $(CURDIR)/logs/
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: plt distclean-plt dialyze
+
+# Configuration.
+
+DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
+export DIALYZER_PLT
+
+PLT_APPS ?=
+DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
+DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
+
+# Core targets.
+
+check:: dialyze
+
+distclean:: distclean-plt
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Dialyzer targets:" \
+               "  plt         Build a PLT file for this project" \
+               "  dialyze     Analyze the project using Dialyzer"
+
+# Plugin-specific targets.
+
+define filter_opts.erl
+       Opts = init:get_plain_arguments(),
+       {Filtered, _} = lists:foldl(fun
+               (O,                         {Os, true}) -> {[O|Os], false};
+               (O = "-D",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$D, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-I",                  {Os, _})    -> {[O|Os], true};
+               (O = [\\$$-, \\$$I, _ | _], {Os, _})    -> {[O|Os], false};
+               (O = "-pa",                 {Os, _})    -> {[O|Os], true};
+               (_,                         Acc)        -> Acc
+       end, {[], false}, Opts),
+       io:format("~s~n", [string:join(lists:reverse(Filtered), " ")]),
+       halt().
+endef
+
+$(DIALYZER_PLT): deps app
+       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
+
+plt: $(DIALYZER_PLT)
+
+distclean-plt:
+       $(gen_verbose) rm -f $(DIALYZER_PLT)
+
+ifneq ($(wildcard $(DIALYZER_PLT)),)
+dialyze:
+else
+dialyze: $(DIALYZER_PLT)
+endif
+       $(verbose) dialyzer --no_native `$(ERL) -eval "$(subst $(newline),,$(subst ",\",$(call filter_opts.erl)))" -extra $(ERLC_OPTS)` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-edoc edoc
+
+# Configuration.
+
+EDOC_OPTS ?=
+
+# Core targets.
+
+ifneq ($(wildcard doc/overview.edoc),)
+docs:: edoc
+endif
+
+distclean:: distclean-edoc
+
+# Plugin-specific targets.
+
+edoc: distclean-edoc doc-deps
+       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
+
+distclean-edoc:
+       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
+
+# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: distclean-escript escript
+
+# Configuration.
+
+ESCRIPT_NAME ?= $(PROJECT)
+ESCRIPT_FILE ?= $(ESCRIPT_NAME)
+
+ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
+
+ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
+ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
+ESCRIPT_EMU_ARGS ?= -pa . \
+       -sasl errlog_type error \
+       -escript main $(ESCRIPT_NAME)
+ESCRIPT_SHEBANG ?= /usr/bin/env escript
+ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
+
+# Core targets.
+
+distclean:: distclean-escript
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Escript targets:" \
+               "  escript     Build an executable escript archive" \
+
+# Plugin-specific targets.
+
+# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
+# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
+# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
+# Software may only be used for the great good and the true happiness of all
+# sentient beings.
+
+define ESCRIPT_RAW
+'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
+'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
+'  [F || F <- A, not filelib:is_dir(F) ] end,'\
+'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
+'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
+'Ez = fun(Escript) ->'\
+'  Static = Files([$(ESCRIPT_STATIC)]),'\
+'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
+'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
+'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
+'    {archive, Archive, [memory]},'\
+'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
+'    {comment, "$(ESCRIPT_COMMENT)"},'\
+'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
+'  ]),'\
+'  file:change_mode(Escript, 8#755)'\
+'end,'\
+'Ez("$(ESCRIPT_FILE)"),'\
+'halt().'
+endef
+
+ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
+
+escript:: distclean-escript deps app
+       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
+
+distclean-escript:
+       $(gen_verbose) rm -f $(ESCRIPT_NAME)
+
+# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: eunit apps-eunit
+
+# Configuration
+
+EUNIT_OPTS ?=
+EUNIT_ERL_OPTS ?=
+
+# Core targets.
+
+tests:: eunit
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "EUnit targets:" \
+               "  eunit       Run all the EUnit tests for this project"
+
+# Plugin-specific targets.
+
+define eunit.erl
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       case cover:compile_beam_directory("ebin") of
+                               {error, _} -> halt(1);
+                               _ -> ok
+                       end
+       end,
+       case eunit:test($1, [$(EUNIT_OPTS)]) of
+               ok -> ok;
+               error -> halt(2)
+       end,
+       case "$(COVER)" of
+               "" -> ok;
+               _ ->
+                       cover:export("eunit.coverdata")
+       end,
+       halt()
+endef
+
+EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR)/ebin
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
+else
+eunit: test-build
+       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
+endif
+else
+EUNIT_EBIN_MODS = $(notdir $(basename $(ERL_FILES) $(BEAM_FILES)))
+EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl)))
+
+EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
+       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
+
+eunit: test-build $(if $(IS_APP),,apps-eunit)
+       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
+
+ifneq ($(ALL_APPS_DIRS),)
+apps-eunit:
+       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
+endif
+endif
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: relx-rel distclean-relx-rel distclean-relx run
+
+# Configuration.
+
+RELX ?= $(CURDIR)/relx
+RELX_CONFIG ?= $(CURDIR)/relx.config
+
+RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.19.0/relx
+RELX_OPTS ?=
+RELX_OUTPUT_DIR ?= _rel
+
+ifeq ($(firstword $(RELX_OPTS)),-o)
+       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
+else
+       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
+endif
+
+# Core targets.
+
+ifeq ($(IS_DEP),)
+ifneq ($(wildcard $(RELX_CONFIG)),)
+rel:: relx-rel
+endif
+endif
+
+distclean:: distclean-relx-rel distclean-relx
+
+# Plugin-specific targets.
+
+$(RELX):
+       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
+       $(verbose) chmod +x $(RELX)
+
+relx-rel: $(RELX) rel-deps app
+       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
+
+distclean-relx-rel:
+       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
+
+distclean-relx:
+       $(gen_verbose) rm -rf $(RELX)
+
+# Run target.
+
+ifeq ($(wildcard $(RELX_CONFIG)),)
+run:
+else
+
+define get_relx_release.erl
+       {ok, Config} = file:consult("$(RELX_CONFIG)"),
+       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
+       io:format("~s", [Name]),
+       halt(0).
+endef
+
+RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
+
+run: all
+       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Relx targets:" \
+               "  run         Compile the project, build the release and run it"
+
+endif
+
+# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is contributed to erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: shell
+
+# Configuration.
+
+SHELL_ERL ?= erl
+SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
+SHELL_OPTS ?=
+
+ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
+
+# Core targets
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Shell targets:" \
+               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
+
+# Plugin-specific targets.
+
+$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
+
+build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
+       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
+
+shell: build-shell-deps
+       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
+
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
+.PHONY: triq
+
+# Targets.
+
+tests:: triq
+
+define triq_check.erl
+       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
+       try
+               case $(1) of
+                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
+                       module -> triq:check($(2));
+                       function -> triq:check($(2))
+               end
+       of
+               true -> halt(0);
+               _ -> halt(1)
+       catch error:undef ->
+               io:format("Undefined property or module~n"),
+               halt(0)
+       end.
+endef
+
+ifdef t
+ifeq (,$(findstring :,$(t)))
+triq: test-build
+       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
+else
+triq: test-build
+       $(verbose) echo Testing $(t)/0
+       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
+endif
+else
+triq: test-build
+       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
+       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
+endif
+endif
+
+# Copyright (c) 2015, Erlang Solutions Ltd.
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: xref distclean-xref
+
+# Configuration.
+
+ifeq ($(XREF_CONFIG),)
+       XREFR_ARGS :=
+else
+       XREFR_ARGS := -c $(XREF_CONFIG)
+endif
+
+XREFR ?= $(CURDIR)/xrefr
+export XREFR
+
+XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
+
+# Core targets.
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Xref targets:" \
+               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
+
+distclean:: distclean-xref
+
+# Plugin-specific targets.
+
+$(XREFR):
+       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
+       $(verbose) chmod +x $(XREFR)
+
+xref: deps app $(XREFR)
+       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
+
+distclean-xref:
+       $(gen_verbose) rm -rf $(XREFR)
+
+# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+COVER_REPORT_DIR = cover
+
+# Hook in coverage to ct
+
+ifdef COVER
+ifdef CT_RUN
+# All modules in 'ebin'
+COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
+
+test-build:: $(TEST_DIR)/ct.cover.spec
+
+$(TEST_DIR)/ct.cover.spec:
+       $(verbose) echo Cover mods: $(COVER_MODS)
+       $(gen_verbose) printf "%s\n" \
+               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
+               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
+
+CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
+endif
+endif
+
+# Core targets
+
+ifdef COVER
+ifneq ($(COVER_REPORT_DIR),)
+tests::
+       $(verbose) $(MAKE) --no-print-directory cover-report
+endif
+endif
+
+clean:: coverdata-clean
+
+ifneq ($(COVER_REPORT_DIR),)
+distclean:: cover-report-clean
+endif
+
+help::
+       $(verbose) printf "%s\n" "" \
+               "Cover targets:" \
+               "  cover-report  Generate a HTML coverage report from previously collected" \
+               "                cover data." \
+               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
+               "" \
+               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
+               "target tests additionally generates a HTML coverage report from the combined" \
+               "coverdata files from each of these testing tools. HTML reports can be disabled" \
+               "by setting COVER_REPORT_DIR to empty."
+
+# Plugin specific targets
+
+COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
+
+.PHONY: coverdata-clean
+coverdata-clean:
+       $(gen_verbose) rm -f *.coverdata ct.cover.spec
+
+# Merge all coverdata files into one.
+all.coverdata: $(COVERDATA)
+       $(gen_verbose) $(ERL) -eval ' \
+               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
+               cover:export("$@"), halt(0).'
+
+# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
+# empty if you want the coverdata files but not the HTML report.
+ifneq ($(COVER_REPORT_DIR),)
+
+.PHONY: cover-report-clean cover-report
+
+cover-report-clean:
+       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
+
+ifeq ($(COVERDATA),)
+cover-report:
+else
+
+# Modules which include eunit.hrl always contain one line without coverage
+# because eunit defines test/0 which is never called. We compensate for this.
+EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
+       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
+       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
+
+define cover_report.erl
+       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
+       Ms = cover:imported_modules(),
+       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
+               ++ ".COVER.html", [html])  || M <- Ms],
+       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
+       EunitHrlMods = [$(EUNIT_HRL_MODS)],
+       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
+               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
+       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
+       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
+       Perc = fun(Y, N) -> case Y + N of 0 -> 100; S -> round(100 * Y / S) end end,
+       TotalPerc = Perc(TotalY, TotalN),
+       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
+       io:format(F, "<!DOCTYPE html><html>~n"
+               "<head><meta charset=\"UTF-8\">~n"
+               "<title>Coverage report</title></head>~n"
+               "<body>~n", []),
+       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
+       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
+       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
+               "<td>~p%</td></tr>~n",
+               [M, M, Perc(Y, N)]) || {M, {Y, N}} <- Report1],
+       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
+       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
+       io:format(F, "</table>~n"
+               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
+               "</body></html>", [How, Date]),
+       halt().
+endef
+
+cover-report:
+       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
+       $(gen_verbose) $(call erlang,$(cover_report.erl))
+
+endif
+endif # ifneq ($(COVER_REPORT_DIR),)
+
+# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
+# Copyright (c) 2015-2016, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Fetch dependencies recursively (without building them).
+
+.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
+       fetch-shell-deps
+
+.PHONY: $(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+       $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+fetch-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+fetch-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+fetch-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+fetch-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+fetch-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+ifneq ($(SKIP_DEPS),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+       $(verbose) :> $@
+else
+# By default, we fetch "normal" dependencies. They are also included no
+# matter the type of requested dependencies.
+#
+# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
+
+# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
+# dependencies with a single target.
+ifneq ($(filter doc,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_DOC_DEPS_DIRS)
+endif
+ifneq ($(filter rel,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_REL_DEPS_DIRS)
+endif
+ifneq ($(filter test,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_TEST_DEPS_DIRS)
+endif
+ifneq ($(filter shell,$(DEP_TYPES)),)
+$(ERLANG_MK_RECURSIVE_DEPS_LIST): $(ALL_SHELL_DEPS_DIRS)
+endif
+
+ERLANG_MK_RECURSIVE_TMP_LIST := $(abspath $(ERLANG_MK_TMP)/recursive-tmp-deps.log)
+
+$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
+$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) mkdir -p $(ERLANG_MK_TMP)
+       $(verbose) rm -f $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+ifndef IS_APP
+       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
+               $(MAKE) -C $$dep $@ \
+                IS_APP=1 \
+                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                || exit $$?; \
+       done
+endif
+       $(verbose) for dep in $^ ; do \
+               if ! grep -qs ^$$dep$$ $(ERLANG_MK_RECURSIVE_TMP_LIST); then \
+                       echo $$dep >> $(ERLANG_MK_RECURSIVE_TMP_LIST); \
+                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
+                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
+                               $(MAKE) -C $$dep fetch-deps \
+                                IS_DEP=1 \
+                                ERLANG_MK_RECURSIVE_TMP_LIST=$(ERLANG_MK_RECURSIVE_TMP_LIST) \
+                                || exit $$?; \
+                       fi \
+               fi \
+       done
+ifeq ($(IS_APP)$(IS_DEP),)
+       $(verbose) sort < $(ERLANG_MK_RECURSIVE_TMP_LIST) | uniq > $@
+       $(verbose) rm $(ERLANG_MK_RECURSIVE_TMP_LIST)
+endif
+endif # ifneq ($(SKIP_DEPS),)
+
+# List dependencies recursively.
+
+.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
+       list-shell-deps
+
+list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
+list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
+list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
+list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
+
+list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
+       $(verbose) cat $^
diff --git a/git-revisions.txt b/git-revisions.txt
new file mode 100644 (file)
index 0000000..6766bc9
--- /dev/null
@@ -0,0 +1,34 @@
+rabbitmq_server_release ad4565fa57e98c9183db8e9f7acc9ce6ce1ee48f rabbitmq_v3_6_6
+amqp_client ca59f72a6f7c151f1eaeb0131163909791ae6284 rabbitmq_v3_6_6
+cowboy b8e4115eb13488c517d8d8ef33c47d0eaa7838c6 1.0.3
+cowlib 7d8a571b1e50602d701ca203fbf28036b2cf80f5 1.0.1
+mochiweb a1ed381e1c4f56c7d1eaee2c2cb725719905a84a master
+rabbit 3be6cd4bb31f4a7a99fe1e5cd4652766a08c3c40 rabbitmq_v3_6_6
+rabbit_common 97e014fc01136bbd6da31fb3490f6e0209a386e2 rabbitmq_v3_6_6
+rabbitmq_amqp1_0 102609e93e84d2935698bf9d07ad5ba7ccae1133 rabbitmq_v3_6_6
+rabbitmq_auth_backend_ldap 1ee91f8022d1c2e4b825144faf9d7efe65146a37 rabbitmq_v3_6_6
+rabbitmq_auth_mechanism_ssl 4538833b754e581a1c4b5000b8ab3a3752b0551e rabbitmq_v3_6_6
+rabbitmq_codegen 4e725d8cafeaca969082beb0b5fa7d48f7f738fe rabbitmq_v3_6_6
+rabbitmq_consistent_hash_exchange a0a239bbfb3ae17ac9b01e20ea43175acd990e65 rabbitmq_v3_6_6
+rabbitmq_event_exchange b4b6331b060ab7a6db37298227bbef4905df641a rabbitmq_v3_6_6
+rabbitmq_federation f80e793331ef80fb96949f0b927cd609e0fdd952 rabbitmq_v3_6_6
+rabbitmq_federation_management 354f9bf661cc19f1f53bc277be25676e272a584b rabbitmq_v3_6_6
+rabbitmq_jms_topic_exchange a549a8a1a434a52d904cee92566442f025c0059b rabbitmq_v3_6_6
+rabbitmq_management a5f9d42785a251383bfe1e673df9ab260e1a778d rabbitmq_v3_6_6
+rabbitmq_management_agent 82c31a6d4a3c740d65b50dadfc04b46c4ca3fc02 rabbitmq_v3_6_6
+rabbitmq_management_visualiser 4211cbb1108ac3562f02c899ee217444d3a86bfd rabbitmq_v3_6_6
+rabbitmq_mqtt 0cee514e400c57061b4c2663e9170059ea1dfadf rabbitmq_v3_6_6
+rabbitmq_recent_history_exchange 9881652e4af40964bbe804a4dcd70fd745d4d171 rabbitmq_v3_6_6
+rabbitmq_sharding 7beaab51586015445edac2e31553289925fc252a rabbitmq_v3_6_6
+rabbitmq_shovel 6749519c6833881886f354092d49ab9036d8f90d rabbitmq_v3_6_6
+rabbitmq_shovel_management 715cd498cbd24e288ef501214714baf57af17941 rabbitmq_v3_6_6
+rabbitmq_stomp 215dde6d30d2b4a302930528e2a1b0debcc15446 rabbitmq_v3_6_6
+rabbitmq_top d12a3bf21ebd0a6aa5d2bc76474c1f5d2ef2040a rabbitmq_v3_6_6
+rabbitmq_tracing b9900be98f2929a8c472393b40ac7ec74e5cf7ff rabbitmq_v3_6_6
+rabbitmq_trust_store 5a1ce3e2354e421423d7ea2048daa9d6d8216cbe rabbitmq_v3_6_6
+rabbitmq_web_dispatch 98b24e030c043456645fbbaa9df9f2268c4d460f rabbitmq_v3_6_6
+rabbitmq_web_stomp 64d3b9c829f92c087b295f0347efce2d23d14e15 rabbitmq_v3_6_6
+rabbitmq_web_stomp_examples 85f33ca3ccce7bba094a657300c43054af8a0af6 rabbitmq_v3_6_6
+ranch a5d2efcde9a34ad38ab89a26d98ea5335e88625a 1.2.1
+sockjs 7e7112a4935a9aaa89e97954eb612534fa0f6229 master
+webmachine 6b5210c0ed07159f43222255e05a90bbef6c8cbe 
diff --git a/rabbitmq-components.mk b/rabbitmq-components.mk
new file mode 100644 (file)
index 0000000..05986d8
--- /dev/null
@@ -0,0 +1,284 @@
+ifeq ($(.DEFAULT_GOAL),)
+# Define default goal to `all` because this file defines some targets
+# before the inclusion of erlang.mk leading to the wrong target becoming
+# the default.
+.DEFAULT_GOAL = all
+endif
+
+# --------------------------------------------------------------------
+# RabbitMQ components.
+# --------------------------------------------------------------------
+
+# For RabbitMQ repositories, we want to checkout branches which match
+# the parent project. For instance, if the parent project is on a
+# release tag, dependencies must be on the same release tag. If the
+# parent project is on a topic branch, dependencies must be on the same
+# topic branch or fallback to `stable` or `master` whichever was the
+# base of the topic branch.
+
+dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_ct_helpers               = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_server_release           = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
+dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
+dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
+dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
+
+dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
+
+# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
+# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
+# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
+# this workaround are:
+#     o  rabbitmq-web-stomp
+dep_ranch = git https://github.com/ninenines/ranch 1.2.1
+
+RABBITMQ_COMPONENTS = amqp_client \
+                     rabbit \
+                     rabbit_common \
+                     rabbitmq_amqp1_0 \
+                     rabbitmq_auth_backend_amqp \
+                     rabbitmq_auth_backend_http \
+                     rabbitmq_auth_backend_ldap \
+                     rabbitmq_auth_mechanism_ssl \
+                     rabbitmq_boot_steps_visualiser \
+                     rabbitmq_clusterer \
+                     rabbitmq_codegen \
+                     rabbitmq_consistent_hash_exchange \
+                     rabbitmq_ct_helpers \
+                     rabbitmq_delayed_message_exchange \
+                     rabbitmq_dotnet_client \
+                     rabbitmq_event_exchange \
+                     rabbitmq_federation \
+                     rabbitmq_federation_management \
+                     rabbitmq_java_client \
+                     rabbitmq_jms_client \
+                     rabbitmq_jms_topic_exchange \
+                     rabbitmq_lvc \
+                     rabbitmq_management \
+                     rabbitmq_management_agent \
+                     rabbitmq_management_exchange \
+                     rabbitmq_management_themes \
+                     rabbitmq_management_visualiser \
+                     rabbitmq_message_timestamp \
+                     rabbitmq_metronome \
+                     rabbitmq_mqtt \
+                     rabbitmq_objc_client \
+                     rabbitmq_recent_history_exchange \
+                     rabbitmq_routing_node_stamp \
+                     rabbitmq_rtopic_exchange \
+                     rabbitmq_server_release \
+                     rabbitmq_sharding \
+                     rabbitmq_shovel \
+                     rabbitmq_shovel_management \
+                     rabbitmq_stomp \
+                     rabbitmq_toke \
+                     rabbitmq_top \
+                     rabbitmq_tracing \
+                     rabbitmq_trust_store \
+                     rabbitmq_web_dispatch \
+                     rabbitmq_web_mqtt \
+                     rabbitmq_web_mqtt_examples \
+                     rabbitmq_web_stomp \
+                     rabbitmq_web_stomp_examples \
+                     rabbitmq_website
+
+# Several components have a custom erlang.mk/build.config, mainly
+# to disable eunit. Therefore, we can't use the top-level project's
+# erlang.mk copy.
+NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
+
+ifeq ($(origin current_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+current_rmq_ref := $(shell (\
+       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
+       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
+else
+current_rmq_ref := master
+endif
+endif
+export current_rmq_ref
+
+ifeq ($(origin base_rmq_ref),undefined)
+ifneq ($(wildcard .git),)
+base_rmq_ref := $(shell \
+       (git rev-parse --verify -q stable >/dev/null && \
+         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
+         echo stable) || \
+       echo master)
+else
+base_rmq_ref := master
+endif
+endif
+export base_rmq_ref
+
+# Repository URL selection.
+#
+# First, we infer other components' location from the current project
+# repository URL, if it's a Git repository:
+#   - We take the "origin" remote URL as the base
+# - The current project name and repository name is replaced by the
+#   target's properties:
+#       eg. rabbitmq-common is replaced by rabbitmq-codegen
+#       eg. rabbit_common is replaced by rabbitmq_codegen
+#
+# If cloning from this computed location fails, we fallback to RabbitMQ
+# upstream which is GitHub.
+
+# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
+rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
+
+# Upstream URL for the current project.
+RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
+RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
+
+# Current URL for the current project. If this is not a Git clone,
+# default to the upstream Git repository.
+ifneq ($(wildcard .git),)
+git_origin_fetch_url := $(shell git config remote.origin.url)
+git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
+RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
+RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
+else
+RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
+RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
+endif
+
+# Macro to replace the following pattern:
+#   1. /foo.git -> /bar.git
+#   2. /foo     -> /bar
+#   3. /foo/    -> /bar/
+subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
+
+# Macro to replace both the project's name (eg. "rabbit_common") and
+# repository name (eg. "rabbitmq-common") by the target's equivalent.
+#
+# This macro is kept on one line because we don't want whitespaces in
+# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
+# single-quoted string.
+dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
+
+dep_rmq_commits = $(if $(dep_$(1)),                                    \
+                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
+                 $(pkg_$(1)_commit))
+
+define dep_fetch_git_rmq
+       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
+       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
+       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
+        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url1"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
+       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
+           fetch_url="$$$$fetch_url2"; \
+           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
+       fi; \
+       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
+       $(foreach ref,$(call dep_rmq_commits,$(1)), \
+         git checkout -q $(ref) >/dev/null 2>&1 || \
+         ) \
+       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
+         1>&2 && false) ) && \
+       (test "$$$$fetch_url" = "$$$$push_url" || \
+        git remote set-url --push origin "$$$$push_url")
+endef
+
+# --------------------------------------------------------------------
+# Component distribution.
+# --------------------------------------------------------------------
+
+list-dist-deps::
+       @:
+
+prepare-dist::
+       @:
+
+# --------------------------------------------------------------------
+# rabbitmq-components.mk checks.
+# --------------------------------------------------------------------
+
+# If this project is under the Umbrella project, we override $(DEPS_DIR)
+# to point to the Umbrella's one. We also disable `make distclean` so
+# $(DEPS_DIR) is not accidentally removed.
+
+ifneq ($(wildcard ../../UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+else ifneq ($(wildcard UMBRELLA.md),)
+UNDER_UMBRELLA = 1
+endif
+
+ifeq ($(UNDER_UMBRELLA),1)
+ifneq ($(PROJECT),rabbitmq_public_umbrella)
+DEPS_DIR ?= $(abspath ..)
+endif
+
+ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
+SKIP_DEPS = 1
+endif
+endif
+
+UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
+
+check-rabbitmq-components.mk:
+       $(verbose) cmp -s rabbitmq-components.mk \
+               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
+               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
+                 false)
+
+ifeq ($(PROJECT),rabbit_common)
+rabbitmq-components-mk:
+       @:
+else
+rabbitmq-components-mk:
+       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
+ifeq ($(DO_COMMIT),yes)
+       $(verbose) git diff --quiet rabbitmq-components.mk \
+       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
+endif
+endif
diff --git a/rabbitmq-server/deps/amqp_client/erlang.mk b/rabbitmq-server/deps/amqp_client/erlang.mk
deleted file mode 100644 (file)
index efbcf5c..0000000
+++ /dev/null
@@ -1,6702 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-76-g427cfb8
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += brod
-pkg_brod_name = brod
-pkg_brod_description = Kafka client in Erlang
-pkg_brod_homepage = https://github.com/klarna/brod
-pkg_brod_fetch = git
-pkg_brod_repo = https://github.com/klarna/brod.git
-pkg_brod_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = master
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_coap
-pkg_gen_coap_name = gen_coap
-pkg_gen_coap_description = Generic Erlang CoAP Client/Server
-pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
-pkg_gen_coap_fetch = git
-pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
-pkg_gen_coap_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += i18n
-pkg_i18n_name = i18n
-pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
-pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
-pkg_i18n_fetch = git
-pkg_i18n_repo = https://github.com/erlang-unicode/i18n
-pkg_i18n_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimerl
-pkg_mimerl_name = mimerl
-pkg_mimerl_description = library to handle mimetypes
-pkg_mimerl_homepage = https://github.com/benoitc/mimerl
-pkg_mimerl_fetch = git
-pkg_mimerl_repo = https://github.com/benoitc/mimerl
-pkg_mimerl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += supervisor3
-pkg_supervisor3_name = supervisor3
-pkg_supervisor3_description = OTP supervisor with additional strategies
-pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
-pkg_supervisor3_fetch = git
-pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
-pkg_supervisor3_commit = master
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.3
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-               $(call dep_autopatch_erlang_mk,$(1)); \
-       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
-               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
-       fi; \
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case {filename:extension(Output), $(PLATFORM)} of
-                                           {[], _} -> "\n";
-                                           {_, darwin} -> "\n";
-                                           _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc_script.erl
-       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcScript = AppSrc ++ ".script",
-       Bindings = erl_eval:new_bindings(),
-       {ok, Conf} = file:script(AppSrcScript, Bindings),
-       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
-       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
-                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
-               echo " AUTO  " $(1); \
-               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifneq ($(DTL_FILES),)
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild templates when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
-
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       E = ets:new(makedep, [bag]),
-       G = digraph:new([acyclic]),
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
-       Add = fun (Mod, Dep) ->
-               case lists:keyfind(Dep, 1, Modules) of
-                       false -> ok;
-                       {_, DepFile} ->
-                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
-                               ets:insert(E, {ModFile, DepFile}),
-                               digraph:add_vertex(G, Mod),
-                               digraph:add_vertex(G, Dep),
-                               digraph:add_edge(G, Mod, Dep)
-               end
-       end,
-       AddHd = fun (F, Mod, DepFile) ->
-               case file:open(DepFile, [read]) of
-                       {error, enoent} -> ok;
-                       {ok, Fd} ->
-                               F(F, Fd, Mod),
-                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
-                               ets:insert(E, {ModFile, DepFile})
-               end
-       end,
-       Attr = fun
-               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
-               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
-               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
-               (F, Mod, compile, Opts) when is_list(Opts) ->
-                       case proplists:get_value(parse_transform, Opts) of
-                               undefined -> ok;
-                               Dep -> Add(Mod, Dep)
-                       end;
-               (F, Mod, include, Hrl) ->
-                       case filelib:is_file("include/" ++ Hrl) of
-                               true -> AddHd(F, Mod, "include/" ++ Hrl);
-                               false ->
-                                       case filelib:is_file("src/" ++ Hrl) of
-                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
-                                               false -> false
-                                       end
-                       end;
-               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
-               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
-               (F, Mod, import, {Imp, _}) ->
-                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
-                               false -> ok;
-                               true -> Add(Mod, Imp)
-                       end;
-               (_, _, _, _) -> ok
-       end,
-       MakeDepend = fun(F, Fd, Mod) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, Key, Value}, _} ->
-                               Attr(F, Mod, Key, Value),
-                               F(F, Fd, Mod);
-                       {eof, _} ->
-                               file:close(Fd);
-                       _ ->
-                               F(F, Fd, Mod)
-               end
-       end,
-       [begin
-               Mod = list_to_atom(filename:basename(F, ".erl")),
-               {ok, Fd} = file:open(F, [read]),
-               MakeDepend(MakeDepend, Fd, Mod)
-       end || F <- ErlFiles],
-       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
-       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
-       ok = file:write_file("$(1)", [
-               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
-               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
-       ]),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard src),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps
-       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-else
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_erlc_opts_to_list
-       [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide: distclean-asciidoc doc-deps
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual: distclean-asciidoc doc-deps
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
-# separately during the actual bootstrap.
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-endef
-else
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) echo "include erlang.mk" >> Makefile
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) echo "include erlang.mk" >> Makefile
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),msys2)
-       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
-       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
-else
-       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
-       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
-endif
-
-ifeq ($(C_SRC_TYPE),shared)
-       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
-else
-       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
-endif
-
-ifeq ($(PLATFORM),msys2)
-# We hardcode the compiler used on MSYS2. The default CC=cc does
-# not produce working code. The "gcc" MSYS2 package also doesn't.
-       CC = /mingw64/bin/gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-ifneq ($(PLATFORM),msys2)
-       CFLAGS += -fPIC
-       CXXFLAGS += -fPIC
-endif
-
-CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
-CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
-
-LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
-
-$(C_SRC_OUTPUT_FILE): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT_FILE)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct apps-ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct: $(if $(IS_APP),,apps-ct)
-else
-ct: test-build $(if $(IS_APP),,apps-ct)
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-ifneq ($(ALL_APPS_DIRS),)
-apps-ct:
-       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app ct IS_APP=1; done
-endif
-
-ifndef t
-CT_EXTRA =
-else
-ifeq (,$(findstring :,$t))
-CT_EXTRA = -group $t
-else
-t_words = $(subst :, ,$t)
-CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
-endif
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-define filter_opts.erl
-       Opts = binary:split(<<"$1">>, <<"-">>, [global]),
-       Filtered = lists:reverse(lists:foldl(fun
-               (O = <<"pa ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"D ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"I ", _/bits>>, Acc) -> [O|Acc];
-               (_, Acc) -> Acc
-       end, [], Opts)),
-       io:format("~s~n", [[["-", O] || O <- Filtered]]),
-       halt().
-endef
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-ifneq ($(wildcard doc/overview.edoc),)
-docs:: edoc
-endif
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: distclean-edoc doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit apps-eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-EUNIT_ERL_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test($1, [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin ebin
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-eunit: test-build
-       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
-else
-eunit: test-build
-       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
-endif
-else
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
-
-eunit: test-build $(if $(IS_APP),,apps-eunit)
-       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
-
-ifneq ($(ALL_APPS_DIRS),)
-apps-eunit:
-       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
-endif
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/amqp_client/src/rabbit_ct_client_helpers.erl b/rabbitmq-server/deps/amqp_client/src/rabbit_ct_client_helpers.erl
deleted file mode 100644 (file)
index fee4ea2..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_ct_client_helpers).
-
--include_lib("common_test/include/ct.hrl").
--include("include/amqp_client.hrl").
-
--export([
-    setup_steps/0,
-    teardown_steps/0,
-    start_channels_managers/1,
-    stop_channels_managers/1,
-
-    open_connection/2,
-    open_unmanaged_connection/1, open_unmanaged_connection/2,
-    close_connection/1,
-    open_channel/2, open_channel/1,
-    close_channel/1,
-    open_connection_and_channel/2, open_connection_and_channel/1,
-    close_connection_and_channel/2,
-    close_channels_and_connection/2,
-
-    publish/3, consume/3, fetch/3
-  ]).
-
-%% -------------------------------------------------------------------
-%% Client setup/teardown steps.
-%% -------------------------------------------------------------------
-
-setup_steps() ->
-    [
-      fun start_channels_managers/1
-    ].
-
-teardown_steps() ->
-    [
-      fun stop_channels_managers/1
-    ].
-
-start_channels_managers(Config) ->
-    NodeConfigs = rabbit_ct_broker_helpers:get_node_configs(Config),
-    NodeConfigs1 = [start_channels_manager(NC) || NC <- NodeConfigs],
-    rabbit_ct_helpers:set_config(Config, {rmq_nodes, NodeConfigs1}).
-
-start_channels_manager(NodeConfig) ->
-    Pid = erlang:spawn(
-      fun() -> channels_manager(NodeConfig, undefined, []) end),
-    rabbit_ct_helpers:set_config(NodeConfig, {channels_manager, Pid}).
-
-stop_channels_managers(Config) ->
-    NodeConfigs = rabbit_ct_broker_helpers:get_node_configs(Config),
-    NodeConfigs1 = [stop_channels_manager(NC) || NC <- NodeConfigs],
-    rabbit_ct_helpers:set_config(Config, {rmq_nodes, NodeConfigs1}).
-
-stop_channels_manager(NodeConfig) ->
-    Pid = ?config(channels_manager, NodeConfig),
-    Pid ! stop,
-    proplists:delete(channels_manager, NodeConfig).
-
-channels_manager(NodeConfig, ConnTuple, Channels) ->
-    receive
-        {open_connection, From} ->
-            {Conn1, _} = ConnTuple1 = open_conn(NodeConfig, ConnTuple),
-            From ! Conn1,
-            channels_manager(NodeConfig, ConnTuple1, Channels);
-        {open_channel, From} ->
-            {Conn1, _} = ConnTuple1 = open_conn(NodeConfig, ConnTuple),
-            {ok, Ch} = amqp_connection:open_channel(Conn1),
-            ChMRef = erlang:monitor(process, Ch),
-            From ! Ch,
-            channels_manager(NodeConfig, ConnTuple1,
-              [{Ch, ChMRef} | Channels]);
-        {close_everything, From} ->
-            close_everything(ConnTuple, Channels),
-            From ! ok,
-            channels_manager(NodeConfig, undefined, []);
-        {'DOWN', ConnMRef, process, Conn, _}
-        when {Conn, ConnMRef} =:= ConnTuple ->
-            channels_manager(NodeConfig, undefined, Channels);
-        {'DOWN', ChMRef, process, Ch, _} ->
-            Channels1 = Channels -- [{Ch, ChMRef}],
-            channels_manager(NodeConfig, ConnTuple, Channels1);
-        stop ->
-            close_everything(ConnTuple, Channels);
-        Unhandled ->
-            ct:pal(?LOW_IMPORTANCE,
-              "Channels manager ~p: unhandled message: ~p",
-              [self(), Unhandled]),
-            channels_manager(NodeConfig, ConnTuple, Channels)
-    end.
-
-open_conn(NodeConfig, undefined) ->
-    Port = ?config(tcp_port_amqp, NodeConfig),
-    Params = #amqp_params_network{port = Port},
-    {ok, Conn} = amqp_connection:start(Params),
-    MRef = erlang:monitor(process, Conn),
-    {Conn, MRef};
-open_conn(NodeConfig, {Conn, _} = ConnTuple) ->
-    case erlang:is_process_alive(Conn) of
-        true  -> ConnTuple;
-        false -> open_conn(NodeConfig, undefined)
-    end.
-
-close_everything(Conn, [{Ch, MRef} | Rest]) ->
-    case erlang:is_process_alive(Ch) of
-        true ->
-            erlang:demonitor(MRef, [flush]),
-            amqp_channel:close(Ch);
-        false ->
-            ok
-    end,
-    close_everything(Conn, Rest);
-close_everything({Conn, MRef}, []) ->
-    case erlang:is_process_alive(Conn) of
-        true ->
-            erlang:demonitor(MRef),
-            amqp_connection:close(Conn);
-        false ->
-            ok
-    end;
-close_everything(undefined, []) ->
-    ok.
-
-%% -------------------------------------------------------------------
-%% Public API.
-%% -------------------------------------------------------------------
-
-open_connection(Config, Node) ->
-    Pid = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      channels_manager),
-    Pid ! {open_connection, self()},
-    receive
-        Conn when is_pid(Conn) -> Conn
-    end.
-
-open_unmanaged_connection(Config) ->
-    open_unmanaged_connection(Config, 0).
-
-open_unmanaged_connection(Config, Node) ->
-    open_unmanaged_connection(Config, Node, <<"/">>).
-
-open_unmanaged_connection(Config, Node, VHost) ->
-    Port = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      tcp_port_amqp),
-    Params = #amqp_params_network{port = Port, virtual_host = VHost},
-    case amqp_connection:start(Params) of
-        {ok, Conn}         -> Conn;
-        {error, _} = Error -> Error
-    end.
-
-open_channel(Config) ->
-    open_channel(Config, 0).
-
-open_channel(Config, Node) ->
-    Pid = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      channels_manager),
-    Pid ! {open_channel, self()},
-    receive
-        Ch when is_pid(Ch) -> Ch
-    end.
-
-open_connection_and_channel(Config) ->
-    open_connection_and_channel(Config, 0).
-
-open_connection_and_channel(Config, Node) ->
-    Conn = open_connection(Config, Node),
-    Ch = open_channel(Config, Node),
-    {Conn, Ch}.
-
-close_channel(Ch) ->
-    case is_process_alive(Ch) of
-        true  -> amqp_channel:close(Ch);
-        false -> ok
-    end.
-
-close_connection(Conn) ->
-    case is_process_alive(Conn) of
-        true  -> amqp_connection:close(Conn);
-        false -> ok
-    end.
-
-close_connection_and_channel(Conn, Ch) ->
-    _ = close_channel(Ch),
-    case close_connection(Conn) of
-        ok      -> ok;
-        closing -> ok
-    end.
-
-close_channels_and_connection(Config, Node) ->
-    Pid = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      channels_manager),
-    Pid ! {close_everything, self()},
-    receive
-        ok -> ok
-    end.
-
-publish(Ch, QName, Count) ->
-    amqp_channel:call(Ch, #'confirm.select'{}),
-    [amqp_channel:call(Ch,
-                       #'basic.publish'{routing_key = QName},
-                       #amqp_msg{props   = #'P_basic'{delivery_mode = 2},
-                                 payload = list_to_binary(integer_to_list(I))})
-     || I <- lists:seq(1, Count)],
-    amqp_channel:wait_for_confirms(Ch).
-
-consume(Ch, QName, Count) ->
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue = QName, no_ack = true},
-                           self()),
-    CTag = receive #'basic.consume_ok'{consumer_tag = C} -> C end,
-    [begin
-         Exp = list_to_binary(integer_to_list(I)),
-         receive {#'basic.deliver'{consumer_tag = CTag},
-                  #amqp_msg{payload = Exp}} ->
-                 ok
-         after 500 ->
-                 exit(timeout)
-         end
-     end|| I <- lists:seq(1, Count)],
-    #'queue.declare_ok'{message_count = 0}
-        = amqp_channel:call(Ch, #'queue.declare'{queue   = QName,
-                                                 durable = true}),
-    amqp_channel:call(Ch, #'basic.cancel'{consumer_tag = CTag}),
-    ok.
-
-fetch(Ch, QName, Count) ->
-    [{#'basic.get_ok'{}, _} =
-         amqp_channel:call(Ch, #'basic.get'{queue = QName}) ||
-        _ <- lists:seq(1, Count)],
-    ok.
diff --git a/rabbitmq-server/deps/amqp_client/test/system_SUITE.erl b/rabbitmq-server/deps/amqp_client/test/system_SUITE.erl
deleted file mode 100644 (file)
index e9caeac..0000000
+++ /dev/null
@@ -1,1450 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(system_SUITE).
-
--include_lib("common_test/include/ct.hrl").
-
--include("amqp_client.hrl").
--include("amqp_client_internal.hrl").
-
--compile(export_all).
-
--define(UNAUTHORIZED_USER, <<"test_user_no_perm">>).
-
-%% The latch constant defines how many processes are spawned in order
-%% to run certain functionality in parallel. It follows the standard
-%% countdown latch pattern.
--define(LATCH, 100).
-
-%% The wait constant defines how long a consumer waits before it
-%% unsubscribes
--define(WAIT, 200).
-
-%% How to long wait for a process to die after an expected failure
--define(PROCESS_EXIT_TIMEOUT, 5000).
-
-all() ->
-    [
-      {group, direct_connection_tests},
-      {group, network_connection_tests}
-    ].
-
--define(COMMON_PARALLEL_TEST_CASES, [
-    simultaneous_close,
-    basic_recover,
-    basic_consume,
-    consume_notification,
-    basic_nack,
-    large_content,
-    lifecycle,
-    no_vhost,
-    nowait_exchange_declare,
-    channel_repeat_open_close,
-    channel_multi_open_close,
-    basic_ack,
-    basic_ack_call,
-    channel_lifecycle,
-    queue_unbind,
-    sync_method_serialization,
-    async_sync_method_serialization,
-    sync_async_method_serialization,
-    rpc,
-    rpc_client,
-    confirm,
-    confirm_barrier,
-    confirm_select_before_wait,
-    confirm_barrier_timeout,
-    confirm_barrier_die_timeout,
-    default_consumer,
-    subscribe_nowait,
-    non_existent_exchange,
-    non_existent_user,
-    invalid_password,
-    non_existent_vhost,
-    no_permission,
-    channel_writer_death,
-    command_invalid_over_channel,
-    named_connection,
-    {teardown_loop, [{repeat, 100}, parallel], [teardown]},
-    {bogus_rpc_loop, [{repeat, 100}, parallel], [bogus_rpc]},
-    {hard_error_loop, [{repeat, 100}, parallel], [hard_error]}
-  ]).
--define(COMMON_NON_PARALLEL_TEST_CASES, [
-    basic_qos, %% Not parallel because it's time-based.
-    connection_failure,
-    channel_death
-  ]).
-
-groups() ->
-    [
-      {direct_connection_tests, [], [
-          {parallel_tests, [parallel], [
-              basic_get_direct,
-              no_user,
-              no_password
-              | ?COMMON_PARALLEL_TEST_CASES]},
-          {non_parallel_tests, [], ?COMMON_NON_PARALLEL_TEST_CASES}
-        ]},
-      {network_connection_tests, [], [
-          {parallel_tests, [parallel], [
-              basic_get_ipv4,
-              basic_get_ipv6,
-              basic_get_ipv4_ssl,
-              basic_get_ipv6_ssl,
-              pub_and_close,
-              channel_tune_negotiation,
-              shortstr_overflow_property,
-              shortstr_overflow_field,
-              command_invalid_over_channel0
-              | ?COMMON_PARALLEL_TEST_CASES]},
-          {non_parallel_tests, [], [
-              connection_blocked_network
-              | ?COMMON_NON_PARALLEL_TEST_CASES]}
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config,
-      rabbit_ct_broker_helpers:setup_steps() ++ [
-        fun ensure_amqp_client_srcdir/1,
-        fun create_unauthorized_user/1
-      ]).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config, [
-        fun delete_unauthorized_user/1
-      ] ++ rabbit_ct_broker_helpers:teardown_steps()).
-
-ensure_amqp_client_srcdir(Config) ->
-    rabbit_ct_helpers:ensure_application_srcdir(Config,
-                                                amqp_client, amqp_client).
-
-create_unauthorized_user(Config) ->
-    Cmd = ["add_user", ?UNAUTHORIZED_USER, ?UNAUTHORIZED_USER],
-    case rabbit_ct_broker_helpers:rabbitmqctl(Config, 0, Cmd) of
-        {ok, _} -> rabbit_ct_helpers:set_config(
-                  Config,
-                  [{rmq_unauthorized_username, ?UNAUTHORIZED_USER},
-                   {rmq_unauthorized_password, ?UNAUTHORIZED_USER}]);
-        _       -> {skip, "Failed to create unauthorized user"}
-    end.
-
-delete_unauthorized_user(Config) ->
-    Cmd = ["delete_user", ?UNAUTHORIZED_USER],
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, 0, Cmd),
-    Config.
-
-%% -------------------------------------------------------------------
-%% Groups.
-%% -------------------------------------------------------------------
-
-init_per_group(direct_connection_tests, Config) ->
-    rabbit_ct_helpers:set_config(Config, {amqp_client_conn_type, direct});
-init_per_group(network_connection_tests, Config) ->
-    rabbit_ct_helpers:set_config(Config, {amqp_client_conn_type, network});
-init_per_group(Group, Config)
-  when Group =:= parallel_tests
-  orelse Group =:= non_parallel_tests
-  orelse Group =:= teardown_loop
-  orelse Group =:= bogus_rpc_loop
-  orelse Group =:= hard_error_loop ->
-    case ?config(amqp_client_conn_type, Config) of
-        undefined -> rabbit_ct_helpers:set_config(
-                       Config, {amqp_client_conn_type, network});
-        _         -> Config
-    end.
-
-end_per_group(_, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-init_per_testcase(Test, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Test),
-    {Username, Password} = case Test of
-        no_user           -> {none,
-                              none};
-        no_password       -> {?config(rmq_username, Config),
-                              none};
-        non_existent_user -> {<<"no-user">>,
-                              <<"no-user">>};
-        invalid_password  -> {?config(rmq_username, Config),
-                              <<"bad">>};
-        no_permission     -> {?config(rmq_unauthorized_username, Config),
-                              ?config(rmq_unauthorized_password, Config)};
-        _                 -> {?config(rmq_username, Config),
-                              ?config(rmq_password, Config)}
-    end,
-    VHost = case Test of
-        no_vhost           -> <<"/noexist">>;
-        non_existent_vhost -> <<"oops">>;
-        _                  -> ?config(rmq_vhost, Config)
-    end,
-    Hostname = case Test of
-        basic_get_ipv4     -> "127.0.0.1";
-        basic_get_ipv6     -> "::1";
-        basic_get_ipv4_ssl -> "127.0.0.1";
-        basic_get_ipv6_ssl -> "::1";
-        _                  -> ?config(rmq_hostname, Config)
-    end,
-    {Port, SSLOpts} = if
-        Test =:= basic_get_ipv4_ssl orelse
-        Test =:= basic_get_ipv6_ssl ->
-            CertsDir = ?config(rmq_certsdir, Config),
-            {
-              rabbit_ct_broker_helpers:get_node_config(Config, 0,
-                tcp_port_amqp_tls),
-              [
-                {cacertfile, filename:join([CertsDir, "testca", "cacert.pem"])},
-                {certfile, filename:join([CertsDir, "client", "cert.pem"])},
-                {keyfile, filename:join([CertsDir, "client", "key.pem"])},
-                {verify, verify_peer},
-                {fail_if_no_peer_cert, true}
-              ]
-            };
-        true ->
-            {
-              rabbit_ct_broker_helpers:get_node_config(Config, 0,
-                tcp_port_amqp),
-              none
-            }
-    end,
-    ChannelMax = case Test of
-        channel_tune_negotiation -> 10;
-        _                        -> ?config(rmq_channel_max, Config)
-    end,
-    ConnParams = case ?config(amqp_client_conn_type, Config) of
-        direct ->
-            #amqp_params_direct{
-              username     = Username,
-              password     = Password,
-              node         = rabbit_ct_broker_helpers:get_node_config(Config,
-                               0, nodename),
-              virtual_host = VHost};
-        network ->
-            #amqp_params_network{
-              username     = Username,
-              password     = Password,
-              host         = Hostname,
-              port         = Port,
-              virtual_host = VHost,
-              channel_max  = ChannelMax,
-              ssl_options  = SSLOpts}
-    end,
-    rabbit_ct_helpers:set_config(Config,
-                                 {amqp_client_conn_params, ConnParams}).
-
-end_per_testcase(Test, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Test).
-
-%% -------------------------------------------------------------------
-
-basic_get_direct(Config)   -> basic_get(Config).
-basic_get_ipv4(Config)     -> basic_get(Config).
-basic_get_ipv6(Config)     -> basic_get(Config).
-basic_get_ipv4_ssl(Config) -> basic_get(Config).
-basic_get_ipv6_ssl(Config) -> basic_get(Config).
-
-basic_get(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    Payload = <<"foobar">>,
-    {ok, Q} = setup_publish(Channel, Payload),
-    get_and_assert_equals(Channel, Q, Payload),
-    get_and_assert_empty(Channel, Q),
-    teardown(Connection, Channel).
-
-named_connection(Config) ->
-    ConnName = <<"Custom Name">>,
-    Params = ?config(amqp_client_conn_params, Config),
-    {ok, Connection} = amqp_connection:start(Params, ConnName),
-    ConnName = amqp_connection:connection_name(Connection),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    Payload = <<"foobar">>,
-    {ok, Q} = setup_publish(Channel, Payload),
-    get_and_assert_equals(Channel, Q, Payload),
-    get_and_assert_empty(Channel, Q),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-simultaneous_close(Config) ->
-    {ok, Connection} = new_connection(Config),
-    %% We pick a high channel number, to avoid any conflict with other
-    %% tests running in parallel.
-    ChannelNumber = case ?config(rmq_channel_max, Config) of
-        0 -> ?MAX_CHANNEL_NUMBER;
-        N -> N
-    end,
-    {ok, Channel1} = amqp_connection:open_channel(Connection, ChannelNumber),
-
-    %% Publish to non-existent exchange and immediately close channel
-    amqp_channel:cast(Channel1, #'basic.publish'{exchange = <<"does-not-exist">>,
-                                                 routing_key = <<"a">>},
-                               #amqp_msg{payload = <<"foobar">>}),
-    try amqp_channel:close(Channel1) of
-        ok      -> wait_for_death(Channel1);
-        closing -> wait_for_death(Channel1)
-    catch
-        exit:{noproc, _}                                              -> ok;
-        exit:{{shutdown, {server_initiated_close, ?NOT_FOUND, _}}, _} -> ok
-    end,
-
-    %% Channel2 (opened with the exact same number as Channel1)
-    %% should not receive a close_ok (which is intended for Channel1)
-    {ok, Channel2} = amqp_connection:open_channel(Connection, ChannelNumber),
-
-    %% Make sure Channel2 functions normally
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Channel2,
-          #'exchange.declare'{exchange = <<"simultaneous_close">>}),
-    #'exchange.delete_ok'{} =
-        amqp_channel:call(Channel2,
-          #'exchange.delete'{exchange = <<"simultaneous_close">>}),
-
-    teardown(Connection, Channel2).
-
-%% -------------------------------------------------------------------
-
-basic_qos(Config) ->
-    [NoQos, Qos] = [basic_qos_test(Config, Prefetch) || Prefetch <- [0,1]],
-    ExpectedRatio = (1+1) / (1+50/5),
-    FudgeFactor = 2, %% account for timing variations
-    ct:pal(?LOW_IMPORTANCE,
-      "QOS=0 -> ~p (noqos)~n"
-      "QOS=1 -> ~p (qos)~n"
-      "qos / noqos < ~p * ~p = ~p < ~p = ~p~n",
-      [NoQos, Qos, ExpectedRatio, FudgeFactor, Qos / NoQos, ExpectedRatio * FudgeFactor, Qos / NoQos < ExpectedRatio * FudgeFactor]),
-    true = Qos / NoQos < ExpectedRatio * FudgeFactor.
-
-basic_qos_test(Config, Prefetch) ->
-    {ok, Connection} = new_connection(Config),
-    Messages = 100,
-    Workers = [5, 50],
-    Parent = self(),
-    {ok, Chan} = amqp_connection:open_channel(Connection),
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Chan, #'queue.declare'{}),
-    Kids = [spawn(
-            fun() ->
-                {ok, Channel} = amqp_connection:open_channel(Connection),
-                amqp_channel:call(Channel,
-                                  #'basic.qos'{prefetch_count = Prefetch}),
-                amqp_channel:call(Channel,
-                                  #'basic.consume'{queue = Q}),
-                Parent ! finished,
-                sleeping_consumer(Channel, Sleep, Parent)
-            end) || Sleep <- Workers],
-    latch_loop(length(Kids)),
-    spawn(fun() -> {ok, Channel} = amqp_connection:open_channel(Connection),
-                   producer_loop(Channel, Q, Messages)
-          end),
-    {Res, _} = timer:tc(erlang, apply, [fun latch_loop/1, [Messages]]),
-    [Kid ! stop || Kid <- Kids],
-    latch_loop(length(Kids)),
-    teardown(Connection, Chan),
-    Res.
-
-sleeping_consumer(Channel, Sleep, Parent) ->
-    receive
-        stop ->
-            do_stop(Channel, Parent);
-        #'basic.consume_ok'{} ->
-            sleeping_consumer(Channel, Sleep, Parent);
-        #'basic.cancel_ok'{}  ->
-            exit(unexpected_cancel_ok);
-        {#'basic.deliver'{delivery_tag = DeliveryTag}, _Content} ->
-            Parent ! finished,
-            receive stop -> do_stop(Channel, Parent)
-            after Sleep -> ok
-            end,
-            amqp_channel:cast(Channel,
-                              #'basic.ack'{delivery_tag = DeliveryTag}),
-            sleeping_consumer(Channel, Sleep, Parent)
-    end.
-
-do_stop(Channel, Parent) ->
-    Parent ! finished,
-    amqp_channel:close(Channel),
-    wait_for_death(Channel),
-    exit(normal).
-
-producer_loop(Channel, _RoutingKey, 0) ->
-    amqp_channel:close(Channel),
-    wait_for_death(Channel),
-    ok;
-
-producer_loop(Channel, RoutingKey, N) ->
-    Publish = #'basic.publish'{exchange = <<>>, routing_key = RoutingKey},
-    amqp_channel:call(Channel, Publish, #amqp_msg{payload = <<>>}),
-    producer_loop(Channel, RoutingKey, N - 1).
-
-%% -------------------------------------------------------------------
-
-basic_recover(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(
-                        Connection, {amqp_direct_consumer, [self()]}),
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Channel, #'queue.declare'{}),
-    #'basic.consume_ok'{consumer_tag = Tag} =
-        amqp_channel:call(Channel, #'basic.consume'{queue = Q}),
-    receive #'basic.consume_ok'{consumer_tag = Tag} -> ok end,
-    Publish = #'basic.publish'{exchange = <<>>, routing_key = Q},
-    amqp_channel:call(Channel, Publish, #amqp_msg{payload = <<"foobar">>}),
-    receive
-        {#'basic.deliver'{consumer_tag = Tag}, _} ->
-            %% no_ack set to false, but don't send ack
-            ok
-    end,
-    BasicRecover = #'basic.recover'{requeue = true},
-    amqp_channel:cast(Channel, BasicRecover),
-    receive
-        {#'basic.deliver'{consumer_tag = Tag,
-                          delivery_tag = DeliveryTag2}, _} ->
-            amqp_channel:cast(Channel,
-                              #'basic.ack'{delivery_tag = DeliveryTag2})
-    end,
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-basic_consume(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    X = <<"basic_consume">>,
-    amqp_channel:call(Channel, #'exchange.declare'{exchange = X}),
-    RoutingKey = <<"key">>,
-    Parent = self(),
-    [spawn_link(fun () ->
-                        consume_loop(Channel, X, RoutingKey, Parent, <<Tag:32>>)
-                end) || Tag <- lists:seq(1, ?LATCH)],
-    latch_loop(?LATCH),
-    Publish = #'basic.publish'{exchange = X, routing_key = RoutingKey},
-    amqp_channel:call(Channel, Publish, #amqp_msg{payload = <<"foobar">>}),
-    latch_loop(?LATCH),
-    amqp_channel:call(Channel, #'exchange.delete'{exchange = X}),
-    teardown(Connection, Channel).
-
-consume_loop(Channel, X, RoutingKey, Parent, Tag) ->
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Channel, #'queue.declare'{}),
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Channel, #'queue.bind'{queue = Q,
-                                                 exchange = X,
-                                                 routing_key = RoutingKey}),
-    #'basic.consume_ok'{} =
-        amqp_channel:call(Channel,
-                          #'basic.consume'{queue = Q, consumer_tag = Tag}),
-    receive #'basic.consume_ok'{consumer_tag = Tag} -> ok end,
-    Parent ! finished,
-    receive {#'basic.deliver'{}, _} -> ok end,
-    #'basic.cancel_ok'{} =
-        amqp_channel:call(Channel, #'basic.cancel'{consumer_tag = Tag}),
-    receive #'basic.cancel_ok'{consumer_tag = Tag} -> ok end,
-    Parent ! finished.
-
-%% -------------------------------------------------------------------
-
-consume_notification(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Channel, #'queue.declare'{}),
-    #'basic.consume_ok'{consumer_tag = CTag} = ConsumeOk =
-        amqp_channel:call(Channel, #'basic.consume'{queue = Q}),
-    receive ConsumeOk -> ok end,
-    #'queue.delete_ok'{} =
-        amqp_channel:call(Channel, #'queue.delete'{queue = Q}),
-    receive #'basic.cancel'{consumer_tag = CTag} -> ok end,
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-basic_nack(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'queue.declare_ok'{queue = Q}
-        = amqp_channel:call(Channel, #'queue.declare'{}),
-
-    Payload = <<"m1">>,
-
-    amqp_channel:call(Channel,
-                      #'basic.publish'{exchange = <<>>, routing_key = Q},
-                      #amqp_msg{payload = Payload}),
-
-    #'basic.get_ok'{delivery_tag = Tag} =
-        get_and_assert_equals(Channel, Q, Payload, false),
-
-    amqp_channel:call(Channel, #'basic.nack'{delivery_tag = Tag,
-                                             multiple     = false,
-                                             requeue      = false}),
-
-    get_and_assert_empty(Channel, Q),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-large_content(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'queue.declare_ok'{queue = Q}
-        = amqp_channel:call(Channel, #'queue.declare'{}),
-    F = list_to_binary([rand_compat:uniform(256)-1 || _ <- lists:seq(1, 1000)]),
-    Payload = list_to_binary([F || _ <- lists:seq(1, 1000)]),
-    Publish = #'basic.publish'{exchange = <<>>, routing_key = Q},
-    amqp_channel:call(Channel, Publish, #amqp_msg{payload = Payload}),
-    get_and_assert_equals(Channel, Q, Payload),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-lifecycle(Config) ->
-    {ok, Connection} = new_connection(Config),
-    X = <<"lifecycle">>,
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    amqp_channel:call(Channel,
-                      #'exchange.declare'{exchange = X,
-                                          type = <<"topic">>}),
-    Parent = self(),
-    [spawn(fun () -> queue_exchange_binding(Channel, X, Parent, Tag) end)
-     || Tag <- lists:seq(1, ?LATCH)],
-    latch_loop(?LATCH),
-    amqp_channel:call(Channel, #'exchange.delete'{exchange = X}),
-    teardown(Connection, Channel).
-
-queue_exchange_binding(Channel, X, Parent, Tag) ->
-    receive
-        nothing -> ok
-    after (?LATCH - Tag rem 7) * 10 ->
-        ok
-    end,
-    Q = list_to_binary(rabbit_misc:format("lifecycle.a.b.c.~b", [Tag])),
-    Binding = <<"lifecycle.a.b.c.*">>,
-    #'queue.declare_ok'{queue = Q1}
-        = amqp_channel:call(Channel, #'queue.declare'{queue = Q}),
-    Q = Q1,
-    Route = #'queue.bind'{queue = Q,
-                          exchange = X,
-                          routing_key = Binding},
-    amqp_channel:call(Channel, Route),
-    amqp_channel:call(Channel, #'queue.delete'{queue = Q}),
-    Parent ! finished.
-
-%% -------------------------------------------------------------------
-
-no_user(Config)     -> no_something(Config).
-no_password(Config) -> no_something(Config).
-
-no_something(Config) ->
-    {ok, Connection} = new_connection(Config),
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-no_vhost(Config) ->
-    {error, not_allowed} = new_connection(Config),
-    ok.
-
-%% -------------------------------------------------------------------
-
-nowait_exchange_declare(Config) ->
-    {ok, Connection} = new_connection(Config),
-    X = <<"nowait_exchange_declare">>,
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    ok = amqp_channel:call(Channel, #'exchange.declare'{exchange = X,
-                                                        type = <<"topic">>,
-                                                        nowait = true}),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-channel_repeat_open_close(Config) ->
-    {ok, Connection} = new_connection(Config),
-    lists:foreach(
-        fun(_) ->
-            {ok, Ch} = amqp_connection:open_channel(Connection),
-            ok = amqp_channel:close(Ch)
-        end, lists:seq(1, 50)),
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-channel_multi_open_close(Config) ->
-    {ok, Connection} = new_connection(Config),
-    [spawn_link(
-        fun() ->
-            try amqp_connection:open_channel(Connection) of
-                {ok, Ch}           -> try amqp_channel:close(Ch) of
-                                          ok                 -> ok;
-                                          closing            -> ok
-                                      catch
-                                          exit:{noproc, _} -> ok;
-                                          exit:{normal, _} -> ok
-                                      end;
-                closing            -> ok
-            catch
-                exit:{noproc, _} -> ok;
-                exit:{normal, _} -> ok
-            end
-        end) || _ <- lists:seq(1, 50)],
-    erlang:yield(),
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-basic_ack(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    {ok, Q} = setup_publish(Channel),
-    {#'basic.get_ok'{delivery_tag = Tag}, _}
-        = amqp_channel:call(Channel, #'basic.get'{queue = Q, no_ack = false}),
-    amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-basic_ack_call(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    {ok, Q} = setup_publish(Channel),
-    {#'basic.get_ok'{delivery_tag = Tag}, _}
-        = amqp_channel:call(Channel, #'basic.get'{queue = Q, no_ack = false}),
-    amqp_channel:call(Channel, #'basic.ack'{delivery_tag = Tag}),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-channel_lifecycle(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    amqp_channel:close(Channel),
-    {ok, Channel2} = amqp_connection:open_channel(Connection),
-    teardown(Connection, Channel2).
-
-%% -------------------------------------------------------------------
-
-queue_unbind(Config) ->
-    {ok, Connection} = new_connection(Config),
-    X = <<"queue_unbind-eggs">>,
-    Q = <<"queue_unbind-foobar">>,
-    Key = <<"quay">>,
-    Payload = <<"foobar">>,
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    amqp_channel:call(Channel, #'exchange.declare'{exchange = X}),
-    amqp_channel:call(Channel, #'queue.declare'{queue = Q}),
-    Bind = #'queue.bind'{queue = Q,
-                         exchange = X,
-                         routing_key = Key},
-    amqp_channel:call(Channel, Bind),
-    Publish = #'basic.publish'{exchange = X, routing_key = Key},
-    amqp_channel:call(Channel, Publish, Msg = #amqp_msg{payload = Payload}),
-    get_and_assert_equals(Channel, Q, Payload),
-    Unbind = #'queue.unbind'{queue = Q,
-                             exchange = X,
-                             routing_key = Key},
-    amqp_channel:call(Channel, Unbind),
-    amqp_channel:call(Channel, Publish, Msg),
-    get_and_assert_empty(Channel, Q),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-%% This is designed to exercize the internal queuing mechanism
-%% to ensure that sync methods are properly serialized
-sync_method_serialization(Config) ->
-    abstract_method_serialization_test(
-        "sync_method_serialization", Config,
-        fun (_, _) -> ok end,
-        fun (Channel, _, _, _, Count) ->
-                Q = fmt("sync_method_serialization-~p", [Count]),
-                #'queue.declare_ok'{queue = Q1} =
-                    amqp_channel:call(Channel,
-                                      #'queue.declare'{queue     = Q,
-                                                       exclusive = true}),
-                Q = Q1
-        end,
-        fun (_, _, _, _, _) -> ok end).
-
-%% This is designed to exercize the internal queuing mechanism
-%% to ensure that sending async methods and then a sync method is serialized
-%% properly
-async_sync_method_serialization(Config) ->
-    abstract_method_serialization_test(
-        "async_sync_method_serialization", Config,
-        fun (Channel, _X) ->
-                #'queue.declare_ok'{queue = Q} =
-                    amqp_channel:call(Channel, #'queue.declare'{}),
-                Q
-        end,
-        fun (Channel, X, Payload, _, _) ->
-                %% The async methods
-                ok = amqp_channel:call(Channel,
-                                       #'basic.publish'{exchange = X,
-                                                        routing_key = <<"a">>},
-                                       #amqp_msg{payload = Payload})
-        end,
-        fun (Channel, X, _, Q, _) ->
-                %% The sync method
-                #'queue.bind_ok'{} =
-                    amqp_channel:call(Channel,
-                                      #'queue.bind'{exchange = X,
-                                                    queue = Q,
-                                                    routing_key = <<"a">>}),
-                %% No message should have been routed
-                #'queue.declare_ok'{message_count = 0} =
-                    amqp_channel:call(Channel,
-                                      #'queue.declare'{queue = Q,
-                                                       passive = true})
-        end).
-
-%% This is designed to exercize the internal queuing mechanism
-%% to ensure that sending sync methods and then an async method is serialized
-%% properly
-sync_async_method_serialization(Config) ->
-    abstract_method_serialization_test(
-        "sync_async_method_serialization", Config,
-        fun (_, _) -> ok end,
-        fun (Channel, X, _Payload, _, _) ->
-                %% The sync methods (called with cast to resume immediately;
-                %% the order should still be preserved)
-                #'queue.declare_ok'{queue = Q} =
-                    amqp_channel:call(Channel,
-                                      #'queue.declare'{exclusive = true}),
-                amqp_channel:cast(Channel, #'queue.bind'{exchange = X,
-                                                         queue = Q,
-                                                         routing_key= <<"a">>}),
-                Q
-        end,
-        fun (Channel, X, Payload, _, MultiOpRet) ->
-                #'confirm.select_ok'{} = amqp_channel:call(
-                                           Channel, #'confirm.select'{}),
-                ok = amqp_channel:call(Channel,
-                                       #'basic.publish'{exchange = X,
-                                                        routing_key = <<"a">>},
-                                       #amqp_msg{payload = Payload}),
-                %% All queues must have gotten this message
-                true = amqp_channel:wait_for_confirms(Channel),
-                lists:foreach(
-                    fun (Q) ->
-                            #'queue.declare_ok'{message_count = 1} =
-                                amqp_channel:call(
-                                  Channel, #'queue.declare'{queue   = Q,
-                                                            passive = true})
-                    end, lists:flatten(MultiOpRet))
-        end).
-
-abstract_method_serialization_test(Test, Config,
-                                   BeforeFun, MultiOpFun, AfterFun) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    X = list_to_binary(Test),
-    Payload = list_to_binary(["x" || _ <- lists:seq(1, 1000)]),
-    OpsPerProcess = 20,
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Channel, #'exchange.declare'{exchange = X,
-                                                       type = <<"topic">>}),
-    BeforeRet = BeforeFun(Channel, X),
-    Parent = self(),
-    [spawn(fun () -> Ret = [MultiOpFun(Channel, X, Payload, BeforeRet, I)
-                            || _ <- lists:seq(1, OpsPerProcess)],
-                   Parent ! {finished, Ret}
-           end) || I <- lists:seq(1, ?LATCH)],
-    MultiOpRet = latch_loop(?LATCH),
-    AfterFun(Channel, X, Payload, BeforeRet, MultiOpRet),
-    amqp_channel:call(Channel, #'exchange.delete'{exchange = X}),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-teardown(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    true = is_process_alive(Channel),
-    true = is_process_alive(Connection),
-    teardown(Connection, Channel),
-    false = is_process_alive(Channel),
-    false = is_process_alive(Connection).
-
-%% -------------------------------------------------------------------
-
-%% This tests whether RPC over AMQP produces the same result as invoking the
-%% same argument against the same underlying gen_server instance.
-rpc(Config) ->
-    {ok, Connection} = new_connection(Config),
-    Fun = fun(X) -> X + 1 end,
-    RPCHandler = fun(X) -> term_to_binary(Fun(binary_to_term(X))) end,
-    Q = <<"rpc-test">>,
-    Server = amqp_rpc_server:start(Connection, Q, RPCHandler),
-    Client = amqp_rpc_client:start(Connection, Q),
-    Input = 1,
-    Reply = amqp_rpc_client:call(Client, term_to_binary(Input)),
-    Expected = Fun(Input),
-    DecodedReply = binary_to_term(Reply),
-    Expected = DecodedReply,
-    amqp_rpc_client:stop(Client),
-    amqp_rpc_server:stop(Server),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    amqp_channel:call(Channel, #'queue.delete'{queue = Q}),
-    teardown(Connection, Channel).
-
-%% This tests if the RPC continues to generate valid correlation ids
-%% over a series of requests.
-rpc_client(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    Q = <<"rpc-client-test">>,
-    Latch = 255, % enough requests to tickle bad correlation ids
-    %% Start a server to return correlation ids to the client.
-    Server = spawn_link(fun() ->
-                                rpc_correlation_server(Channel, Q)
-                        end),
-    %% Generate a series of RPC requests on the same client.
-    Client = amqp_rpc_client:start(Connection, Q),
-    Parent = self(),
-    [spawn(fun() ->
-                   Reply = amqp_rpc_client:call(Client, <<>>),
-                   Parent ! {finished, Reply}
-           end) || _ <- lists:seq(1, Latch)],
-    %% Verify that the correlation ids are valid UTF-8 strings.
-    CorrelationIds = latch_loop(Latch),
-    [<<_/binary>> = DecodedId
-     || DecodedId <- [unicode:characters_to_binary(Id, utf8)
-                      || Id <- CorrelationIds]],
-    %% Cleanup.
-    Server ! stop,
-    amqp_rpc_client:stop(Client),
-    amqp_channel:call(Channel, #'queue.delete'{queue = Q}),
-    teardown(Connection, Channel).
-
-%% Consumer of RPC requests that replies with the CorrelationId.
-rpc_correlation_server(Channel, Q) ->
-    ok = amqp_channel:register_return_handler(Channel, self()),
-    #'queue.declare_ok'{queue = Q} =
-      amqp_channel:call(Channel, #'queue.declare'{queue = Q}),
-    #'basic.consume_ok'{} =
-      amqp_channel:call(Channel,
-                        #'basic.consume'{queue = Q,
-                                         consumer_tag = <<"server">>}),
-    ok = rpc_client_consume_loop(Channel),
-    #'basic.cancel_ok'{} =
-      amqp_channel:call(Channel,
-                        #'basic.cancel'{consumer_tag = <<"server">>}),
-    ok = amqp_channel:unregister_return_handler(Channel).
-
-rpc_client_consume_loop(Channel) ->
-    receive
-        stop ->
-            ok;
-        {#'basic.deliver'{delivery_tag = DeliveryTag},
-         #amqp_msg{props = Props}} ->
-            #'P_basic'{correlation_id = CorrelationId,
-                       reply_to = Q} = Props,
-            Properties = #'P_basic'{correlation_id = CorrelationId},
-            Publish = #'basic.publish'{exchange = <<>>,
-                                       routing_key = Q,
-                                       mandatory = true},
-            amqp_channel:call(
-              Channel, Publish, #amqp_msg{props = Properties,
-                                          payload = CorrelationId}),
-            amqp_channel:call(
-              Channel, #'basic.ack'{delivery_tag = DeliveryTag}),
-            rpc_client_consume_loop(Channel);
-        _ ->
-            rpc_client_consume_loop(Channel)
-    after 3000 ->
-            exit(no_request_received)
-    end.
-
-%% -------------------------------------------------------------------
-
-%% Test for the network client
-%% Sends a bunch of messages and immediatly closes the connection without
-%% closing the channel. Then gets the messages back from the queue and expects
-%% all of them to have been sent.
-pub_and_close(Config) ->
-    {ok, Connection1} = new_connection(Config),
-    Payload = <<"eggs">>,
-    NMessages = 50000,
-    {ok, Channel1} = amqp_connection:open_channel(Connection1),
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Channel1, #'queue.declare'{}),
-    %% Send messages
-    pc_producer_loop(Channel1, <<>>, Q, Payload, NMessages),
-    %% Close connection without closing channels
-    amqp_connection:close(Connection1),
-    %% Get sent messages back and count them
-    {ok, Connection2} = new_connection(Config),
-    {ok, Channel2} = amqp_connection:open_channel(
-                         Connection2, {amqp_direct_consumer, [self()]}),
-    amqp_channel:call(Channel2, #'basic.consume'{queue = Q, no_ack = true}),
-    receive #'basic.consume_ok'{} -> ok end,
-    true = (pc_consumer_loop(Channel2, Payload, 0) == NMessages),
-    %% Make sure queue is empty
-    #'queue.declare_ok'{queue = Q, message_count = NRemaining} =
-        amqp_channel:call(Channel2, #'queue.declare'{queue   = Q,
-                                                     passive = true}),
-    true = (NRemaining == 0),
-    amqp_channel:call(Channel2, #'queue.delete'{queue = Q}),
-    teardown(Connection2, Channel2).
-
-pc_producer_loop(_, _, _, _, 0) -> ok;
-pc_producer_loop(Channel, X, Key, Payload, NRemaining) ->
-    Publish = #'basic.publish'{exchange = X, routing_key = Key},
-    ok = amqp_channel:call(Channel, Publish, #amqp_msg{payload = Payload}),
-    pc_producer_loop(Channel, X, Key, Payload, NRemaining - 1).
-
-pc_consumer_loop(Channel, Payload, NReceived) ->
-    receive
-        {#'basic.deliver'{},
-         #amqp_msg{payload = DeliveredPayload}} ->
-            case DeliveredPayload of
-                Payload ->
-                    pc_consumer_loop(Channel, Payload, NReceived + 1);
-                _ ->
-                    exit(received_unexpected_content)
-            end
-    after 1000 ->
-        NReceived
-    end.
-
-%% -------------------------------------------------------------------
-
-channel_tune_negotiation(Config) ->
-    {ok, Connection} = new_connection(Config),
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-confirm(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'confirm.select_ok'{} = amqp_channel:call(Channel, #'confirm.select'{}),
-    amqp_channel:register_confirm_handler(Channel, self()),
-    {ok, Q} = setup_publish(Channel),
-    {#'basic.get_ok'{}, _}
-        = amqp_channel:call(Channel, #'basic.get'{queue = Q, no_ack = false}),
-    ok = receive
-             #'basic.ack'{}  -> ok;
-             #'basic.nack'{} -> fail
-         after 2000 ->
-                 exit(did_not_receive_pub_ack)
-         end,
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-confirm_barrier(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'confirm.select_ok'{} = amqp_channel:call(Channel, #'confirm.select'{}),
-    [amqp_channel:call(
-        Channel,
-        #'basic.publish'{routing_key = <<"whoosh-confirm_barrier">>},
-        #amqp_msg{payload = <<"foo">>})
-     || _ <- lists:seq(1, 1000)], %% Hopefully enough to get a multi-ack
-    true = amqp_channel:wait_for_confirms(Channel),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-confirm_select_before_wait(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    try amqp_channel:wait_for_confirms(Channel) of
-        _ -> exit(success_despite_lack_of_confirm_mode)
-    catch
-        not_in_confirm_mode -> ok
-    end,
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-confirm_barrier_timeout(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'confirm.select_ok'{} = amqp_channel:call(Channel, #'confirm.select'{}),
-    [amqp_channel:call(
-        Channel,
-        #'basic.publish'{routing_key = <<"whoosh-confirm_barrier_timeout">>},
-        #amqp_msg{payload = <<"foo">>})
-     || _ <- lists:seq(1, 1000)],
-    case amqp_channel:wait_for_confirms(Channel, 0) of
-        true    -> ok;
-        timeout -> ok
-    end,
-    true = amqp_channel:wait_for_confirms(Channel),
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-confirm_barrier_die_timeout(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    #'confirm.select_ok'{} = amqp_channel:call(Channel, #'confirm.select'{}),
-    [amqp_channel:call(
-        Channel,
-        #'basic.publish'{routing_key = <<"whoosh-confirm_barrier_die_timeout">>},
-        #amqp_msg{payload = <<"foo">>})
-     || _ <- lists:seq(1, 1000)],
-    try amqp_channel:wait_for_confirms_or_die(Channel, 0) of
-        true -> ok
-    catch
-        exit:timeout -> ok
-    end,
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-default_consumer(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    amqp_selective_consumer:register_default_consumer(Channel, self()),
-
-    #'queue.declare_ok'{queue = Q}
-        = amqp_channel:call(Channel, #'queue.declare'{}),
-    Pid = spawn(fun () -> receive
-                          after 10000 -> ok
-                          end
-                end),
-    #'basic.consume_ok'{} =
-        amqp_channel:subscribe(Channel, #'basic.consume'{queue = Q}, Pid),
-    erlang:monitor(process, Pid),
-    exit(Pid, shutdown),
-    receive
-        {'DOWN', _, process, _, _} ->
-            io:format("little consumer died out~n")
-    end,
-    Payload = <<"for the default consumer">>,
-    amqp_channel:call(Channel,
-                      #'basic.publish'{exchange = <<>>, routing_key = Q},
-                      #amqp_msg{payload = Payload}),
-
-    receive
-        {#'basic.deliver'{}, #'amqp_msg'{payload = Payload}} ->
-            ok
-    after 1000 ->
-            exit('default_consumer_didnt_work')
-    end,
-    teardown(Connection, Channel).
-
-%% -------------------------------------------------------------------
-
-subscribe_nowait(Config) ->
-    {ok, Conn} = new_connection(Config),
-    {ok, Ch} = amqp_connection:open_channel(Conn),
-    {ok, Q} = setup_publish(Ch),
-    CTag = <<"ctag">>,
-    amqp_selective_consumer:register_default_consumer(Ch, self()),
-    ok = amqp_channel:call(Ch, #'basic.consume'{queue        = Q,
-                                                consumer_tag = CTag,
-                                                nowait       = true}),
-    ok = amqp_channel:call(Ch, #'basic.cancel' {consumer_tag = CTag,
-                                                nowait       = true}),
-    ok = amqp_channel:call(Ch, #'basic.consume'{queue        = Q,
-                                                consumer_tag = CTag,
-                                                nowait       = true}),
-    receive
-        #'basic.consume_ok'{} ->
-            exit(unexpected_consume_ok);
-        {#'basic.deliver'{delivery_tag = DTag}, _Content} ->
-            amqp_channel:cast(Ch, #'basic.ack'{delivery_tag = DTag})
-    end,
-    teardown(Conn, Ch).
-
-%% -------------------------------------------------------------------
-
-%% connection.blocked, connection.unblocked
-
-connection_blocked_network(Config) ->
-    {ok, Connection} = new_connection(Config),
-    X = <<"amq.direct">>,
-    K = Payload = <<"x">>,
-    clear_resource_alarm(memory, Config),
-    timer:sleep(1000),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    Parent = self(),
-    Child = spawn_link(
-              fun() ->
-                      receive
-                          #'connection.blocked'{} -> ok
-                      end,
-                      clear_resource_alarm(memory, Config),
-                      receive
-                          #'connection.unblocked'{} -> ok
-                      end,
-                      Parent ! ok
-              end),
-    amqp_connection:register_blocked_handler(Connection, Child),
-    set_resource_alarm(memory, Config),
-    Publish = #'basic.publish'{exchange = X,
-                               routing_key = K},
-    amqp_channel:call(Channel, Publish,
-                      #amqp_msg{payload = Payload}),
-    timer:sleep(1000),
-    receive
-        ok ->
-            clear_resource_alarm(memory, Config),
-            clear_resource_alarm(disk, Config),
-            ok
-    after 10000 ->
-        clear_resource_alarm(memory, Config),
-        clear_resource_alarm(disk, Config),
-        exit(did_not_receive_connection_blocked)
-    end,
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-%% Negative test cases.
-%% -------------------------------------------------------------------
-
-non_existent_exchange(Config) ->
-    {ok, Connection} = new_connection(Config),
-    X = <<"test-non_existent_exchange">>,
-    RoutingKey = <<"a-non_existent_exchange">>,
-    Payload = <<"foobar">>,
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    {ok, OtherChannel} = amqp_connection:open_channel(Connection),
-    amqp_channel:call(Channel, #'exchange.declare'{exchange = X}),
-
-    %% Deliberately mix up the routingkey and exchange arguments
-    Publish = #'basic.publish'{exchange = RoutingKey, routing_key = X},
-    amqp_channel:call(Channel, Publish, #amqp_msg{payload = Payload}),
-    wait_for_death(Channel),
-
-    %% Make sure Connection and OtherChannel still serve us and are not dead
-    {ok, _} = amqp_connection:open_channel(Connection),
-    amqp_channel:call(OtherChannel, #'exchange.delete'{exchange = X}),
-    amqp_connection:close(Connection).
-
-%% -------------------------------------------------------------------
-
-bogus_rpc(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    %% Deliberately bind to a non-existent queue
-    Bind = #'queue.bind'{exchange    = <<"amq.topic">>,
-                         queue       = <<"does-not-exist">>,
-                         routing_key = <<>>},
-    try amqp_channel:call(Channel, Bind) of
-        _ -> exit(expected_to_exit)
-    catch
-        exit:{{shutdown, {server_initiated_close, Code, _}},_} ->
-            ?NOT_FOUND = Code
-    end,
-    wait_for_death(Channel),
-    true = is_process_alive(Connection),
-    amqp_connection:close(Connection).
-
-%% -------------------------------------------------------------------
-
-hard_error(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    {ok, OtherChannel} = amqp_connection:open_channel(Connection),
-    OtherChannelMonitor = erlang:monitor(process, OtherChannel),
-    Qos = #'basic.qos'{prefetch_size = 10000000},
-    try amqp_channel:call(Channel, Qos) of
-        _ -> exit(expected_to_exit)
-    catch
-        exit:{{shutdown, {connection_closing,
-                          {server_initiated_close, ?NOT_IMPLEMENTED, _}}}, _} ->
-            ok
-    end,
-    receive
-        {'DOWN', OtherChannelMonitor, process, OtherChannel, OtherExit} ->
-            {shutdown,
-             {connection_closing,
-              {server_initiated_close, ?NOT_IMPLEMENTED, _}}} = OtherExit
-    end,
-    wait_for_death(Channel),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-non_existent_user(Config) ->
-    {error, {auth_failure, _}} = new_connection(Config).
-
-%% -------------------------------------------------------------------
-
-invalid_password(Config) ->
-    {error, {auth_failure, _}} = new_connection(Config).
-
-%% -------------------------------------------------------------------
-
-non_existent_vhost(Config) ->
-    {error, not_allowed} = new_connection(Config).
-
-%% -------------------------------------------------------------------
-
-no_permission(Config) ->
-    {error, not_allowed} = new_connection(Config).
-
-%% -------------------------------------------------------------------
-
-%% An error in a channel should result in the death of the entire connection.
-%% The death of the channel is caused by an error in generating the frames
-%% (writer dies)
-channel_writer_death(Config) ->
-    ConnType = ?config(amqp_client_conn_type, Config),
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    Publish = #'basic.publish'{routing_key = <<>>, exchange = <<>>},
-    QoS = #'basic.qos'{prefetch_count = 0},
-    Message = #amqp_msg{props = <<>>, payload = <<>>},
-    amqp_channel:cast(Channel, Publish, Message),
-    try
-        Ret = amqp_channel:call(Channel, QoS),
-        throw({unexpected_success, Ret})
-    catch
-        exit:{{function_clause,
-               [{rabbit_channel, check_user_id_header, _, _} | _]}, _}
-        when ConnType =:= direct -> ok;
-
-        exit:{{infrastructure_died, {unknown_properties_record, <<>>}}, _}
-        when ConnType =:= network -> ok
-    end,
-    wait_for_death(Channel),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-%% The connection should die if the underlying connection is prematurely
-%% closed. For a network connection, this means that the TCP socket is
-%% closed. For a direct connection (remotely only, of course), this means that
-%% the RabbitMQ node appears as down.
-connection_failure(Config) ->
-    {ok, Connection} = new_connection(Config),
-    case amqp_connection:info(Connection, [type, amqp_params]) of
-        [{type, direct}, {amqp_params, Params}]  ->
-            case Params#amqp_params_direct.node of
-                N when N == node() ->
-                    amqp_connection:close(Connection);
-                N ->
-                    true = erlang:disconnect_node(N),
-                    net_adm:ping(N)
-            end;
-        [{type, network}, {amqp_params, _}] ->
-            [{sock, Sock}] = amqp_connection:info(Connection, [sock]),
-            ok = gen_tcp:close(Sock)
-    end,
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-%% An error in the channel process should result in the death of the entire
-%% connection. The death of the channel is caused by making a call with an
-%% invalid message to the channel process
-channel_death(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    try
-        Ret = amqp_channel:call(Channel, bogus_message),
-        throw({unexpected_success, Ret})
-    catch
-        exit:{{badarg,
-               [{amqp_channel, is_connection_method, 1, _} | _]}, _} -> ok
-    end,
-    wait_for_death(Channel),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-%% Attempting to send a shortstr longer than 255 bytes in a property field
-%% should fail - this only applies to the network case
-shortstr_overflow_property(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    SentString = << <<"k">> || _ <- lists:seq(1, 340)>>,
-    #'queue.declare_ok'{queue = Q}
-        = amqp_channel:call(Channel, #'queue.declare'{exclusive = true}),
-    Publish = #'basic.publish'{exchange = <<>>, routing_key = Q},
-    PBasic = #'P_basic'{content_type = SentString},
-    AmqpMsg = #amqp_msg{payload = <<"foobar">>, props = PBasic},
-    QoS = #'basic.qos'{prefetch_count = 0},
-    amqp_channel:cast(Channel, Publish, AmqpMsg),
-    try
-        Ret = amqp_channel:call(Channel, QoS),
-        throw({unexpected_success, Ret})
-    catch
-        exit:{{infrastructure_died, content_properties_shortstr_overflow}, _} -> ok
-    end,
-    wait_for_death(Channel),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-%% Attempting to send a shortstr longer than 255 bytes in a method's field
-%% should fail - this only applies to the network case
-shortstr_overflow_field(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    SentString = << <<"k">> || _ <- lists:seq(1, 340)>>,
-    #'queue.declare_ok'{queue = Q}
-        = amqp_channel:call(Channel, #'queue.declare'{exclusive = true}),
-    try
-        Ret = amqp_channel:call(
-                Channel, #'basic.consume'{queue = Q,
-                                          no_ack = true,
-                                          consumer_tag = SentString}),
-        throw({unexpected_success, Ret})
-    catch
-        exit:{{infrastructure_died, method_field_shortstr_overflow}, _} -> ok
-    end,
-    wait_for_death(Channel),
-    wait_for_death(Connection).
-
-%% -------------------------------------------------------------------
-
-%% Simulates a #'connection.open'{} method received on non-zero channel. The
-%% connection is expected to send a '#connection.close{}' to the server with
-%% reply code command_invalid
-command_invalid_over_channel(Config) ->
-    {ok, Connection} = new_connection(Config),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    MonitorRef = erlang:monitor(process, Connection),
-    case amqp_connection:info(Connection, [type]) of
-        [{type, direct}]  -> Channel ! {send_command, #'connection.open'{}};
-        [{type, network}] -> gen_server:cast(Channel,
-                                 {method, #'connection.open'{}, none, noflow})
-    end,
-    assert_down_with_error(MonitorRef, command_invalid),
-    false = is_process_alive(Channel).
-
-%% -------------------------------------------------------------------
-
-%% Simulates a #'basic.ack'{} method received on channel zero. The connection
-%% is expected to send a '#connection.close{}' to the server with reply code
-%% command_invalid - this only applies to the network case
-command_invalid_over_channel0(Config) ->
-    {ok, Connection} = new_connection(Config),
-    gen_server:cast(Connection, {method, #'basic.ack'{}, none, noflow}),
-    MonitorRef = erlang:monitor(process, Connection),
-    assert_down_with_error(MonitorRef, command_invalid).
-
-%% -------------------------------------------------------------------
-%% Helpers.
-%% -------------------------------------------------------------------
-
-new_connection(Config) ->
-    Params = ?config(amqp_client_conn_params, Config),
-    amqp_connection:start(Params).
-
-setup_publish(Channel) ->
-    setup_publish(Channel, <<"foobar">>).
-
-setup_publish(Channel, Payload) ->
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Channel, #'queue.declare'{exclusive = true}),
-    ok = amqp_channel:call(Channel, #'basic.publish'{exchange    = <<>>,
-                                                     routing_key = Q},
-                           #amqp_msg{payload = Payload}),
-    {ok, Q}.
-
-teardown(Connection, Channel) ->
-    amqp_channel:close(Channel),
-    wait_for_death(Channel),
-    amqp_connection:close(Connection),
-    wait_for_death(Connection).
-
-wait_for_death(Pid) ->
-    Ref = erlang:monitor(process, Pid),
-    receive
-        {'DOWN', Ref, process, Pid, _Reason} ->
-            ok
-    after ?PROCESS_EXIT_TIMEOUT ->
-            exit({timed_out_waiting_for_process_death, Pid})
-    end.
-
-latch_loop() ->
-    latch_loop(?LATCH, []).
-
-latch_loop(Latch) ->
-    latch_loop(Latch, []).
-
-latch_loop(0, Acc) ->
-    Acc;
-latch_loop(Latch, Acc) ->
-    receive
-        finished        -> latch_loop(Latch - 1, Acc);
-        {finished, Ret} -> latch_loop(Latch - 1, [Ret | Acc])
-    after ?LATCH * ?WAIT -> exit(waited_too_long)
-    end.
-
-get_and_assert_empty(Channel, Q) ->
-    #'basic.get_empty'{}
-        = amqp_channel:call(Channel, #'basic.get'{queue = Q, no_ack = true}).
-
-get_and_assert_equals(Channel, Q, Payload) ->
-    get_and_assert_equals(Channel, Q, Payload, true).
-
-get_and_assert_equals(Channel, Q, Payload, NoAck) ->
-    {GetOk = #'basic.get_ok'{}, Content}
-        = amqp_channel:call(Channel, #'basic.get'{queue = Q, no_ack = NoAck}),
-    #amqp_msg{payload = Payload2} = Content,
-    Payload = Payload2,
-    GetOk.
-
-assert_down_with_error(MonitorRef, CodeAtom) ->
-    receive
-        {'DOWN', MonitorRef, process, _, Reason} ->
-            {shutdown, {server_misbehaved, Code, _}} = Reason,
-            CodeAtom = ?PROTOCOL:amqp_exception(Code)
-    after 2000 ->
-        exit(did_not_die)
-    end.
-
-set_resource_alarm(memory, Config) ->
-    SrcDir = ?config(amqp_client_srcdir, Config),
-    Nodename = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {ok, _} = rabbit_ct_helpers:make(Config, SrcDir, [
-        {"RABBITMQ_NODENAME=~s", [Nodename]},
-        "set-resource-alarm", "SOURCE=memory"]);
-set_resource_alarm(disk, Config) ->
-    SrcDir = ?config(amqp_client_srcdir, Config),
-    Nodename = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {ok, _} = rabbit_ct_helpers:make(Config, SrcDir, [
-        {"RABBITMQ_NODENAME=~s", [Nodename]},
-        "set-resource-alarm", "SOURCE=disk"]).
-
-clear_resource_alarm(memory, Config) ->
-    SrcDir = ?config(amqp_client_srcdir, Config),
-    Nodename = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {ok, _}= rabbit_ct_helpers:make(Config, SrcDir, [
-        {"RABBITMQ_NODENAME=~s", [Nodename]},
-        "clear-resource-alarm", "SOURCE=memory"]);
-clear_resource_alarm(disk, Config) ->
-    SrcDir = ?config(amqp_client_srcdir, Config),
-    Nodename = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {ok, _}= rabbit_ct_helpers:make(Config, SrcDir, [
-        {"RABBITMQ_NODENAME=~s", [Nodename]},
-        "clear-resource-alarm", "SOURCE=disk"]).
-
-fmt(Fmt, Args) -> list_to_binary(rabbit_misc:format(Fmt, Args)).
diff --git a/rabbitmq-server/deps/amqp_client/test/unit_SUITE.erl b/rabbitmq-server/deps/amqp_client/test/unit_SUITE.erl
deleted file mode 100644 (file)
index fbc2a2d..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--include("amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      amqp_uri_parsing,
-      route_destination_parsing
-    ].
-
-%% -------------------------------------------------------------------
-%% AMQP URI parsing.
-%% -------------------------------------------------------------------
-
-amqp_uri_parsing(_Config) ->
-    %% From the spec (adapted)
-    ?assertMatch({ok, #amqp_params_network{username     = <<"user">>,
-                                           password     = <<"pass">>,
-                                           host         = "host",
-                                           port         = 10000,
-                                           virtual_host = <<"vhost">>,
-                                           heartbeat    = 5}},
-                 amqp_uri:parse(
-                   "amqp://user:pass@host:10000/vhost?heartbeat=5")),
-    ?assertMatch({ok, #amqp_params_network{username     = <<"usera">>,
-                                           password     = <<"apass">>,
-                                           host         = "hoast",
-                                           port         = 10000,
-                                           virtual_host = <<"v/host">>}},
-                 amqp_uri:parse(
-                   "aMQp://user%61:%61pass@ho%61st:10000/v%2fhost")),
-    ?assertMatch({ok, #amqp_params_direct{}}, amqp_uri:parse("amqp://")),
-    ?assertMatch({ok, #amqp_params_direct{username     = <<"">>,
-                                          virtual_host = <<"">>}},
-                 amqp_uri:parse("amqp://:@/")),
-    ?assertMatch({ok, #amqp_params_network{username     = <<"">>,
-                                           password     = <<"">>,
-                                           virtual_host = <<"">>,
-                                           host         = "host"}},
-                 amqp_uri:parse("amqp://:@host/")),
-    ?assertMatch({ok, #amqp_params_direct{username = <<"user">>}},
-                 amqp_uri:parse("amqp://user@")),
-    ?assertMatch({ok, #amqp_params_network{username = <<"user">>,
-                                           password = <<"pass">>,
-                                           host     = "localhost"}},
-                 amqp_uri:parse("amqp://user:pass@localhost")),
-    ?assertMatch({ok, #amqp_params_network{host         = "host",
-                                           virtual_host = <<"/">>}},
-                 amqp_uri:parse("amqp://host")),
-    ?assertMatch({ok, #amqp_params_network{port = 10000,
-                                           host = "localhost"}},
-                 amqp_uri:parse("amqp://localhost:10000")),
-    ?assertMatch({ok, #amqp_params_direct{virtual_host = <<"vhost">>}},
-                 amqp_uri:parse("amqp:///vhost")),
-    ?assertMatch({ok, #amqp_params_network{host         = "host",
-                                           virtual_host = <<"">>}},
-                 amqp_uri:parse("amqp://host/")),
-    ?assertMatch({ok, #amqp_params_network{host         = "host",
-                                           virtual_host = <<"/">>}},
-                 amqp_uri:parse("amqp://host/%2f")),
-    ?assertMatch({ok, #amqp_params_network{host = "::1"}},
-                 amqp_uri:parse("amqp://[::1]")),
-
-    %% Varous other cases
-    ?assertMatch({ok, #amqp_params_network{host = "host", port = 100}},
-                 amqp_uri:parse("amqp://host:100")),
-    ?assertMatch({ok, #amqp_params_network{host = "::1", port = 100}},
-                 amqp_uri:parse("amqp://[::1]:100")),
-
-    ?assertMatch({ok, #amqp_params_network{host         = "host",
-                                           virtual_host = <<"blah">>}},
-                 amqp_uri:parse("amqp://host/blah")),
-    ?assertMatch({ok, #amqp_params_network{host         = "host",
-                                           port         = 100,
-                                           virtual_host = <<"blah">>}},
-                 amqp_uri:parse("amqp://host:100/blah")),
-    ?assertMatch({ok, #amqp_params_network{host         = "::1",
-                                           virtual_host = <<"blah">>}},
-                 amqp_uri:parse("amqp://[::1]/blah")),
-    ?assertMatch({ok, #amqp_params_network{host         = "::1",
-                                           port         = 100,
-                                           virtual_host = <<"blah">>}},
-                 amqp_uri:parse("amqp://[::1]:100/blah")),
-
-    ?assertMatch({ok, #amqp_params_network{username = <<"user">>,
-                                           password = <<"pass">>,
-                                           host     = "host"}},
-                 amqp_uri:parse("amqp://user:pass@host")),
-    ?assertMatch({ok, #amqp_params_network{username = <<"user">>,
-                                           password = <<"pass">>,
-                                           port     = 100}},
-                 amqp_uri:parse("amqp://user:pass@host:100")),
-    ?assertMatch({ok, #amqp_params_network{username = <<"user">>,
-                                           password = <<"pass">>,
-                                           host     = "::1"}},
-                 amqp_uri:parse("amqp://user:pass@[::1]")),
-    ?assertMatch({ok, #amqp_params_network{username = <<"user">>,
-                                           password = <<"pass">>,
-                                           host     = "::1",
-                                           port     = 100}},
-                 amqp_uri:parse("amqp://user:pass@[::1]:100")),
-
-    %% TLS options
-    {ok, #amqp_params_network{ssl_options = TLSOpts1}} =
-        amqp_uri:parse("amqps://host/%2f?cacertfile=/path/to/cacertfile.pem"),
-    ?assertEqual(lists:usort([{cacertfile,"/path/to/cacertfile.pem"}]),
-                 lists:usort(TLSOpts1)),
-
-    {ok, #amqp_params_network{ssl_options = TLSOpts2}} =
-        amqp_uri:parse("amqps://host/%2f?cacertfile=/path/to/cacertfile.pem"
-                       "&certfile=/path/to/certfile.pem"),
-    ?assertEqual(lists:usort([{certfile,  "/path/to/certfile.pem"},
-                              {cacertfile,"/path/to/cacertfile.pem"}]),
-                 lists:usort(TLSOpts2)),
-
-    {ok, #amqp_params_network{ssl_options = TLSOpts3}} =
-        amqp_uri:parse("amqps://host/%2f?verify=verify_peer"
-                       "&fail_if_no_peer_cert=true"),
-    ?assertEqual(lists:usort([{fail_if_no_peer_cert, true},
-                              {verify,               verify_peer}
-                             ]), lists:usort(TLSOpts3)),
-
-    {ok, #amqp_params_network{ssl_options = TLSOpts4}} =
-        amqp_uri:parse("amqps://host/%2f?cacertfile=/path/to/cacertfile.pem"
-                       "&certfile=/path/to/certfile.pem"
-                       "&password=topsecret"
-                       "&depth=5"),
-    ?assertEqual(lists:usort([{certfile,  "/path/to/certfile.pem"},
-                              {cacertfile,"/path/to/cacertfile.pem"},
-                              {password,  "topsecret"},
-                              {depth,     5}]),
-                 lists:usort(TLSOpts4)),
-
-    %% Various failure cases
-    ?assertMatch({error, _}, amqp_uri:parse("http://www.rabbitmq.com")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo:bar:baz")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo[::1]")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo:[::1]")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://[::1]foo")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo:1000xyz")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo:1000000")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo/bar/baz")),
-
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo%1")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo%1x")),
-    ?assertMatch({error, _}, amqp_uri:parse("amqp://foo%xy")),
-
-    ok.
-
-%% -------------------------------------------------------------------
-%% Route destination parsing.
-%% -------------------------------------------------------------------
-
-route_destination_parsing(_Config) ->
-    %% valid queue
-    ?assertMatch({ok, {queue, "test"}}, parse_dest("/queue/test")),
-
-    %% valid topic
-    ?assertMatch({ok, {topic, "test"}}, parse_dest("/topic/test")),
-
-    %% valid exchange
-    ?assertMatch({ok, {exchange, {"test", undefined}}}, parse_dest("/exchange/test")),
-
-    %% valid temp queue
-    ?assertMatch({ok, {temp_queue, "test"}}, parse_dest("/temp-queue/test")),
-
-    %% valid reply queue
-    ?assertMatch({ok, {reply_queue, "test"}}, parse_dest("/reply-queue/test")),
-    ?assertMatch({ok, {reply_queue, "test/2"}}, parse_dest("/reply-queue/test/2")),
-
-    %% valid exchange with pattern
-    ?assertMatch({ok, {exchange, {"test", "pattern"}}},
-        parse_dest("/exchange/test/pattern")),
-
-    %% valid pre-declared queue
-    ?assertMatch({ok, {amqqueue, "test"}}, parse_dest("/amq/queue/test")),
-
-    %% queue without name
-    ?assertMatch({error, {invalid_destination, queue, ""}}, parse_dest("/queue")),
-    ?assertMatch({ok, {queue, undefined}}, parse_dest("/queue", true)),
-
-    %% topic without name
-    ?assertMatch({error, {invalid_destination, topic, ""}}, parse_dest("/topic")),
-
-    %% exchange without name
-    ?assertMatch({error, {invalid_destination, exchange, ""}},
-        parse_dest("/exchange")),
-
-    %% exchange default name
-    ?assertMatch({error, {invalid_destination, exchange, "//foo"}},
-        parse_dest("/exchange//foo")),
-
-    %% amqqueue without name
-    ?assertMatch({error, {invalid_destination, amqqueue, ""}},
-        parse_dest("/amq/queue")),
-
-    %% queue without name with trailing slash
-    ?assertMatch({error, {invalid_destination, queue, "/"}}, parse_dest("/queue/")),
-
-    %% topic without name with trailing slash
-    ?assertMatch({error, {invalid_destination, topic, "/"}}, parse_dest("/topic/")),
-
-    %% exchange without name with trailing slash
-    ?assertMatch({error, {invalid_destination, exchange, "/"}},
-        parse_dest("/exchange/")),
-
-    %% queue with invalid name
-    ?assertMatch({error, {invalid_destination, queue, "/foo/bar"}},
-        parse_dest("/queue/foo/bar")),
-
-    %% topic with invalid name
-    ?assertMatch({error, {invalid_destination, topic, "/foo/bar"}},
-        parse_dest("/topic/foo/bar")),
-
-    %% exchange with invalid name
-    ?assertMatch({error, {invalid_destination, exchange, "/foo/bar/baz"}},
-        parse_dest("/exchange/foo/bar/baz")),
-
-    %% unknown destination
-    ?assertMatch({error, {unknown_destination, "/blah/boo"}},
-        parse_dest("/blah/boo")),
-
-    %% queue with escaped name
-    ?assertMatch({ok, {queue, "te/st"}}, parse_dest("/queue/te%2Fst")),
-
-    %% valid exchange with escaped name and pattern
-    ?assertMatch({ok, {exchange, {"te/st", "pa/tt/ern"}}},
-        parse_dest("/exchange/te%2Fst/pa%2Ftt%2Fern")),
-
-    ok.
-
-parse_dest(Destination, Params) ->
-    rabbit_routing_util:parse_endpoint(Destination, Params).
-parse_dest(Destination) ->
-    rabbit_routing_util:parse_endpoint(Destination).
diff --git a/rabbitmq-server/deps/cowboy/test/cover.spec b/rabbitmq-server/deps/cowboy/test/cover.spec
deleted file mode 100644 (file)
index 9dba11c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{incl_app, cowboy, details}.
diff --git a/rabbitmq-server/deps/cowboy/test/cowboy_ct_hook.erl b/rabbitmq-server/deps/cowboy/test/cowboy_ct_hook.erl
deleted file mode 100644 (file)
index 1586412..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-%% Copyright (c) 2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(cowboy_ct_hook).
-
--export([init/2]).
-
-init(_, _) ->
-       cowboy_test:start([cowboy, gun]),
-       cowboy_test:make_certs(),
-       error_logger:add_report_handler(cowboy_error_h),
-       {ok, undefined}.
diff --git a/rabbitmq-server/deps/cowboy/test/cowboy_error_h.erl b/rabbitmq-server/deps/cowboy/test/cowboy_error_h.erl
deleted file mode 100644 (file)
index b4ae78f..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-%% Copyright (c) 2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(cowboy_error_h).
--behaviour(gen_event).
-
-%% Public interface.
--export([ignore/3]).
-
-%% gen_event.
--export([init/1]).
--export([handle_event/2]).
--export([handle_call/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
-%% Public interface.
-
-%% Ignore crashes from Pid occuring in M:F/A.
-ignore(M, F, A) ->
-       gen_event:call(error_logger, ?MODULE, {expect, {self(), M, F, A}}).
-
-%% gen_event.
-
-init(_) ->
-       spawn(fun() -> error_logger:tty(false) end),
-       {ok, []}.
-
-%% Ignore supervisor and progress reports.
-handle_event({info_report, _, {_, progress, _}}, State) ->
-       {ok, State};
-handle_event({info_report, _, {_, std_info, _}}, State) ->
-       {ok, State};
-handle_event({error_report, _, {_, supervisor_report, _}}, State) ->
-       {ok, State};
-%% Ignore gun retry failures.
-handle_event({error_report, _, {_, crash_report,
-               [[{initial_call, {gun, init, _}}, _, _,
-                       {error_info, {error, gone, _}}|_]|_]}},
-               State) ->
-       {ok, State};
-%% Ignore emulator reports that are a duplicate of what Ranch gives us.
-%%
-%% The emulator always sends strings for errors, which makes it very
-%% difficult to extract the information we need, hence the regexps.
-handle_event(Event = {error, GL, {emulator, _, Msg}}, State)
-               when node(GL) =:= node() ->
-       Result = re:run(Msg,
-               "Error in process ([^\s]+).+? with exit value: "
-                       ".+?{stacktrace,\\[{([^,]+),([^,]+),(.+)",
-               [{capture, all_but_first, list}]),
-       case Result of
-               nomatch ->
-                       write_event(Event),
-                       {ok, State};
-               {match, [PidStr, MStr, FStr, Rest]} ->
-                       A = case Rest of
-                               "[]" ++ _ ->
-                                       0;
-                               "[" ++ Rest2 ->
-                                       count_args(Rest2, 1, 0);
-                               _ ->
-                                       {match, [AStr]} = re:run(Rest, "([^,]+).+",
-                                               [{capture, all_but_first, list}]),
-                                       list_to_integer(AStr)
-                       end,
-                       Crash = {list_to_pid(PidStr), list_to_existing_atom(MStr),
-                               list_to_existing_atom(FStr), A},
-                       case lists:member(Crash, State) of
-                               true ->
-                                       {ok, lists:delete(Crash, State)};
-                               false ->
-                                       write_event(Event),
-                                       {ok, State}
-                       end
-       end;
-handle_event(Event = {error, GL,
-               {_, "Ranch listener" ++ _, [_, _, Pid, {[_, _,
-                       {stacktrace, [{M, F, A, _}|_]}|_], _}]}},
-               State) when node(GL) =:= node() ->
-       A2 = if is_list(A) -> length(A); true -> A end,
-       Crash = {Pid, M, F, A2},
-       case lists:member(Crash, State) of
-               true ->
-                       {ok, lists:delete(Crash, State)};
-               false ->
-                       write_event(Event),
-                       {ok, State}
-       end;
-handle_event(Event = {_, GL, _}, State) when node(GL) =:= node() ->
-       write_event(Event),
-       {ok, State};
-handle_event(_, State) ->
-       {ok, State}.
-
-handle_call({expect, Crash}, State) ->
-       {ok, ok, [Crash, Crash|State]};
-handle_call(_, State) ->
-       {ok, {error, bad_query}, State}.
-
-handle_info(_, State) ->
-       {ok, State}.
-
-terminate(_, _) ->
-       spawn(fun() -> error_logger:tty(true) end),
-       ok.
-
-code_change(_, State, _) ->
-       {ok, State}.
-
-%% Internal.
-
-write_event(Event) ->
-       error_logger_tty_h:write_event(
-               {erlang:universaltime(), Event},
-               io).
-
-count_args("]" ++ _, N, 0) ->
-       N;
-count_args("]" ++ Tail, N, Levels) ->
-       count_args(Tail, N, Levels - 1);
-count_args("[" ++ Tail, N, Levels) ->
-       count_args(Tail, N, Levels + 1);
-count_args("}" ++ Tail, N, Levels) ->
-       count_args(Tail, N, Levels - 1);
-count_args("{" ++ Tail, N, Levels) ->
-       count_args(Tail, N, Levels + 1);
-count_args("," ++ Tail, N, Levels = 0) ->
-       count_args(Tail, N + 1, Levels);
-count_args("," ++ Tail, N, Levels) ->
-       count_args(Tail, N, Levels);
-count_args([_|Tail], N, Levels) ->
-       count_args(Tail, N, Levels).
diff --git a/rabbitmq-server/deps/cowboy/test/cowboy_test.erl b/rabbitmq-server/deps/cowboy/test/cowboy_test.erl
deleted file mode 100644 (file)
index f4a5706..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-%% Copyright (c) 2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(cowboy_test).
--compile(export_all).
-
-%% Start and stop applications and their dependencies.
-
-start(Apps) ->
-       _ = [do_start(App) || App <- Apps],
-       ok.
-
-do_start(App) ->
-       case application:start(App) of
-               ok ->
-                       ok;
-               {error, {not_started, Dep}} ->
-                       do_start(Dep),
-                       do_start(App)
-       end.
-
-%% SSL certificate creation and safekeeping.
-
-make_certs() ->
-       {_, Cert, Key} = ct_helper:make_certs(),
-       CertOpts = [{cert, Cert}, {key, Key}],
-       Pid = spawn(fun() -> receive after infinity -> ok end end),
-       ?MODULE = ets:new(?MODULE, [ordered_set, public, named_table,
-               {heir, Pid, undefined}]),
-       ets:insert(?MODULE, {cert_opts, CertOpts}),
-       ok.
-
-get_certs() ->
-       ets:lookup_element(?MODULE, cert_opts, 2).
-
-%% Quick configuration value retrieval.
-
-config(Key, Config) ->
-       {_, Value} = lists:keyfind(Key, 1, Config),
-       Value.
-
-%% Test case description.
-
-doc(String) ->
-       ct:comment(String),
-       ct:log(String).
-
-%% List of all test cases in the suite.
-
-all(Suite) ->
-       lists:usort([F || {F, 1} <- Suite:module_info(exports),
-               F =/= module_info,
-               F =/= test, %% This is leftover from the eunit parse_transform...
-               F =/= all,
-               F =/= groups,
-               string:substr(atom_to_list(F), 1, 5) =/= "init_",
-               string:substr(atom_to_list(F), 1, 4) =/= "end_",
-               string:substr(atom_to_list(F), 1, 3) =/= "do_"
-       ]).
-
-%% Listeners initialization.
-
-init_http(Ref, ProtoOpts, Config) ->
-       {ok, _} = cowboy:start_http(Ref, 100, [{port, 0}], [
-               {max_keepalive, 50},
-               {timeout, 500}
-               |ProtoOpts]),
-       Port = ranch:get_port(Ref),
-       [{type, tcp}, {port, Port}, {opts, []}|Config].
-
-init_https(Ref, ProtoOpts, Config) ->
-       Opts = get_certs(),
-       {ok, _} = cowboy:start_https(Ref, 100, Opts ++ [{port, 0}], [
-               {max_keepalive, 50},
-               {timeout, 500}
-               |ProtoOpts]),
-       Port = ranch:get_port(Ref),
-       [{type, ssl}, {port, Port}, {opts, Opts}|Config].
-
-init_spdy(Ref, ProtoOpts, Config) ->
-       Opts = get_certs(),
-       {ok, _} = cowboy:start_spdy(Ref, 100, Opts ++ [{port, 0}],
-               ProtoOpts),
-       Port = ranch:get_port(Ref),
-       [{type, ssl}, {port, Port}, {opts, Opts}|Config].
-
-%% Common group of listeners used by most suites.
-
-common_all() ->
-       [
-               {group, http},
-               {group, https},
-               {group, spdy},
-               {group, http_compress},
-               {group, https_compress},
-               {group, spdy_compress}
-       ].
-
-common_groups(Tests) ->
-       [
-               {http, [parallel], Tests},
-               {https, [parallel], Tests},
-               {spdy, [parallel], Tests},
-               {http_compress, [parallel], Tests},
-               {https_compress, [parallel], Tests},
-               {spdy_compress, [parallel], Tests}
-       ].
-
-init_common_groups(Name = http, Config, Mod) ->
-       init_http(Name, [
-               {env, [{dispatch, Mod:init_dispatch(Config)}]}
-       ], Config);
-init_common_groups(Name = https, Config, Mod) ->
-       init_https(Name, [
-               {env, [{dispatch, Mod:init_dispatch(Config)}]}
-       ], Config);
-init_common_groups(Name = spdy, Config, Mod) ->
-       init_spdy(Name, [
-               {env, [{dispatch, Mod:init_dispatch(Config)}]}
-       ], Config);
-init_common_groups(Name = http_compress, Config, Mod) ->
-       init_http(Name, [
-               {env, [{dispatch, Mod:init_dispatch(Config)}]},
-               {compress, true}
-       ], Config);
-init_common_groups(Name = https_compress, Config, Mod) ->
-       init_https(Name, [
-               {env, [{dispatch, Mod:init_dispatch(Config)}]},
-               {compress, true}
-       ], Config);
-init_common_groups(Name = spdy_compress, Config, Mod) ->
-       init_spdy(Name, [
-               {env, [{dispatch, Mod:init_dispatch(Config)}]},
-               {compress, true}
-       ], Config).
-
-%% Support functions for testing using Gun.
-
-gun_open(Config) ->
-       gun_open(Config, []).
-
-gun_open(Config, Opts) ->
-       {ok, ConnPid} = gun:open("localhost", config(port, Config),
-               [{retry, 0}, {type, config(type, Config)}|Opts]),
-       ConnPid.
-
-gun_monitor_open(Config) ->
-       gun_monitor_open(Config, []).
-
-gun_monitor_open(Config, Opts) ->
-       ConnPid = gun_open(Config, Opts),
-       {ConnPid, monitor(process, ConnPid)}.
-
-gun_is_gone(ConnPid, MRef) ->
-       receive {'DOWN', MRef, process, ConnPid, gone} -> ok
-       after 500 -> error(timeout) end.
-
-%% Support functions for testing using a raw socket.
-
-raw_open(Config) ->
-       Transport = case config(type, Config) of
-               tcp -> gen_tcp;
-               ssl -> ssl
-       end,
-       {_, Opts} = lists:keyfind(opts, 1, Config),
-       {ok, Socket} = Transport:connect("localhost", config(port, Config),
-               [binary, {active, false}, {packet, raw},
-                       {reuseaddr, true}, {nodelay, true}|Opts]),
-       {raw_client, Socket, Transport}.
-
-raw_send({raw_client, Socket, Transport}, Data) ->
-       Transport:send(Socket, Data).
-
-raw_recv_head({raw_client, Socket, Transport}) ->
-       {ok, Data} = Transport:recv(Socket, 0, 5000),
-       raw_recv_head(Socket, Transport, Data).
-
-raw_recv_head(Socket, Transport, Buffer) ->
-       case binary:match(Buffer, <<"\r\n\r\n">>) of
-               nomatch ->
-                       {ok, Data} = Transport:recv(Socket, 0, 5000),
-                       raw_recv_head(Socket, Transport, << Buffer/binary, Data/binary >>);
-               {_, _} ->
-                       Buffer
-       end.
-
-raw_expect_recv({raw_client, Socket, Transport}, Expect) ->
-       {ok, Expect} = Transport:recv(Socket, iolist_size(Expect), 5000),
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/eunit_SUITE.erl b/rabbitmq-server/deps/cowboy/test/eunit_SUITE.erl
deleted file mode 100644 (file)
index 1d817c6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-%% Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(eunit_SUITE).
--compile(export_all).
-
-all() ->
-       [eunit].
-
-eunit(_) ->
-       ok = eunit:test({application, cowboy}).
diff --git a/rabbitmq-server/deps/cowboy/test/handlers/input_crash_h.erl b/rabbitmq-server/deps/cowboy/test/handlers/input_crash_h.erl
deleted file mode 100644 (file)
index 668d053..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-%% This module crashes on request input data
-%% depending on the given option.
-
--module(input_crash_h).
-
--export([init/3]).
-
-init(_, Req, content_length) ->
-       cowboy_error_h:ignore(cow_http_hd, number, 2),
-       cowboy_req:parse_header(<<"content-length">>, Req).
diff --git a/rabbitmq-server/deps/cowboy/test/handlers/long_polling_h.erl b/rabbitmq-server/deps/cowboy/test/handlers/long_polling_h.erl
deleted file mode 100644 (file)
index 21f1d4d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-%% This module implements a loop handler for long-polling.
-%% It starts by sending itself a message after 200ms,
-%% then sends another after that for a total of 3 messages.
-%% When it receives the last message, it sends a 102 reply back.
-
--module(long_polling_h).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
-init(_, Req, _) ->
-       erlang:send_after(200, self(), timeout),
-       {loop, Req, 2, 5000, hibernate}.
-
-info(timeout, Req, 0) ->
-       {ok, Req2} = cowboy_req:reply(102, Req),
-       {ok, Req2, 0};
-info(timeout, Req, Count) ->
-       erlang:send_after(200, self(), timeout),
-       {loop, Req, Count - 1, hibernate}.
-
-terminate({normal, shutdown}, _, 0) ->
-       ok;
-terminate({error, overflow}, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/handlers/loop_handler_body_h.erl b/rabbitmq-server/deps/cowboy/test/handlers/loop_handler_body_h.erl
deleted file mode 100644 (file)
index db69b02..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-%% This module implements a loop handler that reads
-%% the request body after sending itself a message,
-%% checks that its size is exactly 100000 bytes,
-%% then sends a 200 reply back.
-
--module(loop_handler_body_h).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
-init(_, Req, _) ->
-       self() ! timeout,
-       {loop, Req, undefined, 5000, hibernate}.
-
-info(timeout, Req, State) ->
-       {ok, Body, Req2} = cowboy_req:body(Req),
-       100000 = byte_size(Body),
-       {ok, Req3} = cowboy_req:reply(200, Req2),
-       {ok, Req3, State}.
-
-terminate({normal, shutdown}, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/handlers/loop_handler_timeout_h.erl b/rabbitmq-server/deps/cowboy/test/handlers/loop_handler_timeout_h.erl
deleted file mode 100644 (file)
index 1125046..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This module implements a loop handler that sends
-%% itself a timeout that will intentionally arrive
-%% too late, as it configures itself to only wait
-%% 200ms before closing the connection in init/3.
-%% This results in a 204 reply being sent back by Cowboy.
-
--module(loop_handler_timeout_h).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
-init(_, Req, _) ->
-       erlang:send_after(1000, self(), timeout),
-       {loop, Req, undefined, 200, hibernate}.
-
-info(timeout, Req, State) ->
-       {ok, Req2} = cowboy_req:reply(500, Req),
-       {ok, Req2, State}.
-
-terminate({normal, timeout}, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE.erl
deleted file mode 100644 (file)
index af3a453..0000000
+++ /dev/null
@@ -1,1111 +0,0 @@
-%% Copyright (c) 2011-2014, Loïc Hoguin <essen@ninenines.eu>
-%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(http_SUITE).
--compile(export_all).
-
--import(cowboy_test, [config/2]).
--import(cowboy_test, [gun_open/1]).
--import(cowboy_test, [gun_monitor_open/1]).
--import(cowboy_test, [gun_monitor_open/2]).
--import(cowboy_test, [gun_is_gone/2]).
--import(cowboy_test, [raw_open/1]).
--import(cowboy_test, [raw_send/2]).
--import(cowboy_test, [raw_recv_head/1]).
--import(cowboy_test, [raw_expect_recv/2]).
-
-%% ct.
-
-all() ->
-       [
-               {group, http},
-               {group, https},
-               {group, http_compress},
-               {group, https_compress},
-               {group, onrequest},
-               {group, onresponse},
-               {group, onresponse_capitalize},
-               {group, parse_host},
-               {group, set_env}
-       ].
-
-groups() ->
-       Tests = cowboy_test:all(?MODULE) -- [
-               onrequest, onrequest_reply, onrequest_hook,
-               onresponse_crash, onresponse_reply, onresponse_capitalize,
-               parse_host, set_env_dispatch
-       ],
-       [
-               {http, [parallel], Tests},
-               {https, [parallel], Tests},
-               {http_compress, [parallel], Tests},
-               {https_compress, [parallel], Tests},
-               {onrequest, [parallel], [
-                       onrequest,
-                       onrequest_reply
-               ]},
-               {onresponse, [parallel], [
-                       onresponse_crash,
-                       onresponse_reply
-               ]},
-               {onresponse_capitalize, [parallel], [
-                       onresponse_capitalize
-               ]},
-               {parse_host, [], [
-                       parse_host
-               ]},
-               {set_env, [], [
-                       set_env_dispatch
-               ]}
-       ].
-
-init_per_suite(Config) ->
-       Dir = config(priv_dir, Config) ++ "/static",
-       ct_helper:create_static_dir(Dir),
-       [{static_dir, Dir}|Config].
-
-end_per_suite(Config) ->
-       ct_helper:delete_static_dir(config(static_dir, Config)).
-
-init_per_group(Name = http, Config) ->
-       cowboy_test:init_http(Name, [
-               {env, [{dispatch, init_dispatch(Config)}]}
-       ], Config);
-init_per_group(Name = https, Config) ->
-       cowboy_test:init_https(Name, [
-               {env, [{dispatch, init_dispatch(Config)}]}
-       ], Config);
-init_per_group(Name = http_compress, Config) ->
-       cowboy_test:init_http(Name, [
-               {env, [{dispatch, init_dispatch(Config)}]},
-               {compress, true}
-       ], Config);
-init_per_group(Name = https_compress, Config) ->
-       cowboy_test:init_https(Name, [
-               {env, [{dispatch, init_dispatch(Config)}]},
-               {compress, true}
-       ], Config);
-%% Most, if not all of these, should be in separate test suites.
-init_per_group(onrequest, Config) ->
-       {ok, _} = cowboy:start_http(onrequest, 100, [{port, 0}], [
-               {env, [{dispatch, init_dispatch(Config)}]},
-               {max_keepalive, 50},
-               {onrequest, fun do_onrequest_hook/1},
-               {timeout, 500}
-       ]),
-       Port = ranch:get_port(onrequest),
-       [{type, tcp}, {port, Port}, {opts, []}|Config];
-init_per_group(onresponse, Config) ->
-       {ok, _} = cowboy:start_http(onresponse, 100, [{port, 0}], [
-               {env, [{dispatch, init_dispatch(Config)}]},
-               {max_keepalive, 50},
-               {onresponse, fun do_onresponse_hook/4},
-               {timeout, 500}
-       ]),
-       Port = ranch:get_port(onresponse),
-       [{type, tcp}, {port, Port}, {opts, []}|Config];
-init_per_group(onresponse_capitalize, Config) ->
-       {ok, _} = cowboy:start_http(onresponse_capitalize, 100, [{port, 0}], [
-               {env, [{dispatch, init_dispatch(Config)}]},
-               {max_keepalive, 50},
-               {onresponse, fun do_onresponse_capitalize_hook/4},
-               {timeout, 500}
-       ]),
-       Port = ranch:get_port(onresponse_capitalize),
-       [{type, tcp}, {port, Port}, {opts, []}|Config];
-init_per_group(parse_host, Config) ->
-       Dispatch = cowboy_router:compile([
-               {'_', [
-                       {"/req_attr", http_req_attr, []}
-               ]}
-       ]),
-       {ok, _} = cowboy:start_http(parse_host, 100, [{port, 0}], [
-               {env, [{dispatch, Dispatch}]},
-               {max_keepalive, 50},
-               {timeout, 500}
-       ]),
-       Port = ranch:get_port(parse_host),
-       [{type, tcp}, {port, Port}, {opts, []}|Config];
-init_per_group(set_env, Config) ->
-       {ok, _} = cowboy:start_http(set_env, 100, [{port, 0}], [
-               {env, [{dispatch, []}]},
-               {max_keepalive, 50},
-               {timeout, 500}
-       ]),
-       Port = ranch:get_port(set_env),
-       [{type, tcp}, {port, Port}, {opts, []}|Config].
-
-end_per_group(Name, _) ->
-       ok = cowboy:stop_listener(Name).
-
-%% Dispatch configuration.
-
-init_dispatch(Config) ->
-       cowboy_router:compile([
-               {"localhost", [
-                       {"/chunked_response", http_chunked, []},
-                       {"/streamed_response", http_streamed, []},
-                       {"/init_shutdown", http_init_shutdown, []},
-                       {"/headers/dupe", http_handler,
-                               [{headers, [{<<"connection">>, <<"close">>}]}]},
-                       {"/set_resp/header", http_set_resp,
-                               [{headers, [{<<"vary">>, <<"Accept">>}]}]},
-                       {"/set_resp/overwrite", http_set_resp,
-                               [{headers, [{<<"server">>, <<"DesireDrive/1.0">>}]}]},
-                       {"/set_resp/body", http_set_resp,
-                               [{body, <<"A flameless dance does not equal a cycle">>}]},
-                       {"/stream_body/set_resp", http_stream_body,
-                               [{reply, set_resp}, {body, <<"stream_body_set_resp">>}]},
-                       {"/stream_body/set_resp_close",
-                               http_stream_body, [
-                                       {reply, set_resp_close},
-                                       {body, <<"stream_body_set_resp_close">>}]},
-                       {"/stream_body/set_resp_chunked",
-                               http_stream_body, [
-                                       {reply, set_resp_chunked},
-                                       {body, [<<"stream_body">>, <<"_set_resp_chunked">>]}]},
-                       {"/static/[...]", cowboy_static,
-                               {dir, config(static_dir, Config)}},
-                       {"/static_mimetypes_function/[...]", cowboy_static,
-                               {dir, config(static_dir, Config),
-                                       [{mimetypes, ?MODULE, do_mimetypes_text_html}]}},
-                       {"/handler_errors", http_errors, []},
-                       {"/static_attribute_etag/[...]", cowboy_static,
-                               {dir, config(static_dir, Config)}},
-                       {"/static_function_etag/[...]", cowboy_static,
-                               {dir, config(static_dir, Config),
-                                       [{etag, ?MODULE, do_etag_gen}]}},
-                       {"/static_specify_file/[...]", cowboy_static,
-                               {file, config(static_dir, Config) ++ "/style.css"}},
-                       {"/multipart", http_multipart, []},
-                       {"/multipart/large", http_multipart_stream, []},
-                       {"/echo/body", http_echo_body, []},
-                       {"/echo/body_qs", http_body_qs, []},
-                       {"/crash/content-length", input_crash_h, content_length},
-                       {"/param_all", rest_param_all, []},
-                       {"/bad_accept", rest_simple_resource, []},
-                       {"/bad_content_type", rest_patch_resource, []},
-                       {"/simple", rest_simple_resource, []},
-                       {"/forbidden_post", rest_forbidden_resource, [true]},
-                       {"/simple_post", rest_forbidden_resource, [false]},
-                       {"/missing_get_callbacks", rest_missing_callbacks, []},
-                       {"/missing_put_callbacks", rest_missing_callbacks, []},
-                       {"/nodelete", rest_nodelete_resource, []},
-                       {"/post_charset", rest_post_charset_resource, []},
-                       {"/postonly", rest_postonly_resource, []},
-                       {"/patch", rest_patch_resource, []},
-                       {"/resetags", rest_resource_etags, []},
-                       {"/rest_expires", rest_expires, []},
-                       {"/rest_expires_binary", rest_expires_binary, []},
-                       {"/rest_empty_resource", rest_empty_resource, []},
-                       {"/loop_stream_recv", http_loop_stream_recv, []},
-                       {"/", http_handler, []}
-               ]}
-       ]).
-
-%% Callbacks.
-
-do_etag_gen(_, _, _) ->
-       {strong, <<"etag">>}.
-
-do_mimetypes_text_html(_) ->
-       <<"text/html">>.
-
-%% Convenience functions.
-
-do_raw(Data, Config) ->
-       Client = raw_open(Config),
-       ok = raw_send(Client, Data),
-       case catch raw_recv_head(Client) of
-               {'EXIT', _} -> closed;
-               Resp -> element(2, cow_http:parse_status_line(Resp))
-       end.
-
-do_get(Path, Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, Path),
-       {response, _, Status, _} = gun:await(ConnPid, Ref),
-       gun:close(ConnPid),
-       Status.
-
-%% Tests.
-
-check_raw_status(Config) ->
-       Huge = [$0 || _ <- lists:seq(1, 5000)],
-       HugeCookie = lists:flatten(["whatever_man_biiiiiiiiiiiig_cookie_me_want_77="
-               "Wed Apr 06 2011 10:38:52 GMT-0500 (CDT)" || _ <- lists:seq(1, 40)]),
-       ResponsePacket =
-"HTTP/1.0 302 Found\r
-Location: http://www.google.co.il/\r
-Cache-Control: private\r
-Content-Type: text/html; charset=UTF-8\r
-Set-Cookie: PREF=ID=568f67013d4a7afa:FF=0:TM=1323014101:LM=1323014101:S=XqctDWC65MzKT0zC; expires=Tue, 03-Dec-2013 15:55:01 GMT; path=/; domain=.google.com\r
-Date: Sun, 04 Dec 2011 15:55:01 GMT\r
-Server: gws\r
-Content-Length: 221\r
-X-XSS-Protection: 1; mode=block\r
-X-Frame-Options: SAMEORIGIN\r
-\r
-<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">
-<TITLE>302 Moved</TITLE></HEAD><BODY>
-<H1>302 Moved</H1>
-The document has moved
-<A HREF=\"http://www.google.co.il/\">here</A>.
-</BODY></HTML>",
-       Tests = [
-               {200, ["GET / HTTP/1.0\r\nHost: localhost\r\n"
-                       "Set-Cookie: ", HugeCookie, "\r\n\r\n"]},
-               {200, "\r\n\r\n\r\n\r\n\r\nGET / HTTP/1.1\r\nHost: localhost\r\n\r\n"},
-               {200, "GET http://proxy/ HTTP/1.1\r\nHost: localhost\r\n\r\n"},
-               {400, "\n"},
-               {400, "Garbage\r\n\r\n"},
-               {400, "\r\n\r\n\r\n\r\n\r\n\r\n"},
-               {400, "GET / HTTP/1.1\r\nHost: ninenines.eu\r\n\r\n"},
-               {400, "GET http://proxy/ HTTP/1.1\r\n\r\n"},
-               {400, "GET / HTTP/1.1\r\nHost: localhost:bad_port\r\n\r\n"},
-               {400, ["POST /crash/content-length HTTP/1.1\r\nHost: localhost\r\nContent-Length: 5000,5000\r\n\r\n", Huge]},
-               {505, ResponsePacket},
-               {408, "GET / HTTP/1.1\r\n"},
-               {408, "GET / HTTP/1.1\r\nHost: localhost"},
-               {408, "GET / HTTP/1.1\r\nHost: localhost\r\n"},
-               {408, "GET / HTTP/1.1\r\nHost: localhost\r\n\r"},
-               {414, Huge},
-               {400, "GET / HTTP/1.1\r\n" ++ Huge},
-               {505, "GET / HTTP/1.2\r\nHost: localhost\r\n\r\n"},
-               {closed, ""},
-               {closed, "\r\n"},
-               {closed, "\r\n\r\n"},
-               {closed, "GET / HTTP/1.1"}
-       ],
-       _ = [{Status, Packet} = begin
-               Ret = do_raw(Packet, Config),
-               {Ret, Packet}
-       end || {Status, Packet} <- Tests],
-       ok.
-
-check_status(Config) ->
-       Tests = [
-               {200, "/"},
-               {200, "/simple"},
-               {400, "/static/%2f"},
-               {400, "/static/%2e"},
-               {400, "/static/%2e%2e"},
-               {403, "/static/directory"},
-               {403, "/static/directory/"},
-               {403, "/static/unreadable"},
-               {404, "/not/found"},
-               {404, "/static/not_found"},
-               {500, "/handler_errors?case=handle_before_reply"},
-               {500, "/handler_errors?case=init_before_reply"},
-               {666, "/init_shutdown"}
-       ],
-       _ = [{Status, URL} = begin
-               Ret = do_get(URL, Config),
-               {Ret, URL}
-       end || {Status, URL} <- Tests].
-
-chunked_response(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/chunked_response"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       true = lists:keymember(<<"transfer-encoding">>, 1, Headers),
-       {ok, <<"chunked_handler\r\nworks fine!">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-%% Check if sending requests whose size is around the MTU breaks something.
-echo_body(Config) ->
-       MTU = ct_helper:get_loopback_mtu(),
-       _ = [begin
-               Body = list_to_binary(lists:duplicate(Size, $a)),
-               ConnPid = gun_open(Config),
-               Ref = gun:post(ConnPid, "/echo/body", [], Body),
-               {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-               {ok, Body} = gun:await_body(ConnPid, Ref)
-       end || Size <- lists:seq(MTU - 500, MTU)],
-       ok.
-
-%% Check if sending request whose size is bigger than 1000000 bytes causes 413
-echo_body_max_length(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body", [], << 0:2000000/unit:8 >>),
-       {response, nofin, 413, _} = gun:await(ConnPid, Ref),
-       ok.
-
-% check if body_qs echo's back results
-echo_body_qs(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body_qs", [], <<"echo=67890">>),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, <<"67890">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-echo_body_qs_max_length(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body_qs", [], << "echo=", 0:2000000/unit:8 >>),
-       {response, nofin, 413, _} = gun:await(ConnPid, Ref),
-       ok.
-
-error_chain_handle_after_reply(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref1 = gun:get(ConnPid, "/"),
-       Ref2 = gun:get(ConnPid, "/handler_errors?case=handle_after_reply"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref1, MRef),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref2, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-error_chain_handle_before_reply(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref1 = gun:get(ConnPid, "/"),
-       Ref2 = gun:get(ConnPid, "/handler_errors?case=handle_before_reply"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref1, MRef),
-       {response, fin, 500, _} = gun:await(ConnPid, Ref2, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-error_handle_after_reply(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref = gun:get(ConnPid, "/handler_errors?case=handle_after_reply"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-error_init_after_reply(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref = gun:get(ConnPid, "/handler_errors?case=init_after_reply"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-error_init_reply_handle_error(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref = gun:get(ConnPid, "/handler_errors?case=init_reply_handle_error"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-headers_dupe(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref = gun:get(ConnPid, "/headers/dupe"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref, MRef),
-       %% Ensure that only one connection header was received.
-       [<<"close">>] = [V || {Name, V} <- Headers, Name =:= <<"connection">>],
-       gun_is_gone(ConnPid, MRef).
-
-http10_chunkless(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config, [{http, [{version, 'HTTP/1.0'}]}]),
-       Ref = gun:get(ConnPid, "/chunked_response"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref, MRef),
-       false = lists:keyfind(<<"transfer-encoding">>, 1, Headers),
-       {ok, <<"chunked_handler\r\nworks fine!">>} = gun:await_body(ConnPid, Ref, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-http10_hostless(Config) ->
-       Name = http10_hostless,
-       Port10 = config(port, Config) + 10,
-       Transport = case config(type, Config) of
-               tcp -> ranch_tcp;
-               ssl -> ranch_ssl
-       end,
-       ranch:start_listener(Name, 5, Transport,
-               config(opts, Config) ++ [{port, Port10}],
-               cowboy_protocol, [
-                       {env, [{dispatch, cowboy_router:compile([
-                               {'_', [{"/http1.0/hostless", http_handler, []}]}])}]},
-                       {max_keepalive, 50},
-                       {timeout, 500}]
-       ),
-       200 = do_raw("GET /http1.0/hostless HTTP/1.0\r\n\r\n",
-               [{port, Port10}|Config]),
-       cowboy:stop_listener(http10_hostless).
-
-http10_keepalive_default(Config) ->
-       Normal = "GET / HTTP/1.0\r\nhost: localhost\r\n\r\n",
-       Client = raw_open(Config),
-       ok = raw_send(Client, Normal),
-       case catch raw_recv_head(Client) of
-               {'EXIT', _} -> error(closed);
-               Data ->
-                       {'HTTP/1.0', 200, _, Rest} = cow_http:parse_status_line(Data),
-                       {Headers, _} = cow_http:parse_headers(Rest),
-                       false = lists:keymember(<<"connection">>, 1, Headers)
-       end,
-       ok = raw_send(Client, Normal),
-       case catch raw_recv_head(Client) of
-               {'EXIT', _} -> closed;
-               _ -> error(not_closed)
-       end.
-
-http10_keepalive_forced(Config) ->
-       Keepalive = "GET / HTTP/1.0\r\nhost: localhost\r\nConnection: keep-alive\r\n\r\n",
-       Client = raw_open(Config),
-       ok = raw_send(Client, Keepalive),
-       case catch raw_recv_head(Client) of
-               {'EXIT', _} -> error(closed);
-               Data ->
-                       {'HTTP/1.0', 200, _, Rest} = cow_http:parse_status_line(Data),
-                       {Headers, _} = cow_http:parse_headers(Rest),
-                       {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers)
-       end,
-       ok = raw_send(Client, Keepalive),
-       case catch raw_recv_head(Client) of
-               {'EXIT', Err} -> error({closed, Err});
-               _ -> ok
-       end.
-
-keepalive_max(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Refs = [gun:get(ConnPid, "/", [{<<"connection">>, <<"keep-alive">>}])
-               || _ <- lists:seq(1, 49)],
-       CloseRef = gun:get(ConnPid, "/", [{<<"connection">>, <<"keep-alive">>}]),
-       _ = [begin
-               {response, nofin, 200, Headers} = gun:await(ConnPid, Ref, MRef),
-               false = lists:keymember(<<"connection">>, 1, Headers)
-       end || Ref <- Refs],
-       {response, nofin, 200, Headers} = gun:await(ConnPid, CloseRef, MRef),
-       {_, <<"close">>} = lists:keyfind(<<"connection">>, 1, Headers),
-       gun_is_gone(ConnPid, MRef).
-
-keepalive_nl(Config) ->
-       ConnPid = gun_open(Config),
-       Refs = [begin
-               Ref = gun:get(ConnPid, "/", [{<<"connection">>, <<"keep-alive">>}]),
-               gun:dbg_send_raw(ConnPid, <<"\r\n">>),
-               Ref
-       end || _ <- lists:seq(1, 10)],
-       _ = [begin
-               {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-               false = lists:keymember(<<"connection">>, 1, Headers)
-       end || Ref <- Refs],
-       ok.
-
-keepalive_stream_loop(Config) ->
-       ConnPid = gun_open(Config),
-       Refs = [begin
-               Ref = gun:post(ConnPid, "/loop_stream_recv",
-                       [{<<"transfer-encoding">>, <<"chunked">>}]),
-               _ = [gun:data(ConnPid, Ref, nofin, << ID:32 >>)
-                       || ID <- lists:seq(1, 250)],
-               gun:data(ConnPid, Ref, fin, <<>>),
-               Ref
-       end || _ <- lists:seq(1, 10)],
-       _ = [begin
-               {response, fin, 200, _} = gun:await(ConnPid, Ref)
-       end || Ref <- Refs],
-       ok.
-
-multipart(Config) ->
-       ConnPid = gun_open(Config),
-       Body = <<
-               "This is a preamble."
-               "\r\n--OHai\r\nX-Name:answer\r\n\r\n42"
-               "\r\n--OHai\r\nServer:Cowboy\r\n\r\nIt rocks!\r\n"
-               "\r\n--OHai--\r\n"
-               "This is an epilogue."
-       >>,
-       Ref = gun:post(ConnPid, "/multipart",
-               [{<<"content-type">>, <<"multipart/x-makes-no-sense; boundary=OHai">>}],
-               Body),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, RespBody} = gun:await_body(ConnPid, Ref),
-       Parts = binary_to_term(RespBody),
-       Parts = [
-               {[{<<"x-name">>, <<"answer">>}], <<"42">>},
-               {[{<<"server">>, <<"Cowboy">>}], <<"It rocks!\r\n">>}
-       ],
-       ok.
-
-multipart_chunked(Config) ->
-       ConnPid = gun_open(Config),
-       Body = <<
-               "This is a preamble."
-               "\r\n--OHai\r\nX-Name:answer\r\n\r\n42"
-               "\r\n--OHai\r\nServer:Cowboy\r\n\r\nIt rocks!\r\n"
-               "\r\n--OHai--\r\n"
-               "This is an epilogue."
-       >>,
-       Ref = gun:post(ConnPid, "/multipart", [
-               {<<"content-type">>, <<"multipart/x-makes-no-sense; boundary=OHai">>},
-               {<<"transfer-encoding">>, <<"chunked">>}]),
-       gun:data(ConnPid, Ref, fin, Body),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, RespBody} = gun:await_body(ConnPid, Ref),
-       Parts = binary_to_term(RespBody),
-       Parts = [
-               {[{<<"x-name">>, <<"answer">>}], <<"42">>},
-               {[{<<"server">>, <<"Cowboy">>}], <<"It rocks!\r\n">>}
-       ],
-       ok.
-
-multipart_large(Config) ->
-       ConnPid = gun_open(Config),
-       Boundary = "----------",
-       Big = << 0:9000000/unit:8 >>,
-       Bigger = << 0:9999999/unit:8 >>,
-       Body = ["--", Boundary, "\r\ncontent-length: 9000000\r\n\r\n", Big, "\r\n",
-               "--", Boundary, "\r\ncontent-length: 9999999\r\n\r\n", Bigger, "\r\n",
-               "--", Boundary, "--\r\n"],
-       Ref = gun:post(ConnPid, "/multipart/large",
-               [{<<"content-type">>, ["multipart/x-large; boundary=", Boundary]}],
-               Body),
-       {response, fin, 200, _} = gun:await(ConnPid, Ref),
-       ok.
-
-do_nc(Config, Input) ->
-       Cat = os:find_executable("cat"),
-       Nc = os:find_executable("nc"),
-       case {Cat, Nc} of
-               {false, _} ->
-                       {skip, {notfound, cat}};
-               {_, false} ->
-                       {skip, {notfound, nc}};
-               _Good ->
-                       %% Throw garbage at the server then check if it's still up.
-                       StrPort = integer_to_list(config(port, Config)),
-                       [os:cmd("cat " ++ Input ++ " | nc localhost " ++ StrPort)
-                               || _ <- lists:seq(1, 100)],
-                       200 = do_get("/", Config)
-       end.
-
-nc_rand(Config) ->
-       do_nc(Config, "/dev/urandom").
-
-nc_zero(Config) ->
-       do_nc(Config, "/dev/zero").
-
-onrequest(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {<<"server">>, <<"Serenity">>} = lists:keyfind(<<"server">>, 1, Headers),
-       {ok, <<"http_handler">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-onrequest_reply(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/?reply=1"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {<<"server">>, <<"Cowboy">>} = lists:keyfind(<<"server">>, 1, Headers),
-       {ok, <<"replied!">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-%% Hook for the above onrequest tests.
-do_onrequest_hook(Req) ->
-       case cowboy_req:qs_val(<<"reply">>, Req) of
-               {undefined, Req2} ->
-                       cowboy_req:set_resp_header(<<"server">>, <<"Serenity">>, Req2);
-               {_, Req2} ->
-                       {ok, Req3} = cowboy_req:reply(
-                               200, [], <<"replied!">>, Req2),
-                       Req3
-       end.
-
-onresponse_capitalize(Config) ->
-       Client = raw_open(Config),
-       ok = raw_send(Client, "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n"),
-       Data = raw_recv_head(Client),
-       false = nomatch =:= binary:match(Data, <<"Content-Length">>),
-       ok.
-
-%% Hook for the above onresponse_capitalize test.
-do_onresponse_capitalize_hook(Status, Headers, Body, Req) ->
-       Headers2 = [{cowboy_bstr:capitalize_token(N), V}
-               || {N, V} <- Headers],
-       {ok, Req2} = cowboy_req:reply(Status, Headers2, Body, Req),
-       Req2.
-
-onresponse_crash(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/handler_errors?case=init_before_reply"),
-       {response, fin, 777, Headers} = gun:await(ConnPid, Ref),
-       {<<"x-hook">>, <<"onresponse">>} = lists:keyfind(<<"x-hook">>, 1, Headers).
-
-onresponse_reply(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/"),
-       {response, nofin, 777, Headers} = gun:await(ConnPid, Ref),
-       {<<"x-hook">>, <<"onresponse">>} = lists:keyfind(<<"x-hook">>, 1, Headers),
-       ok.
-
-%% Hook for the above onresponse tests.
-do_onresponse_hook(_, Headers, _, Req) ->
-       {ok, Req2} = cowboy_req:reply(
-               <<"777 Lucky">>, [{<<"x-hook">>, <<"onresponse">>}|Headers], Req),
-       Req2.
-
-parse_host(Config) ->
-       ConnPid = gun_open(Config),
-       Tests = [
-               {<<"example.org:8080">>, <<"example.org\n8080">>},
-               {<<"example.org">>, <<"example.org\n80">>},
-               {<<"192.0.2.1:8080">>, <<"192.0.2.1\n8080">>},
-               {<<"192.0.2.1">>, <<"192.0.2.1\n80">>},
-               {<<"[2001:db8::1]:8080">>, <<"[2001:db8::1]\n8080">>},
-               {<<"[2001:db8::1]">>, <<"[2001:db8::1]\n80">>},
-               {<<"[::ffff:192.0.2.1]:8080">>, <<"[::ffff:192.0.2.1]\n8080">>},
-               {<<"[::ffff:192.0.2.1]">>, <<"[::ffff:192.0.2.1]\n80">>}
-       ],
-       [begin
-               Ref = gun:get(ConnPid, "/req_attr?attr=host_and_port",
-                       [{<<"host">>, Host}]),
-               {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-               {ok, Body} = gun:await_body(ConnPid, Ref)
-       end || {Host, Body} <- Tests],
-       ok.
-
-pipeline(Config) ->
-       ConnPid = gun_open(Config),
-       Refs = [gun:get(ConnPid, "/") || _ <- lists:seq(1, 5)],
-       _ = [{response, nofin, 200, _} = gun:await(ConnPid, Ref) || Ref <- Refs],
-       ok.
-
-rest_param_all(Config) ->
-       ConnPid = gun_open(Config),
-       %% Accept without param.
-       Ref1 = gun:get(ConnPid, "/param_all",
-               [{<<"accept">>, <<"text/plain">>}]),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref1),
-       {ok, <<"[]">>} = gun:await_body(ConnPid, Ref1),
-       %% Accept with param.
-       Ref2 = gun:get(ConnPid, "/param_all",
-               [{<<"accept">>, <<"text/plain;level=1">>}]),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref2),
-       {ok, <<"level=1">>} = gun:await_body(ConnPid, Ref2),
-       %% Accept with param and quality.
-       Ref3 = gun:get(ConnPid, "/param_all",
-               [{<<"accept">>, <<"text/plain;level=1;q=0.8, text/plain;level=2;q=0.5">>}]),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref3),
-       {ok, <<"level=1">>} = gun:await_body(ConnPid, Ref3),
-       Ref4 = gun:get(ConnPid, "/param_all",
-               [{<<"accept">>, <<"text/plain;level=1;q=0.5, text/plain;level=2;q=0.8">>}]),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref4),
-       {ok, <<"level=2">>} = gun:await_body(ConnPid, Ref4),
-       %% Without Accept.
-       Ref5 = gun:get(ConnPid, "/param_all"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref5),
-       {ok, <<"'*'">>} = gun:await_body(ConnPid, Ref5),
-       %% Content-Type without param.
-       Ref6 = gun:put(ConnPid, "/param_all",
-               [{<<"content-type">>, <<"text/plain">>}]),
-       {response, fin, 204, _} = gun:await(ConnPid, Ref6),
-       %% Content-Type with param.
-       Ref7 = gun:put(ConnPid, "/param_all",
-               [{<<"content-type">>, <<"text/plain; charset=utf-8">>}]),
-       {response, fin, 204, _} = gun:await(ConnPid, Ref7),
-       ok.
-
-rest_bad_accept(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/bad_accept",
-               [{<<"accept">>, <<"1">>}]),
-       {response, fin, 400, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_bad_content_type(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:patch(ConnPid, "/bad_content_type",
-               [{<<"content-type">>, <<"text/plain, text/html">>}], <<"Whatever">>),
-       {response, fin, 415, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_expires(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/rest_expires"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, Expires} = lists:keyfind(<<"expires">>, 1, Headers),
-       {_, LastModified} = lists:keyfind(<<"last-modified">>, 1, Headers),
-       Expires = LastModified = <<"Fri, 21 Sep 2012 22:36:14 GMT">>,
-       ok.
-
-rest_expires_binary(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/rest_expires_binary"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"0">>} = lists:keyfind(<<"expires">>, 1, Headers),
-       ok.
-
-rest_keepalive(Config) ->
-       ConnPid = gun_open(Config),
-       Refs = [gun:get(ConnPid, "/simple") || _ <- lists:seq(1, 10)],
-       _ = [begin
-               {response, nofin, 200, Headers} =  gun:await(ConnPid, Ref),
-               false = lists:keymember(<<"connection">>, 1, Headers)
-       end || Ref <- Refs],
-       ok.
-
-rest_keepalive_post(Config) ->
-       ConnPid = gun_open(Config),
-       Refs = [{
-               gun:post(ConnPid, "/forbidden_post",
-                       [{<<"content-type">>, <<"text/plain">>}]),
-               gun:post(ConnPid, "/simple_post",
-                       [{<<"content-type">>, <<"text/plain">>}])
-       } || _ <- lists:seq(1, 5)],
-       _ = [begin
-               {response, fin, 403, Headers1} = gun:await(ConnPid, Ref1),
-               false = lists:keymember(<<"connection">>, 1, Headers1),
-               {response, fin, 303, Headers2} = gun:await(ConnPid, Ref2),
-               false = lists:keymember(<<"connection">>, 1, Headers2)
-       end || {Ref1, Ref2} <- Refs],
-       ok.
-
-rest_missing_get_callbacks(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/missing_get_callbacks"),
-       {response, fin, 500, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_missing_put_callbacks(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:put(ConnPid, "/missing_put_callbacks",
-               [{<<"content-type">>, <<"application/json">>}], <<"{}">>),
-       {response, fin, 500, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_nodelete(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:delete(ConnPid, "/nodelete"),
-       {response, fin, 500, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_options_default(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:options(ConnPid, "/rest_empty_resource"),
-       {response, fin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"HEAD, GET, OPTIONS">>} = lists:keyfind(<<"allow">>, 1, Headers),
-       ok.
-
-rest_patch(Config) ->
-       Tests = [
-               {204, [{<<"content-type">>, <<"text/plain">>}], <<"whatever">>},
-               {400, [{<<"content-type">>, <<"text/plain">>}], <<"false">>},
-               {400, [{<<"content-type">>, <<"text/plain">>}], <<"halt">>},
-               {415, [{<<"content-type">>, <<"application/json">>}], <<"bad_content_type">>}
-       ],
-       ConnPid = gun_open(Config),
-       _ = [begin
-               Ref = gun:patch(ConnPid, "/patch", Headers, Body),
-               {response, fin, Status, _} = gun:await(ConnPid, Ref)
-       end || {Status, Headers, Body} <- Tests],
-       ok.
-
-rest_post_charset(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/post_charset",
-               [{<<"content-type">>, <<"text/plain;charset=UTF-8">>}], "12345"),
-       {response, fin, 204, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_postonly(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/postonly",
-               [{<<"content-type">>, <<"text/plain">>}], "12345"),
-       {response, fin, 204, _} = gun:await(ConnPid, Ref),
-       ok.
-
-rest_resource_get_etag(Config, Type) ->
-       rest_resource_get_etag(Config, Type, []).
-
-rest_resource_get_etag(Config, Type, Headers) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/resetags?type=" ++ Type, Headers),
-       {response, _, Status, RespHeaders} = gun:await(ConnPid, Ref),
-       case lists:keyfind(<<"etag">>, 1, RespHeaders) of
-               false -> {Status, false};
-               {<<"etag">>, ETag} -> {Status, ETag}
-       end.
-
-rest_resource_etags(Config) ->
-       Tests = [
-               {200, <<"W/\"etag-header-value\"">>, "tuple-weak"},
-               {200, <<"\"etag-header-value\"">>, "tuple-strong"},
-               {200, <<"W/\"etag-header-value\"">>, "binary-weak-quoted"},
-               {200, <<"\"etag-header-value\"">>, "binary-strong-quoted"},
-               {500, false, "binary-strong-unquoted"},
-               {500, false, "binary-weak-unquoted"}
-       ],
-       _ = [{Status, ETag, Type} = begin
-               {Ret, RespETag} = rest_resource_get_etag(Config, Type),
-               {Ret, RespETag, Type}
-       end || {Status, ETag, Type} <- Tests].
-
-rest_resource_etags_if_none_match(Config) ->
-       Tests = [
-               {304, <<"W/\"etag-header-value\"">>, "tuple-weak"},
-               {304, <<"\"etag-header-value\"">>, "tuple-strong"},
-               {304, <<"W/\"etag-header-value\"">>, "binary-weak-quoted"},
-               {304, <<"\"etag-header-value\"">>, "binary-strong-quoted"}
-       ],
-       _ = [{Status, Type} = begin
-               {Ret, _} = rest_resource_get_etag(Config, Type,
-                       [{<<"if-none-match">>, ETag}]),
-               {Ret, Type}
-       end || {Status, ETag, Type} <- Tests].
-
-set_env_dispatch(Config) ->
-       ConnPid1 = gun_open(Config),
-       Ref1 = gun:get(ConnPid1, "/"),
-       {response, fin, 400, _} = gun:await(ConnPid1, Ref1),
-       ok = cowboy:set_env(set_env, dispatch,
-               cowboy_router:compile([{'_', [{"/", http_handler, []}]}])),
-       ConnPid2 = gun_open(Config),
-       Ref2 = gun:get(ConnPid2, "/"),
-       {response, nofin, 200, _} = gun:await(ConnPid2, Ref2),
-       ok.
-
-set_resp_body(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/set_resp/body"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, <<"A flameless dance does not equal a cycle">>}
-               = gun:await_body(ConnPid, Ref),
-       ok.
-
-set_resp_header(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/set_resp/header"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"Accept">>} = lists:keyfind(<<"vary">>, 1, Headers),
-       {_, _} = lists:keyfind(<<"set-cookie">>, 1, Headers),
-       ok.
-
-set_resp_overwrite(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/set_resp/overwrite"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"DesireDrive/1.0">>} = lists:keyfind(<<"server">>, 1, Headers),
-       ok.
-
-slowloris(Config) ->
-       Client = raw_open(Config),
-       try
-               [begin
-                       ok = raw_send(Client, [C]),
-                       receive after 25 -> ok end
-               end || C <- "GET / HTTP/1.1\r\nHost: localhost\r\n"
-                       "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US)\r\n"
-                       "Cookie: name=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n\r\n"],
-               error(failure)
-       catch error:{badmatch, _} ->
-               ok
-       end.
-
-slowloris2(Config) ->
-       Client = raw_open(Config),
-       ok = raw_send(Client, "GET / HTTP/1.1\r\n"),
-       receive after 300 -> ok end,
-       ok = raw_send(Client, "Host: localhost\r\n"),
-       receive after 300 -> ok end,
-       Data = raw_recv_head(Client),
-       {_, 408, _, _} = cow_http:parse_status_line(Data),
-       ok.
-
-static_attribute_etag(Config) ->
-       ConnPid = gun_open(Config),
-       Ref1 = gun:get(ConnPid, "/static_attribute_etag/index.html"),
-       Ref2 = gun:get(ConnPid, "/static_attribute_etag/index.html"),
-       {response, nofin, 200, Headers1} = gun:await(ConnPid, Ref1),
-       {response, nofin, 200, Headers2} = gun:await(ConnPid, Ref2),
-       {_, ETag} = lists:keyfind(<<"etag">>, 1, Headers1),
-       {_, ETag} = lists:keyfind(<<"etag">>, 1, Headers2),
-       true = ETag =/= undefined,
-       ok.
-
-static_function_etag(Config) ->
-       ConnPid = gun_open(Config),
-       Ref1 = gun:get(ConnPid, "/static_function_etag/index.html"),
-       Ref2 = gun:get(ConnPid, "/static_function_etag/index.html"),
-       {response, nofin, 200, Headers1} = gun:await(ConnPid, Ref1),
-       {response, nofin, 200, Headers2} = gun:await(ConnPid, Ref2),
-       {_, ETag} = lists:keyfind(<<"etag">>, 1, Headers1),
-       {_, ETag} = lists:keyfind(<<"etag">>, 1, Headers2),
-       true = ETag =/= undefined,
-       ok.
-
-static_mimetypes_function(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/static_mimetypes_function/index.html"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"text/html">>} = lists:keyfind(<<"content-type">>, 1, Headers),
-       ok.
-
-static_specify_file(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/static_specify_file"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"text/css">>} = lists:keyfind(<<"content-type">>, 1, Headers),
-       {ok, <<"body{color:red}\n">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-static_specify_file_catchall(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/static_specify_file/none"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"text/css">>} = lists:keyfind(<<"content-type">>, 1, Headers),
-       {ok, <<"body{color:red}\n">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-static_test_file(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/static/unknown"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"application/octet-stream">>} = lists:keyfind(<<"content-type">>, 1, Headers),
-       ok.
-
-static_test_file_css(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/static/style.css"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"text/css">>} = lists:keyfind(<<"content-type">>, 1, Headers),
-       ok.
-
-stream_body_set_resp(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/stream_body/set_resp"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, <<"stream_body_set_resp">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-stream_body_set_resp_close(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Ref = gun:get(ConnPid, "/stream_body/set_resp_close"),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref, MRef),
-       {ok, <<"stream_body_set_resp_close">>} = gun:await_body(ConnPid, Ref, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-stream_body_set_resp_chunked(Config) ->
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/stream_body/set_resp_chunked"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
-       {_, <<"chunked">>} = lists:keyfind(<<"transfer-encoding">>, 1, Headers),
-       {ok, <<"stream_body_set_resp_chunked">>} = gun:await_body(ConnPid, Ref),
-       ok.
-
-stream_body_set_resp_chunked10(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config, [{http, [{version, 'HTTP/1.0'}]}]),
-       Ref = gun:get(ConnPid, "/stream_body/set_resp_chunked"),
-       {response, nofin, 200, Headers} = gun:await(ConnPid, Ref, MRef),
-       false = lists:keyfind(<<"transfer-encoding">>, 1, Headers),
-       {ok, <<"stream_body_set_resp_chunked">>} = gun:await_body(ConnPid, Ref, MRef),
-       gun_is_gone(ConnPid, MRef).
-
-%% Undocumented hack: force chunked response to be streamed as HTTP/1.1.
-streamed_response(Config) ->
-       Client = raw_open(Config),
-       ok = raw_send(Client, "GET /streamed_response HTTP/1.1\r\nHost: localhost\r\n\r\n"),
-       Data = raw_recv_head(Client),
-       {'HTTP/1.1', 200, _, Rest} = cow_http:parse_status_line(Data),
-       {Headers, Rest2} = cow_http:parse_headers(Rest),
-       false = lists:keymember(<<"transfer-encoding">>, 1, Headers),
-       Rest2Size = byte_size(Rest2),
-       ok = case <<"streamed_handler\r\nworks fine!">> of
-               Rest2 -> ok;
-               << Rest2:Rest2Size/binary, Expect/bits >> -> raw_expect_recv(Client, Expect)
-       end.
-
-te_chunked(Config) ->
-       Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body",
-               [{<<"transfer-encoding">>, <<"chunked">>}], Body),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, Body} = gun:await_body(ConnPid, Ref),
-       ok.
-
-do_body_to_chunks(_, <<>>, Acc) ->
-       lists:reverse([<<"0\r\n\r\n">>|Acc]);
-do_body_to_chunks(ChunkSize, Body, Acc) ->
-       BodySize = byte_size(Body),
-       ChunkSize2 = case BodySize < ChunkSize of
-               true -> BodySize;
-               false -> ChunkSize
-       end,
-       << Chunk:ChunkSize2/binary, Rest/binary >> = Body,
-       ChunkSizeBin = list_to_binary(integer_to_list(ChunkSize2, 16)),
-       do_body_to_chunks(ChunkSize, Rest,
-               [<< ChunkSizeBin/binary, "\r\n", Chunk/binary, "\r\n" >>|Acc]).
-
-te_chunked_chopped(Config) ->
-       Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
-       Body2 = iolist_to_binary(do_body_to_chunks(50, Body, [])),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body",
-               [{<<"transfer-encoding">>, <<"chunked">>}]),
-       _ = [begin
-               ok = gun:dbg_send_raw(ConnPid, << C >>),
-               receive after 10 -> ok end
-       end || << C >> <= Body2],
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, Body} = gun:await_body(ConnPid, Ref),
-       ok.
-
-te_chunked_delayed(Config) ->
-       Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
-       Chunks = do_body_to_chunks(50, Body, []),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body",
-               [{<<"transfer-encoding">>, <<"chunked">>}]),
-       _ = [begin
-               ok = gun:dbg_send_raw(ConnPid, Chunk),
-               receive after 10 -> ok end
-       end || Chunk <- Chunks],
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, Body} = gun:await_body(ConnPid, Ref),
-       ok.
-
-te_chunked_split_body(Config) ->
-       Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
-       Chunks = do_body_to_chunks(50, Body, []),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body",
-               [{<<"transfer-encoding">>, <<"chunked">>}]),
-       _ = [begin
-               case Chunk of
-                       <<"0\r\n\r\n">> ->
-                               ok = gun:dbg_send_raw(ConnPid, Chunk);
-                       _ ->
-                               [Size, ChunkBody, <<>>] =
-                                       binary:split(Chunk, [<<"\r\n">>], [global]),
-                               PartASize = random:uniform(byte_size(ChunkBody)),
-                               <<PartA:PartASize/binary, PartB/binary>> = ChunkBody,
-                               ok = gun:dbg_send_raw(ConnPid, [Size, <<"\r\n">>, PartA]),
-                               receive after 10 -> ok end,
-                               ok = gun:dbg_send_raw(ConnPid, [PartB, <<"\r\n">>])
-               end
-       end || Chunk <- Chunks],
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, Body} = gun:await_body(ConnPid, Ref),
-       ok.
-
-te_chunked_split_crlf(Config) ->
-       Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
-       Chunks = do_body_to_chunks(50, Body, []),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body",
-               [{<<"transfer-encoding">>, <<"chunked">>}]),
-       _ = [begin
-               %% Split in the newline just before the end of the chunk.
-               Len = byte_size(Chunk) - (random:uniform(2) - 1),
-               << Chunk2:Len/binary, End/binary >> = Chunk,
-               ok = gun:dbg_send_raw(ConnPid, Chunk2),
-               receive after 10 -> ok end,
-               ok = gun:dbg_send_raw(ConnPid, End)
-       end || Chunk <- Chunks],
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, Body} = gun:await_body(ConnPid, Ref),
-       ok.
-
-te_identity(Config) ->
-       Body = list_to_binary(io_lib:format("~p", [lists:seq(1, 100)])),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/echo/body", [], Body),
-       {response, nofin, 200, _} = gun:await(ConnPid, Ref),
-       {ok, Body} = gun:await_body(ConnPid, Ref),
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_body_qs.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_body_qs.erl
deleted file mode 100644 (file)
index 8a438e6..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_body_qs).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_, http}, Req, _) ->
-       {ok, Req, undefined}.
-
-handle(Req, State) ->
-       {Method, Req2} = cowboy_req:method(Req),
-       HasBody = cowboy_req:has_body(Req2),
-       {ok, Req3} = maybe_echo(Method, HasBody, Req2),
-       {ok, Req3, State}.
-
-maybe_echo(<<"POST">>, true, Req) ->
-       case cowboy_req:body_qs(Req) of
-               {badlength, Req2} ->
-                       echo(badlength, Req2);
-               {ok, PostVals, Req2} ->
-                       echo(proplists:get_value(<<"echo">>, PostVals), Req2)
-       end;
-
-maybe_echo(<<"POST">>, false, Req) ->
-       cowboy_req:reply(400, [], <<"Missing body.">>, Req);
-maybe_echo(_, _, Req) ->
-       %% Method not allowed.
-       cowboy_req:reply(405, Req).
-
-echo(badlength, Req) ->
-       cowboy_req:reply(413, [], <<"POST body bigger than 16000 bytes">>, Req);
-echo(undefined, Req) ->
-       cowboy_req:reply(400, [], <<"Missing echo parameter.">>, Req);
-echo(Echo, Req) ->
-       cowboy_req:reply(200, [
-               {<<"content-type">>, <<"text/plain; charset=utf-8">>}
-       ], Echo, Req).
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_chunked.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_chunked.erl
deleted file mode 100644 (file)
index 447c0f6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_chunked).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_Transport, http}, Req, _Opts) ->
-       {ok, Req, undefined}.
-
-handle(Req, State) ->
-       {ok, Req2} = cowboy_req:chunked_reply(200, Req),
-       timer:sleep(100),
-       cowboy_req:chunk("chunked_handler\r\n", Req2),
-       timer:sleep(100),
-       cowboy_req:chunk("works fine!", Req2),
-       {ok, Req2, State}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_echo_body.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_echo_body.erl
deleted file mode 100644 (file)
index 3334b95..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_echo_body).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_, http}, Req, _) ->
-       {ok, Req, undefined}.
-
-handle(Req, State) ->
-       true = cowboy_req:has_body(Req),
-       {ok, Req3} = case cowboy_req:body(Req, [{length, 1000000}]) of
-               {ok, Body, Req2} -> handle_body(Req2, Body);
-               {more, _, Req2} -> handle_badlength(Req2)
-       end,
-       {ok, Req3, State}.
-
-handle_badlength(Req) ->
-       {ok, Req2} = cowboy_req:reply(413, [], <<"Request entity too large">>, Req),
-       {ok, Req2}.
-
-handle_body(Req, Body) ->
-       {Size, Req2} = cowboy_req:body_length(Req),
-       Size = byte_size(Body),
-       {ok, Req3} = cowboy_req:reply(200, [], Body, Req2),
-       {ok, Req3}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_errors.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_errors.erl
deleted file mode 100644 (file)
index 35ac3bd..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_errors).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_Transport, http}, Req, _Opts) ->
-    {Case, Req1} = cowboy_req:qs_val(<<"case">>, Req),
-    case_init(Case, Req1).
-
-case_init(<<"init_before_reply">> = Case, _Req) ->
-       cowboy_error_h:ignore(?MODULE, case_init, 2),
-    erlang:error(Case);
-case_init(<<"init_after_reply">> = Case, Req) ->
-       cowboy_error_h:ignore(?MODULE, case_init, 2),
-    {ok, _Req1} = cowboy_req:reply(200, [], "http_handler_crashes", Req),
-    erlang:error(Case);
-case_init(<<"init_reply_handle_error">> = Case, Req) ->
-    {ok, Req1} = cowboy_req:reply(200, [], "http_handler_crashes", Req),
-    {ok, Req1, Case};
-case_init(<<"handle_before_reply">> = Case, Req) ->
-    {ok, Req, Case};
-case_init(<<"handle_after_reply">> = Case, Req) ->
-    {ok, Req, Case}.
-
-handle(_Req, <<"init_reply_handle_error">> = Case) ->
-       cowboy_error_h:ignore(?MODULE, handle, 2),
-    erlang:error(Case);
-handle(_Req, <<"handle_before_reply">> = Case) ->
-       cowboy_error_h:ignore(?MODULE, handle, 2),
-    erlang:error(Case);
-handle(Req, <<"handle_after_reply">> = Case) ->
-       cowboy_error_h:ignore(?MODULE, handle, 2),
-    {ok, _Req1} = cowboy_req:reply(200, [], "http_handler_crashes", Req),
-    erlang:error(Case).
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_handler.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_handler.erl
deleted file mode 100644 (file)
index e1f1665..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_handler).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
--record(state, {headers, body}).
-
-init({_Transport, http}, Req, Opts) ->
-       Headers = proplists:get_value(headers, Opts, []),
-       Body = proplists:get_value(body, Opts, "http_handler"),
-       {ok, Req, #state{headers=Headers, body=Body}}.
-
-handle(Req, State=#state{headers=Headers, body=Body}) ->
-       {ok, Req2} = cowboy_req:reply(200, Headers, Body, Req),
-       {ok, Req2, State}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_init_shutdown.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_init_shutdown.erl
deleted file mode 100644 (file)
index 1445569..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_init_shutdown).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_Transport, http}, Req, _Opts) ->
-       {ok, Req2} = cowboy_req:reply(<<"666 Init Shutdown Testing">>,
-               [{<<"connection">>, <<"close">>}], Req),
-       {shutdown, Req2, undefined}.
-
-handle(Req, State) ->
-       {ok, Req2} = cowboy_req:reply(200, [], "Hello world!", Req),
-       {ok, Req2, State}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_loop_stream_recv.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_loop_stream_recv.erl
deleted file mode 100644 (file)
index ce0d1da..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_loop_stream_recv).
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
-init({_, http}, Req, _) ->
-       receive after 100 -> ok end,
-       self() ! stream,
-       {loop, Req, undefined, 100}.
-
-info(stream, Req, undefined) ->
-       stream(Req, 1, <<>>).
-
-stream(Req, ID, Acc) ->
-       case cowboy_req:body(Req) of
-               {ok, <<>>, Req2} ->
-                       {ok, Req3} = cowboy_req:reply(200, Req2),
-                       {ok, Req3, undefined};
-               {_, Data, Req2} ->
-                       parse_id(Req2, ID, << Acc/binary, Data/binary >>)
-       end.
-
-parse_id(Req, ID, Data) ->
-       case Data of
-               << ID:32, Rest/bits >> ->
-                       parse_id(Req, ID + 1, Rest);
-               _ ->
-                       stream(Req, ID, Data)
-       end.
-
-terminate({normal, shutdown}, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_multipart.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_multipart.erl
deleted file mode 100644 (file)
index 79bfeb8..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_multipart).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_Transport, http}, Req, []) ->
-       {ok, Req, {}}.
-
-handle(Req, State) ->
-       {Result, Req2} = acc_multipart(Req, []),
-       {ok, Req3} = cowboy_req:reply(200, [], term_to_binary(Result), Req2),
-       {ok, Req3, State}.
-
-terminate(_, _, _) ->
-       ok.
-
-acc_multipart(Req, Acc) ->
-       case cowboy_req:part(Req) of
-               {ok, Headers, Req2} ->
-                       {ok, Body, Req3} = cowboy_req:part_body(Req2),
-                       acc_multipart(Req3, [{Headers, Body}|Acc]);
-               {done, Req2} ->
-                       {lists:reverse(Acc), Req2}
-       end.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_multipart_stream.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_multipart_stream.erl
deleted file mode 100644 (file)
index 926d150..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_multipart_stream).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init(_, Req, []) ->
-       {ok, Req, undefined}.
-
-handle(Req, State) ->
-       Req2 = multipart(Req),
-       {ok, Req3} = cowboy_req:reply(200, Req2),
-       {ok, Req3, State}.
-
-terminate(_, _, _) ->
-       ok.
-
-multipart(Req) ->
-       case cowboy_req:part(Req) of
-               {ok, [{<<"content-length">>, BinLength}], Req2} ->
-                       Length = list_to_integer(binary_to_list(BinLength)),
-                       {Length, Req3} = stream_body(Req2, 0),
-                       multipart(Req3);
-               {done, Req2} ->
-                       Req2
-       end.
-
-stream_body(Req, N) ->
-       case cowboy_req:part_body(Req) of
-               {ok, Data, Req2} ->
-                       {N + byte_size(Data), Req2};
-               {more, Data, Req2} ->
-                       stream_body(Req2, N + byte_size(Data))
-       end.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_req_attr.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_req_attr.erl
deleted file mode 100644 (file)
index eb5e70e..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_req_attr).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_, http}, Req, _) ->
-       {Attr, Req2} = cowboy_req:qs_val(<<"attr">>, Req),
-       {ok, Req2, Attr}.
-
-handle(Req, <<"host_and_port">> = Attr) ->
-       {Host, Req2} = cowboy_req:host(Req),
-       {Port, Req3} = cowboy_req:port(Req2),
-       Value = [Host, "\n", integer_to_list(Port)],
-       {ok, Req4} = cowboy_req:reply(200, [], Value, Req3),
-       {ok, Req4, Attr}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_set_resp.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_set_resp.erl
deleted file mode 100644 (file)
index 821cc1d..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_set_resp).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_Transport, http}, Req, Opts) ->
-       Headers = proplists:get_value(headers, Opts, []),
-       Body = proplists:get_value(body, Opts, <<"http_handler_set_resp">>),
-       Req2 = lists:foldl(fun({Name, Value}, R) ->
-               cowboy_req:set_resp_header(Name, Value, R)
-       end, Req, Headers),
-       Req3 = cowboy_req:set_resp_body(Body, Req2),
-       Req4 = cowboy_req:set_resp_header(<<"x-cowboy-test">>, <<"ok">>, Req3),
-       Req5 = cowboy_req:set_resp_cookie(<<"cake">>, <<"lie">>, [], Req4),
-       {ok, Req5, undefined}.
-
-handle(Req, State) ->
-       case cowboy_req:has_resp_header(<<"x-cowboy-test">>, Req) of
-               false -> {ok, Req, State};
-               true ->
-                       case cowboy_req:has_resp_body(Req) of
-                               false -> {ok, Req, State};
-                               true ->
-                                       {ok, Req2} = cowboy_req:reply(200, Req),
-                                       {ok, Req2, State}
-                       end
-       end.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_stream_body.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_stream_body.erl
deleted file mode 100644 (file)
index d896797..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_stream_body).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
--record(state, {headers, body, reply}).
-
-init({_Transport, http}, Req, Opts) ->
-       Headers = proplists:get_value(headers, Opts, []),
-       Body = proplists:get_value(body, Opts, "http_handler_stream_body"),
-       Reply = proplists:get_value(reply, Opts),
-       {ok, Req, #state{headers=Headers, body=Body, reply=Reply}}.
-
-handle(Req, State=#state{headers=_Headers, body=Body, reply=Reply}) ->
-       SFun = fun(Socket, Transport) -> Transport:send(Socket, Body) end,
-       Req2 = case Reply of
-               set_resp ->
-                       SLen = iolist_size(Body),
-                       cowboy_req:set_resp_body_fun(SLen, SFun, Req);
-               set_resp_close ->
-                       cowboy_req:set_resp_body_fun(SFun, Req);
-               set_resp_chunked ->
-                       %% Here Body should be a list of chunks, not a binary.
-                       SFun2 = fun(SendFun) -> lists:foreach(SendFun, Body) end,
-                       cowboy_req:set_resp_body_fun(chunked, SFun2, Req)
-       end,
-       {ok, Req3} = cowboy_req:reply(200, Req2),
-       {ok, Req3, State}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_streamed.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/http_streamed.erl
deleted file mode 100644 (file)
index 674cc40..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(http_streamed).
--behaviour(cowboy_http_handler).
--export([init/3, handle/2, terminate/3]).
-
-init({_Transport, http}, Req, _Opts) ->
-       {ok, Req, undefined}.
-
-handle(Req, State) ->
-       Req2 = cowboy_req:set([{resp_state, waiting_stream}], Req),
-       {ok, Req3} = cowboy_req:chunked_reply(200, Req2),
-       timer:sleep(100),
-       cowboy_req:chunk("streamed_handler\r\n", Req3),
-       timer:sleep(100),
-       cowboy_req:chunk("works fine!", Req3),
-       {ok, Req3, State}.
-
-terminate(_, _, _) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_empty_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_empty_resource.erl
deleted file mode 100644 (file)
index 7e7c00a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
--module(rest_empty_resource).
--export([init/3]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_expires.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_expires.erl
deleted file mode 100644 (file)
index 4209041..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
--module(rest_expires).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_text_plain/2]).
--export([expires/2]).
--export([last_modified/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
-
-expires(Req, State) ->
-       {{{2012, 9, 21}, {22, 36, 14}}, Req, State}.
-
-last_modified(Req, State) ->
-       {{{2012, 9, 21}, {22, 36, 14}}, Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_expires_binary.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_expires_binary.erl
deleted file mode 100644 (file)
index 4cbd001..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
--module(rest_expires_binary).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_text_plain/2]).
--export([expires/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
-
-expires(Req, State) ->
-       {<<"0">>, Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_forbidden_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_forbidden_resource.erl
deleted file mode 100644 (file)
index 920ba31..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
--module(rest_forbidden_resource).
--export([init/3, rest_init/2, allowed_methods/2, forbidden/2,
-               content_types_provided/2, content_types_accepted/2,
-               to_text/2, from_text/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-rest_init(Req, [Forbidden]) ->
-       {ok, Req, Forbidden}.
-
-allowed_methods(Req, State) ->
-       {[<<"GET">>, <<"HEAD">>, <<"POST">>], Req, State}.
-
-forbidden(Req, State=true) ->
-       {true, Req, State};
-forbidden(Req, State=false) ->
-       {false, Req, State}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, to_text}], Req, State}.
-
-content_types_accepted(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, from_text}], Req, State}.
-
-to_text(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
-
-from_text(Req, State) ->
-       {Path, Req2} = cowboy_req:path(Req),
-       {{true, Path}, Req2, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_missing_callbacks.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_missing_callbacks.erl
deleted file mode 100644 (file)
index 94bfbbd..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
--module(rest_missing_callbacks).
--export([init/3]).
--export([allowed_methods/2]).
--export([content_types_accepted/2]).
--export([content_types_provided/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-allowed_methods(Req, State) ->
-       {[<<"GET">>, <<"PUT">>], Req, State}.
-
-content_types_accepted(Req, State) ->
-       cowboy_error_h:ignore(cowboy_rest, process_content_type, 3),
-       {[
-               {<<"application/json">>, put_application_json}
-       ], Req, State}.
-
-content_types_provided(Req, State) ->
-       cowboy_error_h:ignore(cowboy_rest, set_resp_body, 2),
-       {[
-               {<<"text/plain">>, get_text_plain}
-       ], Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_nodelete_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_nodelete_resource.erl
deleted file mode 100644 (file)
index 9f9670c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
--module(rest_nodelete_resource).
--export([init/3, allowed_methods/2, content_types_provided/2,
-               get_text_plain/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-allowed_methods(Req, State) ->
-       {[<<"GET">>, <<"HEAD">>, <<"DELETE">>], Req, State}.
-
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
-
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_param_all.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_param_all.erl
deleted file mode 100644 (file)
index 09b8cd3..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
--module(rest_param_all).
-
--export([init/3]).
--export([allowed_methods/2]).
--export([content_types_provided/2]).
--export([get_text_plain/2]).
--export([content_types_accepted/2]).
--export([put_text_plain/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-allowed_methods(Req, State) ->
-       {[<<"GET">>, <<"PUT">>], Req, State}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, '*'}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {{_, _, Param}, Req2} =
-               cowboy_req:meta(media_type, Req, {{<<"text">>, <<"plain">>}, []}),
-       Body = if
-       Param == '*' ->
-               <<"'*'">>;
-       Param == [] ->
-               <<"[]">>;
-       Param /= [] ->
-               iolist_to_binary([[Key, $=, Value] || {Key, Value} <- Param])
-       end,
-       {Body, Req2, State}.
-
-content_types_accepted(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, '*'}, put_text_plain}], Req, State}.
-
-put_text_plain(Req, State) ->
-       {true, Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_patch_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_patch_resource.erl
deleted file mode 100644 (file)
index e265f6f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
--module(rest_patch_resource).
--export([init/3, allowed_methods/2, content_types_provided/2, get_text_plain/2,
-       content_types_accepted/2, patch_text_plain/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-allowed_methods(Req, State) ->
-       {[<<"HEAD">>, <<"GET">>, <<"PATCH">>], Req, State}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
-
-content_types_accepted(Req, State) ->
-       case cowboy_req:method(Req) of
-               {<<"PATCH">>, Req0} ->
-                       {[{{<<"text">>, <<"plain">>, []}, patch_text_plain}], Req0, State};
-               {_, Req0} ->
-                       {[], Req0, State}
-       end.
-
-patch_text_plain(Req, State) ->
-       case cowboy_req:body(Req) of
-               {ok, <<"halt">>, Req0} ->
-                       {ok, Req1} = cowboy_req:reply(400, Req0),
-                       {halt, Req1, State};
-               {ok, <<"false">>, Req0} ->
-                       {false, Req0, State};
-               {ok, _Body, Req0} ->
-                       {true, Req0, State}
-       end.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_post_charset_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_post_charset_resource.erl
deleted file mode 100644 (file)
index 9ccfa61..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
--module(rest_post_charset_resource).
--export([init/3, allowed_methods/2, content_types_accepted/2, from_text/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-allowed_methods(Req, State) ->
-       {[<<"POST">>], Req, State}.
-
-content_types_accepted(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, [{<<"charset">>, <<"utf-8">>}]},
-               from_text}], Req, State}.
-
-from_text(Req, State) ->
-       {true, Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_postonly_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_postonly_resource.erl
deleted file mode 100644 (file)
index 4f725c9..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
--module(rest_postonly_resource).
--export([init/3, allowed_methods/2, content_types_accepted/2, from_text/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-allowed_methods(Req, State) ->
-       {[<<"POST">>], Req, State}.
-
-content_types_accepted(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, '*'}, from_text}], Req, State}.
-
-from_text(Req, State) ->
-       {true, Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_resource_etags.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_resource_etags.erl
deleted file mode 100644 (file)
index 2652f57..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
--module(rest_resource_etags).
--export([init/3, generate_etag/2, content_types_provided/2, get_text_plain/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-generate_etag(Req, State) ->
-       case cowboy_req:qs_val(<<"type">>, Req) of
-               %% Correct return values from generate_etag/2.
-               {<<"tuple-weak">>, Req2} ->
-                       {{weak, <<"etag-header-value">>}, Req2, State};
-               {<<"tuple-strong">>, Req2} ->
-                       {{strong, <<"etag-header-value">>}, Req2, State};
-               %% Backwards compatible return values from generate_etag/2.
-               {<<"binary-weak-quoted">>, Req2} ->
-                       {<<"W/\"etag-header-value\"">>, Req2, State};
-               {<<"binary-strong-quoted">>, Req2} ->
-                       {<<"\"etag-header-value\"">>, Req2, State};
-               %% Invalid return values from generate_etag/2.
-               {<<"binary-strong-unquoted">>, Req2} ->
-                       cowboy_error_h:ignore(cowboy_http, quoted_string, 2),
-                       {<<"etag-header-value">>, Req2, State};
-               {<<"binary-weak-unquoted">>, Req2} ->
-                       cowboy_error_h:ignore(cowboy_http, quoted_string, 2),
-                       {<<"W/etag-header-value">>, Req2, State}
-       end.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
diff --git a/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_simple_resource.erl b/rabbitmq-server/deps/cowboy/test/http_SUITE_data/rest_simple_resource.erl
deleted file mode 100644 (file)
index 97145dd..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
--module(rest_simple_resource).
--export([init/3, content_types_provided/2, get_text_plain/2]).
-
-init(_Transport, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"plain">>, []}, get_text_plain}], Req, State}.
-
-get_text_plain(Req, State) ->
-       {<<"This is REST!">>, Req, State}.
-
diff --git a/rabbitmq-server/deps/cowboy/test/loop_handler_SUITE.erl b/rabbitmq-server/deps/cowboy/test/loop_handler_SUITE.erl
deleted file mode 100644 (file)
index 5f69490..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-%% Copyright (c) 2011-2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(loop_handler_SUITE).
--compile(export_all).
-
--import(cowboy_test, [config/2]).
--import(cowboy_test, [doc/1]).
--import(cowboy_test, [gun_open/1]).
-
-%% ct.
-
-all() ->
-       cowboy_test:common_all().
-
-groups() ->
-       cowboy_test:common_groups(cowboy_test:all(?MODULE)).
-
-init_per_group(Name, Config) ->
-       cowboy_test:init_common_groups(Name, Config, ?MODULE).
-
-end_per_group(Name, _) ->
-       cowboy:stop_listener(Name).
-
-%% Dispatch configuration.
-
-init_dispatch(_) ->
-       cowboy_router:compile([{'_', [
-               {"/long_polling", long_polling_h, []},
-               {"/loop_body", loop_handler_body_h, []},
-               {"/loop_timeout", loop_handler_timeout_h, []}
-       ]}]).
-
-%% Tests.
-
-long_polling(Config) ->
-       doc("Simple long-polling."),
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/long_polling"),
-       {response, fin, 102, _} = gun:await(ConnPid, Ref),
-       ok.
-
-long_polling_body(Config) ->
-       doc("Long-polling with a body that falls within the configurable limits."),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/long_polling", [], << 0:5000/unit:8 >>),
-       {response, fin, 102, _} = gun:await(ConnPid, Ref),
-       ok.
-
-long_polling_body_too_large(Config) ->
-       doc("Long-polling with a body that exceeds the configurable limits."),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/long_polling", [], << 0:100000/unit:8 >>),
-       {response, fin, 500, _} = gun:await(ConnPid, Ref),
-       ok.
-
-long_polling_pipeline(Config) ->
-       doc("Pipeline of long-polling calls."),
-       ConnPid = gun_open(Config),
-       Refs = [gun:get(ConnPid, "/long_polling") || _ <- lists:seq(1, 2)],
-       _ = [{response, fin, 102, _} = gun:await(ConnPid, Ref) || Ref <- Refs],
-       ok.
-
-loop_body(Config) ->
-       doc("Check that a loop handler can read the request body in info/3."),
-       ConnPid = gun_open(Config),
-       Ref = gun:post(ConnPid, "/loop_body", [], << 0:100000/unit:8 >>),
-       {response, fin, 200, _} = gun:await(ConnPid, Ref),
-       ok.
-
-loop_timeout(Config) ->
-       doc("Ensure that the loop handler timeout results in a 204 response."),
-       ConnPid = gun_open(Config),
-       Ref = gun:get(ConnPid, "/loop_timeout"),
-       {response, fin, 204, _} = gun:await(ConnPid, Ref),
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/spdy_SUITE.erl b/rabbitmq-server/deps/cowboy/test/spdy_SUITE.erl
deleted file mode 100644 (file)
index b26e5f8..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-%% Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(spdy_SUITE).
--compile(export_all).
-
--import(cowboy_test, [config/2]).
--import(cowboy_test, [gun_monitor_open/1]).
--import(cowboy_test, [raw_open/1]).
--import(cowboy_test, [raw_send/2]).
-
-%% ct.
-
-all() ->
-       [{group, spdy}].
-
-groups() ->
-       [{spdy, [], cowboy_test:all(?MODULE)}].
-
-init_per_suite(Config) ->
-       case proplists:get_value(ssl_app, ssl:versions()) of
-               Version when Version < "5.2.1" ->
-                       {skip, "No NPN support in SSL application."};
-               _ ->
-                       Dir = config(priv_dir, Config) ++ "/static",
-                       ct_helper:create_static_dir(Dir),
-                       [{static_dir, Dir}|Config]
-       end.
-
-end_per_suite(Config) ->
-       ct_helper:delete_static_dir(config(static_dir, Config)).
-
-init_per_group(Name, Config) ->
-       cowboy_test:init_spdy(Name, [
-               {env, [{dispatch, init_dispatch(Config)}]}
-       ], Config).
-
-end_per_group(Name, _) ->
-       cowboy:stop_listener(Name).
-
-%% Dispatch configuration.
-
-init_dispatch(Config) ->
-       cowboy_router:compile([
-               {"localhost", [
-                       {"/static/[...]", cowboy_static,
-                               {dir, config(static_dir, Config)}},
-                       {"/echo/body", http_echo_body, []},
-                       {"/chunked", http_chunked, []},
-                       {"/", http_handler, []}
-               ]}
-       ]).
-
-%% Convenience functions.
-
-do_get(ConnPid, MRef, Host, Path) ->
-       StreamRef = gun:get(ConnPid, Path, [{":host", Host}]),
-       {response, IsFin, Status, _} = gun:await(ConnPid, StreamRef, MRef),
-       {IsFin, Status}.
-
-%% Tests.
-
-check_status(Config) ->
-       Tests = [
-               {200, nofin, "localhost", "/"},
-               {200, nofin, "localhost", "/chunked"},
-               {200, nofin, "localhost", "/static/style.css"},
-               {400, fin, "bad-host", "/"},
-               {400, fin, "localhost", "bad-path"},
-               {404, fin, "localhost", "/this/path/does/not/exist"}
-       ],
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       _ = [{Status, Fin, Host, Path} = begin
-               {IsFin, Ret} = do_get(ConnPid, MRef, Host, Path),
-               {Ret, IsFin, Host, Path}
-       end || {Status, Fin, Host, Path} <- Tests],
-       gun:close(ConnPid).
-
-echo_body(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       Body = << 0:800000 >>,
-       StreamRef = gun:post(ConnPid, "/echo/body", [
-               {<<"content-type">>, "application/octet-stream"}
-       ], Body),
-       {response, nofin, 200, _} = gun:await(ConnPid, StreamRef, MRef),
-       {ok, Body} = gun:await_body(ConnPid, StreamRef, MRef),
-       gun:close(ConnPid).
-
-echo_body_multi(Config) ->
-       {ConnPid, MRef} = gun_monitor_open(Config),
-       BodyChunk = << 0:80000 >>,
-       StreamRef = gun:post(ConnPid, "/echo/body", [
-               %% @todo I'm still unhappy with this. It shouldn't be required...
-               {<<"content-length">>, integer_to_list(byte_size(BodyChunk) * 10)},
-               {<<"content-type">>, "application/octet-stream"}
-       ]),
-       _ = [gun:data(ConnPid, StreamRef, nofin, BodyChunk) || _ <- lists:seq(1, 9)],
-       gun:data(ConnPid, StreamRef, fin, BodyChunk),
-       {response, nofin, 200, _} = gun:await(ConnPid, StreamRef, MRef),
-       {ok, << 0:800000 >>} = gun:await_body(ConnPid, StreamRef, MRef),
-       gun:close(ConnPid).
-
-two_frames_one_packet(Config) ->
-       {raw_client, Socket, Transport} = Client = raw_open([
-               {opts, [{client_preferred_next_protocols,
-                       {client, [<<"spdy/3">>], <<"spdy/3">>}}]}
-               |Config]),
-       Zdef = cow_spdy:deflate_init(),
-       Zinf = cow_spdy:inflate_init(),
-       ok = raw_send(Client, iolist_to_binary([
-               cow_spdy:syn_stream(Zdef, 1, 0, true, false,
-                       0, <<"GET">>, <<"https">>, <<"localhost">>,
-                       <<"/">>, <<"HTTP/1.1">>, []),
-               cow_spdy:syn_stream(Zdef, 3, 0, true, false,
-                       0, <<"GET">>, <<"https">>, <<"localhost">>,
-                       <<"/">>, <<"HTTP/1.1">>, [])
-       ])),
-       {Frame1, Rest1} = spdy_recv(Socket, Transport, <<>>),
-       {syn_reply, _, false, <<"200 OK">>, _, _} = cow_spdy:parse(Frame1, Zinf),
-       {Frame2, Rest2} = spdy_recv(Socket, Transport, Rest1),
-       {data, 1, true, _} = cow_spdy:parse(Frame2, Zinf),
-       {Frame3, Rest3} = spdy_recv(Socket, Transport, Rest2),
-       {syn_reply, _, false, <<"200 OK">>, _, _} = cow_spdy:parse(Frame3, Zinf),
-       {Frame4, <<>>} = spdy_recv(Socket, Transport, Rest3),
-       {data, 3, true, _} = cow_spdy:parse(Frame4, Zinf),
-       ok.
-
-spdy_recv(Socket, Transport, Acc) ->
-       {ok, Data} = Transport:recv(Socket, 0, 5000),
-       Data2 = << Acc/binary, Data/bits >>,
-       case cow_spdy:split(Data2) of
-               false ->
-                       spdy_recv(Socket, Transport, Data2);
-               {true, Frame, Rest} ->
-                       {Frame, Rest}
-       end.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE.erl
deleted file mode 100644 (file)
index 77c82f6..0000000
+++ /dev/null
@@ -1,710 +0,0 @@
-%% Copyright (c) 2011-2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(ws_SUITE).
--compile(export_all).
-
--import(cowboy_test, [config/2]).
-
-%% ct.
-
-all() ->
-       [{group, autobahn}, {group, ws}].
-
-groups() ->
-       BaseTests = cowboy_test:all(?MODULE) -- [autobahn_fuzzingclient],
-       [{autobahn, [], [autobahn_fuzzingclient]}, {ws, [parallel], BaseTests}].
-
-init_per_suite(Config) ->
-       Config.
-
-init_per_group(Name = autobahn, Config) ->
-       %% Some systems have it named pip2.
-       Out = os:cmd("pip show autobahntestsuite ; pip2 show autobahntestsuite"),
-       case string:str(Out, "autobahntestsuite") of
-               0 ->
-                       ct:print("Skipping the autobahn group because the "
-                               "Autobahn Test Suite is not installed.~nTo install it, "
-                               "please follow the instructions on this page:~n~n    "
-                               "http://autobahn.ws/testsuite/installation.html"),
-                       {skip, "Autobahn Test Suite not installed."};
-               _ ->
-                       {ok, _} = cowboy:start_http(Name, 100, [{port, 33080}], [
-                               {env, [{dispatch, init_dispatch()}]}]),
-                       Config
-       end;
-init_per_group(Name = ws, Config) ->
-       cowboy_test:init_http(Name, [
-               {env, [{dispatch, init_dispatch()}]},
-               {compress, true}
-       ], Config).
-
-end_per_group(Listener, _Config) ->
-       cowboy:stop_listener(Listener).
-
-%% Dispatch configuration.
-
-init_dispatch() ->
-       cowboy_router:compile([
-               {"localhost", [
-                       {"/ws_echo", ws_echo, []},
-                       {"/ws_echo_timer", ws_echo_timer, []},
-                       {"/ws_init_shutdown", ws_init_shutdown, []},
-                       {"/ws_send_many", ws_send_many, [
-                               {sequence, [
-                                       {text, <<"one">>},
-                                       {text, <<"two">>},
-                                       {text, <<"seven!">>}]}
-                       ]},
-                       {"/ws_send_close", ws_send_many, [
-                               {sequence, [
-                                       {text, <<"send">>},
-                                       close,
-                                       {text, <<"won't be received">>}]}
-                       ]},
-                       {"/ws_send_close_payload", ws_send_many, [
-                               {sequence, [
-                                       {text, <<"send">>},
-                                       {close, 1001, <<"some text!">>},
-                                       {text, <<"won't be received">>}]}
-                       ]},
-                       {"/ws_timeout_hibernate", ws_timeout_hibernate, []},
-                       {"/ws_timeout_cancel", ws_timeout_cancel, []},
-                       {"/ws_upgrade_with_opts", ws_upgrade_with_opts,
-                               <<"failure">>}
-               ]}
-       ]).
-
-%% Tests.
-
-autobahn_fuzzingclient(Config) ->
-       Out = os:cmd("cd " ++ config(priv_dir, Config)
-               ++ " && wstest -m fuzzingclient -s "
-               ++ config(data_dir, Config) ++ "client.json"),
-       Report = config(priv_dir, Config) ++ "reports/servers/index.html",
-       ct:log("<h2><a href=\"~s\">Full report</a></h2>~n", [Report]),
-       ct:print("Autobahn Test Suite report: file://~s~n", [Report]),
-       ct:log("~s~n", [Out]),
-       {ok, HTML} = file:read_file(Report),
-       case length(binary:matches(HTML, <<"case_failed">>)) > 2 of
-               true -> error(failed);
-               false -> ok
-       end.
-
-%% We do not support hixie76 anymore.
-ws0(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket,
-               "GET /ws_echo_timer HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: WebSocket\r\n"
-               "Origin: http://localhost\r\n"
-               "Sec-Websocket-Key1: Y\" 4 1Lj!957b8@0H756!i\r\n"
-               "Sec-Websocket-Key2: 1711 M;4\\74  80<6\r\n"
-               "\r\n"),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 400, _}, _}
-               = erlang:decode_packet(http, Handshake, []).
-
-ws8(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo_timer HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       ok = gen_tcp:send(Socket, << 16#81, 16#85, 16#37, 16#fa, 16#21, 16#3d,
-               16#7f, 16#9f, 16#4d, 16#51, 16#58 >>),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 5:7, "Hello" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 14:7, "websocket_init" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 9:4, 1:1, 0:7, 0:32 >>), %% ping
-       {ok, << 1:1, 0:3, 10:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000), %% pong
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws8_init_shutdown(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_init_shutdown HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 403, "Forbidden"}, _Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws8_single_bytes(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo_timer HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       ok = gen_tcp:send(Socket, << 16#81 >>), %% send one byte
-       ok = timer:sleep(100), %% sleep for a period
-       ok = gen_tcp:send(Socket, << 16#85 >>), %% send another and so on
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#37 >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#fa >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#21 >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#3d >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#7f >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#9f >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#4d >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#51 >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, << 16#58 >>),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 14:7, "websocket_init" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 5:7, "Hello" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 9:4, 1:1, 0:7, 0:32 >>), %% ping
-       {ok, << 1:1, 0:3, 10:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000), %% pong
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws13(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo_timer HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 13\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "Upgrade: websocket\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       %% text
-       ok = gen_tcp:send(Socket, << 16#81, 16#85, 16#37, 16#fa, 16#21, 16#3d,
-               16#7f, 16#9f, 16#4d, 16#51, 16#58 >>),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 5:7, "Hello" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       %% binary (empty)
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 2:4, 1:1, 0:7, 0:32 >>),
-       {ok, << 1:1, 0:3, 2:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       %% binary
-       ok = gen_tcp:send(Socket, << 16#82, 16#85, 16#37, 16#fa, 16#21, 16#3d,
-               16#7f, 16#9f, 16#4d, 16#51, 16#58 >>),
-       {ok, << 1:1, 0:3, 2:4, 0:1, 5:7, "Hello" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       %% Receives.
-       {ok, << 1:1, 0:3, 1:4, 0:1, 14:7, "websocket_init" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 16:7, "websocket_handle" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 9:4, 1:1, 0:7, 0:32 >>), %% ping
-       {ok, << 1:1, 0:3, 10:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000), %% pong
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_deflate(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}, {nodelay, true}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "Sec-WebSocket-Extensions: x-webkit-deflate-frame\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       {"sec-websocket-extensions", "x-webkit-deflate-frame"}
-               = lists:keyfind("sec-websocket-extensions", 1, Headers),
-
-       Mask = 16#11223344,
-       Hello = << 242, 72, 205, 201, 201, 7, 0 >>,
-       MaskedHello = do_mask(Hello, Mask, <<>>),
-
-       % send compressed text frame containing the Hello string
-       ok = gen_tcp:send(Socket, << 1:1, 1:1, 0:2, 1:4, 1:1, 7:7, Mask:32,
-               MaskedHello/binary >>),
-       % receive compressed text frame containing the Hello string
-       {ok, << 1:1, 1:1, 0:2, 1:4, 0:1, 7:7, Hello/binary >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_deflate_chunks(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}, {nodelay, true}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "Sec-WebSocket-Extensions: x-webkit-deflate-frame\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       {"sec-websocket-extensions", "x-webkit-deflate-frame"}
-               = lists:keyfind("sec-websocket-extensions", 1, Headers),
-
-       Mask = 16#11223344,
-       Hello = << 242, 72, 205, 201, 201, 7, 0 >>,
-       MaskedHello = do_mask(Hello, Mask, <<>>),
-
-       % send compressed text frame containing the Hello string
-       ok = gen_tcp:send(Socket, << 1:1, 1:1, 0:2, 1:4, 1:1, 7:7, Mask:32,
-               (binary:part(MaskedHello, 0, 4))/binary >>),
-       ok = timer:sleep(100),
-       ok = gen_tcp:send(Socket, binary:part(MaskedHello, 4, 3)),
-
-       % receive compressed text frame containing the Hello string
-       {ok, << 1:1, 1:1, 0:2, 1:4, 0:1, 7:7, Hello/binary >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_deflate_fragments(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}, {nodelay, true}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "Sec-WebSocket-Extensions: x-webkit-deflate-frame\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       {"sec-websocket-extensions", "x-webkit-deflate-frame"}
-               = lists:keyfind("sec-websocket-extensions", 1, Headers),
-
-       Mask = 16#11223344,
-       Hello = << 242, 72, 205, 201, 201, 7, 0 >>,
-
-       % send compressed text frame containing the Hello string
-       % as 2 separate fragments
-       ok = gen_tcp:send(Socket, << 0:1, 1:1, 0:2, 1:4, 1:1, 4:7, Mask:32,
-               (do_mask(binary:part(Hello, 0, 4), Mask, <<>>))/binary >>),
-       ok = gen_tcp:send(Socket, << 1:1, 1:1, 0:2, 0:4, 1:1, 3:7, Mask:32,
-               (do_mask(binary:part(Hello, 4, 3), Mask, <<>>))/binary >>),
-       % receive compressed text frame containing the Hello string
-       {ok, << 1:1, 1:1, 0:2, 1:4, 0:1, 7:7, Hello/binary >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_send_close(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_send_close HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       %% We catch all frames at once and check them directly.
-       {ok, Many} = gen_tcp:recv(Socket, 8, 6000),
-       << 1:1, 0:3, 1:4, 0:1, 4:7, "send",
-               1:1, 0:3, 8:4, 0:8 >> = Many,
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_send_close_payload(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_send_close_payload HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       %% We catch all frames at once and check them directly.
-       {ok, Many} = gen_tcp:recv(Socket, 20, 6000),
-       << 1:1, 0:3, 1:4, 0:1, 4:7, "send",
-               1:1, 0:3, 8:4, 0:1, 12:7, 1001:16, "some text!" >> = Many,
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_send_many(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_send_many HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       %% We catch all frames at once and check them directly.
-       {ok, Many} = gen_tcp:recv(Socket, 18, 6000),
-       << 1:1, 0:3, 1:4, 0:1, 3:7, "one",
-               1:1, 0:3, 1:4, 0:1, 3:7, "two",
-               1:1, 0:3, 1:4, 0:1, 6:7, "seven!" >> = Many,
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_text_fragments(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_echo HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-
-       ok = gen_tcp:send(Socket, [
-               << 0:1, 0:3, 1:4, 1:1, 5:7 >>,
-               << 16#37 >>, << 16#fa >>, << 16#21 >>, << 16#3d >>, << 16#7f >>,
-               << 16#9f >>, << 16#4d >>, << 16#51 >>, << 16#58 >>]),
-       ok = gen_tcp:send(Socket, [
-               << 1:1, 0:3, 0:4, 1:1, 5:7 >>,
-               << 16#37 >>, << 16#fa >>, << 16#21 >>, << 16#3d >>, << 16#7f >>,
-               << 16#9f >>, << 16#4d >>, << 16#51 >>, << 16#58 >>]),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 10:7, "HelloHello" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-
-       ok = gen_tcp:send(Socket, [
-               %% #1
-               << 0:1, 0:3, 1:4, 1:1, 5:7 >>,
-               << 16#37 >>, << 16#fa >>, << 16#21 >>, << 16#3d >>, << 16#7f >>,
-               << 16#9f >>, << 16#4d >>, << 16#51 >>, << 16#58 >>,
-               %% #2
-               << 0:1, 0:3, 0:4, 1:1, 5:7 >>,
-               << 16#37 >>, << 16#fa >>, << 16#21 >>, << 16#3d >>, << 16#7f >>,
-               << 16#9f >>, << 16#4d >>, << 16#51 >>, << 16#58 >>,
-               %% #3
-               << 1:1, 0:3, 0:4, 1:1, 5:7 >>,
-               << 16#37 >>, << 16#fa >>, << 16#21 >>, << 16#3d >>, << 16#7f >>,
-               << 16#9f >>, << 16#4d >>, << 16#51 >>, << 16#58 >>]),
-       {ok, << 1:1, 0:3, 1:4, 0:1, 15:7, "HelloHelloHello" >>}
-               = gen_tcp:recv(Socket, 0, 6000),
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_timeout_hibernate(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_timeout_hibernate HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       {ok, << 1:1, 0:3, 8:4, 0:1, 2:7, 1000:16 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_timeout_cancel(Config) ->
-       %% Erlang messages to a socket should not cancel the timeout    
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_timeout_cancel HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       {ok, << 1:1, 0:3, 8:4, 0:1, 2:7, 1000:16 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_timeout_reset(Config) ->
-       %% Erlang messages across a socket should reset the timeout     
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_timeout_cancel HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-Websocket-Version: 13\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       [begin
-               ok = gen_tcp:send(Socket, << 16#81, 16#85, 16#37, 16#fa, 16#21, 16#3d,
-                       16#7f, 16#9f, 16#4d, 16#51, 16#58 >>),
-               {ok, << 1:1, 0:3, 1:4, 0:1, 5:7, "Hello" >>}
-                       = gen_tcp:recv(Socket, 0, 6000),
-               ok = timer:sleep(500)
-       end || _ <- [1, 2, 3, 4]],
-       {ok, << 1:1, 0:3, 8:4, 0:1, 2:7, 1000:16 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-ws_upgrade_with_opts(Config) ->
-       {port, Port} = lists:keyfind(port, 1, Config),
-       {ok, Socket} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, [
-               "GET /ws_upgrade_with_opts HTTP/1.1\r\n"
-               "Host: localhost\r\n"
-               "Connection: Upgrade\r\n"
-               "Upgrade: websocket\r\n"
-               "Sec-WebSocket-Origin: http://localhost\r\n"
-               "Sec-WebSocket-Version: 8\r\n"
-               "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
-               "\r\n"]),
-       {ok, Handshake} = gen_tcp:recv(Socket, 0, 6000),
-       {ok, {http_response, {1, 1}, 101, "Switching Protocols"}, Rest}
-               = erlang:decode_packet(http, Handshake, []),
-       [Headers, <<>>] = do_decode_headers(
-               erlang:decode_packet(httph, Rest, []), []),
-       {'Connection', "Upgrade"} = lists:keyfind('Connection', 1, Headers),
-       {'Upgrade', "websocket"} = lists:keyfind('Upgrade', 1, Headers),
-       {"sec-websocket-accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}
-               = lists:keyfind("sec-websocket-accept", 1, Headers),
-       {ok, Response} = gen_tcp:recv(Socket, 9, 6000),
-       << 1:1, 0:3, 1:4, 0:1, 7:7, "success" >> = Response,
-       ok = gen_tcp:send(Socket, << 1:1, 0:3, 8:4, 1:1, 0:7, 0:32 >>), %% close
-       {ok, << 1:1, 0:3, 8:4, 0:8 >>} = gen_tcp:recv(Socket, 0, 6000),
-       {error, closed} = gen_tcp:recv(Socket, 0, 6000),
-       ok.
-
-%% Internal.
-
-do_decode_headers({ok, http_eoh, Rest}, Acc) ->
-       [Acc, Rest];
-do_decode_headers({ok, {http_header, _I, Key, _R, Value}, Rest}, Acc) ->
-       F = fun(S) when is_atom(S) -> S; (S) -> string:to_lower(S) end,
-       do_decode_headers(erlang:decode_packet(httph, Rest, []),
-               [{F(Key), Value}|Acc]).
-
-do_mask(<<>>, _, Acc) ->
-       Acc;
-do_mask(<< O:32, Rest/bits >>, MaskKey, Acc) ->
-       T = O bxor MaskKey,
-       do_mask(Rest, MaskKey, << Acc/binary, T:32 >>);
-do_mask(<< O:24 >>, MaskKey, Acc) ->
-       << MaskKey2:24, _:8 >> = << MaskKey:32 >>,
-       T = O bxor MaskKey2,
-       << Acc/binary, T:24 >>;
-do_mask(<< O:16 >>, MaskKey, Acc) ->
-       << MaskKey2:16, _:16 >> = << MaskKey:32 >>,
-       T = O bxor MaskKey2,
-       << Acc/binary, T:16 >>;
-do_mask(<< O:8 >>, MaskKey, Acc) ->
-       << MaskKey2:8, _:24 >> = << MaskKey:32 >>,
-       T = O bxor MaskKey2,
-       << Acc/binary, T:8 >>.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/client.json b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/client.json
deleted file mode 100644 (file)
index 7899503..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-       "options": {"failByDrop": false},
-       "enable-ssl": false,
-
-       "servers": [{
-               "agent": "Cowboy",
-               "url": "ws://localhost:33080/ws_echo",
-               "options": {"version": 18}
-       }],
-
-       "cases": ["*"],
-       "exclude-cases": [],
-       "exclude-agent-cases": {}
-} 
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_echo.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_echo.erl
deleted file mode 100644 (file)
index d4a5f07..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_echo).
--behaviour(cowboy_websocket_handler).
--export([init/3]).
--export([websocket_init/3, websocket_handle/3,
-       websocket_info/3, websocket_terminate/3]).
-
-init(_Any, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_TransportName, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, undefined}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_echo_timer.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_echo_timer.erl
deleted file mode 100644 (file)
index 666a26d..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_echo_timer).
--behaviour(cowboy_websocket_handler).
--export([init/3]).
--export([websocket_init/3, websocket_handle/3,
-       websocket_info/3, websocket_terminate/3]).
-
-init(_Any, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_TransportName, Req, _Opts) ->
-       erlang:start_timer(1000, self(), <<"websocket_init">>),
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, undefined}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info({timeout, _Ref, Msg}, Req, State) ->
-       erlang:start_timer(1000, self(), <<"websocket_handle">>),
-       {reply, {text, Msg}, Req, State};
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_init_shutdown.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_init_shutdown.erl
deleted file mode 100644 (file)
index 2b1dd99..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_init_shutdown).
--behaviour(cowboy_websocket_handler).
--export([init/3]).
--export([websocket_init/3, websocket_handle/3,
-       websocket_info/3, websocket_terminate/3]).
-
-init(_Any, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_TransportName, Req, _Opts) ->
-       {ok, Req2} = cowboy_req:reply(403, Req),
-       {shutdown, Req2}.
-
-websocket_handle(_Frame, _Req, _State) ->
-       exit(badarg).
-
-websocket_info(_Info, _Req, _State) ->
-       exit(badarg).
-
-websocket_terminate(_Reason, _Req, _State) ->
-       exit(badarg).
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_send_many.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_send_many.erl
deleted file mode 100644 (file)
index 2ed4772..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_send_many).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
-init(_Any, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_TransportName, Req, Sequence) ->
-       Req2 = cowboy_req:compact(Req),
-       erlang:send_after(10, self(), send_many),
-       {ok, Req2, Sequence}.
-
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(send_many, Req, State = [{sequence, Sequence}]) ->
-       {reply, Sequence, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_timeout_cancel.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_timeout_cancel.erl
deleted file mode 100644 (file)
index 9c7b72b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_timeout_cancel).
--behaviour(cowboy_websocket_handler).
--export([init/3]).
--export([websocket_init/3, websocket_handle/3,
-       websocket_info/3, websocket_terminate/3]).
-
-init(_Any, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_TransportName, Req, _Opts) ->
-       erlang:start_timer(500, self(), should_not_cancel_timer),
-       {ok, Req, undefined, 1000}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       erlang:start_timer(500, self(), should_not_cancel_timer),
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_timeout_hibernate.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_timeout_hibernate.erl
deleted file mode 100644 (file)
index cc91e26..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_timeout_hibernate).
--behaviour(cowboy_websocket_handler).
--export([init/3]).
--export([websocket_init/3, websocket_handle/3,
-       websocket_info/3, websocket_terminate/3]).
-
-init(_Any, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_TransportName, Req, _Opts) ->
-       {ok, Req, undefined, 1000, hibernate}.
-
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State, hibernate}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State, hibernate}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_upgrade_with_opts.erl b/rabbitmq-server/deps/cowboy/test/ws_SUITE_data/ws_upgrade_with_opts.erl
deleted file mode 100644 (file)
index b4f82fa..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-%% Feel free to use, reuse and abuse the code in this file.
-
--module(ws_upgrade_with_opts).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
-init(_Any, Req, _Opts) ->
-       {upgrade, protocol, cowboy_websocket, Req, <<"success">>}.
-
-websocket_init(_TransportName, Req, Response) ->
-       Req2 = cowboy_req:compact(Req),
-       erlang:send_after(10, self(), send_response),
-       {ok, Req2, Response}.
-
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(send_response, Req, State = Response)
-               when is_binary(Response) ->
-       {reply, {text, Response}, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
diff --git a/rabbitmq-server/deps/cowlib/test/eunit_SUITE.erl b/rabbitmq-server/deps/cowlib/test/eunit_SUITE.erl
deleted file mode 100644 (file)
index dddfdd3..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-%% Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(eunit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
-
-%% ct.
--export([all/0]).
-
-%% Tests.
--export([eunit/1]).
-
-%% ct.
-
-all() ->
-       [eunit].
-
-eunit(_) ->
-       ok = eunit:test({application, cowlib}).
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_base64url_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_base64url_tests.erl
deleted file mode 100644 (file)
index 69f276a..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
--module(mochiweb_base64url_tests).
--include_lib("eunit/include/eunit.hrl").
-
-id(X) ->
-    ?assertEqual(
-       X,
-       mochiweb_base64url:decode(mochiweb_base64url:encode(X))),
-    ?assertEqual(
-       X,
-       mochiweb_base64url:decode(
-         binary_to_list(mochiweb_base64url:encode(binary_to_list(X))))).
-
-random_binary(Short,Long) ->
-    << <<(random:uniform(256) - 1)>>
-     || _ <- lists:seq(1, Short + random:uniform(1 + Long - Short) - 1) >>.
-
-empty_test() ->
-    id(<<>>).
-
-onechar_test() ->
-    [id(<<C>>) || C <- lists:seq(0,255)],
-    ok.
-
-nchar_test() ->
-    %% 1000 tests of 2-6 char strings
-    [id(B) || _ <- lists:seq(1,1000), B <- [random_binary(2, 6)]],
-    ok.
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_html_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_html_tests.erl
deleted file mode 100644 (file)
index 0310b28..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
--module(mochiweb_html_tests).
--include_lib("eunit/include/eunit.hrl").
-
-to_html_test() ->
-    ?assertEqual(
-       <<"<html><head><title>hey!</title></head><body><p class=\"foo\">what's up<br /></p><div>sucka</div>RAW!<!-- comment! --></body></html>">>,
-       iolist_to_binary(
-         mochiweb_html:to_html({html, [],
-                  [{<<"head">>, [],
-                    [{title, <<"hey!">>}]},
-                   {body, [],
-                    [{p, [{class, foo}], [<<"what's">>, <<" up">>, {br}]},
-                     {'div', <<"sucka">>},
-                     {'=', <<"RAW!">>},
-                     {comment, <<" comment! ">>}]}]}))),
-    ?assertEqual(
-       <<"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">">>,
-       iolist_to_binary(
-         mochiweb_html:to_html({doctype,
-                  [<<"html">>, <<"PUBLIC">>,
-                   <<"-//W3C//DTD XHTML 1.0 Transitional//EN">>,
-                   <<"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">>]}))),
-    ?assertEqual(
-       <<"<html><?xml:namespace prefix=\"o\" ns=\"urn:schemas-microsoft-com:office:office\"?></html>">>,
-       iolist_to_binary(
-         mochiweb_html:to_html({<<"html">>,[],
-                  [{pi, <<"xml:namespace">>,
-                    [{<<"prefix">>,<<"o">>},
-                     {<<"ns">>,<<"urn:schemas-microsoft-com:office:office">>}]}]}))),
-    ok.
-
-escape_test() ->
-    ?assertEqual(
-       <<"&amp;quot;\"word &gt;&lt;&lt;up!&amp;quot;">>,
-       mochiweb_html:escape(<<"&quot;\"word ><<up!&quot;">>)),
-    ?assertEqual(
-       <<"&amp;quot;\"word &gt;&lt;&lt;up!&amp;quot;">>,
-       mochiweb_html:escape("&quot;\"word ><<up!&quot;")),
-    ?assertEqual(
-       <<"&amp;quot;\"word &gt;&lt;&lt;up!&amp;quot;">>,
-       mochiweb_html:escape('&quot;\"word ><<up!&quot;')),
-    ok.
-
-escape_attr_test() ->
-    ?assertEqual(
-       <<"&amp;quot;&quot;word &gt;&lt;&lt;up!&amp;quot;">>,
-       mochiweb_html:escape_attr(<<"&quot;\"word ><<up!&quot;">>)),
-    ?assertEqual(
-       <<"&amp;quot;&quot;word &gt;&lt;&lt;up!&amp;quot;">>,
-       mochiweb_html:escape_attr("&quot;\"word ><<up!&quot;")),
-    ?assertEqual(
-       <<"&amp;quot;&quot;word &gt;&lt;&lt;up!&amp;quot;">>,
-       mochiweb_html:escape_attr('&quot;\"word ><<up!&quot;')),
-    ?assertEqual(
-       <<"12345">>,
-       mochiweb_html:escape_attr(12345)),
-    ?assertEqual(
-       <<"1.5">>,
-       mochiweb_html:escape_attr(1.5)),
-    ok.
-
-tokens_test() ->
-    ?assertEqual(
-       [{start_tag, <<"foo">>, [{<<"bar">>, <<"baz">>},
-                                {<<"wibble">>, <<"wibble">>},
-                                {<<"alice">>, <<"bob">>}], true}],
-       mochiweb_html:tokens(<<"<foo bar=baz wibble='wibble' alice=\"bob\"/>">>)),
-    ?assertEqual(
-       [{start_tag, <<"foo">>, [{<<"bar">>, <<"baz">>},
-                                {<<"wibble">>, <<"wibble">>},
-                                {<<"alice">>, <<"bob">>}], true}],
-       mochiweb_html:tokens(<<"<foo bar=baz wibble='wibble' alice=bob/>">>)),
-    ?assertEqual(
-       [{comment, <<"[if lt IE 7]>\n<style type=\"text/css\">\n.no_ie { display: none; }\n</style>\n<![endif]">>}],
-       mochiweb_html:tokens(<<"<!--[if lt IE 7]>\n<style type=\"text/css\">\n.no_ie { display: none; }\n</style>\n<![endif]-->">>)),
-    ?assertEqual(
-       [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false},
-        {data, <<" A= B <= C ">>, false},
-        {end_tag, <<"script">>}],
-       mochiweb_html:tokens(<<"<script type=\"text/javascript\"> A= B <= C </script>">>)),
-    ?assertEqual(
-       [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false},
-        {data, <<" A= B <= C ">>, false},
-        {end_tag, <<"script">>}],
-       mochiweb_html:tokens(<<"<script type =\"text/javascript\"> A= B <= C </script>">>)),
-    ?assertEqual(
-       [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false},
-        {data, <<" A= B <= C ">>, false},
-        {end_tag, <<"script">>}],
-       mochiweb_html:tokens(<<"<script type = \"text/javascript\"> A= B <= C </script>">>)),
-    ?assertEqual(
-       [{start_tag, <<"script">>, [{<<"type">>, <<"text/javascript">>}], false},
-        {data, <<" A= B <= C ">>, false},
-        {end_tag, <<"script">>}],
-       mochiweb_html:tokens(<<"<script type= \"text/javascript\"> A= B <= C </script>">>)),
-    ?assertEqual(
-       [{start_tag, <<"textarea">>, [], false},
-        {data, <<"<html></body>">>, false},
-        {end_tag, <<"textarea">>}],
-       mochiweb_html:tokens(<<"<textarea><html></body></textarea>">>)),
-    ?assertEqual(
-       [{start_tag, <<"textarea">>, [], false},
-        {data, <<"<html></body></textareaz>">>, false}],
-       mochiweb_html:tokens(<<"<textarea ><html></body></textareaz>">>)),
-    ?assertEqual(
-       [{pi, <<"xml:namespace">>,
-         [{<<"prefix">>,<<"o">>},
-          {<<"ns">>,<<"urn:schemas-microsoft-com:office:office">>}]}],
-       mochiweb_html:tokens(<<"<?xml:namespace prefix=\"o\" ns=\"urn:schemas-microsoft-com:office:office\"?>">>)),
-    ?assertEqual(
-       [{pi, <<"xml:namespace">>,
-         [{<<"prefix">>,<<"o">>},
-          {<<"ns">>,<<"urn:schemas-microsoft-com:office:office">>}]}],
-       mochiweb_html:tokens(<<"<?xml:namespace prefix=o ns=urn:schemas-microsoft-com:office:office \n?>">>)),
-    ?assertEqual(
-       [{pi, <<"xml:namespace">>,
-         [{<<"prefix">>,<<"o">>},
-          {<<"ns">>,<<"urn:schemas-microsoft-com:office:office">>}]}],
-       mochiweb_html:tokens(<<"<?xml:namespace prefix=o ns=urn:schemas-microsoft-com:office:office">>)),
-    ?assertEqual(
-       [{data, <<"<">>, false}],
-       mochiweb_html:tokens(<<"&lt;">>)),
-    ?assertEqual(
-       [{data, <<"not html ">>, false},
-        {data, <<"< at all">>, false}],
-       mochiweb_html:tokens(<<"not html < at all">>)),
-    ok.
-
-surrogate_test() ->
-    %% https://github.com/mochi/mochiweb/issues/164
-    ?assertEqual(
-       [{data,<<240,159,152,138>>,false}],
-       mochiweb_html:tokens(<<"&#55357;&#56842;">>)).
-
-parse_test() ->
-    D0 = <<"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">
-<html>
- <head>
-   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
-   <title>Foo</title>
-   <link rel=\"stylesheet\" type=\"text/css\" href=\"/static/rel/dojo/resources/dojo.css\" media=\"screen\">
-   <link rel=\"stylesheet\" type=\"text/css\" href=\"/static/foo.css\" media=\"screen\">
-   <!--[if lt IE 7]>
-   <style type=\"text/css\">
-     .no_ie { display: none; }
-   </style>
-   <![endif]-->
-   <link rel=\"icon\" href=\"/static/images/favicon.ico\" type=\"image/x-icon\">
-   <link rel=\"shortcut icon\" href=\"/static/images/favicon.ico\" type=\"image/x-icon\">
- </head>
- <body id=\"home\" class=\"tundra\"><![CDATA[&lt;<this<!-- is -->CDATA>&gt;]]></body>
-</html>">>,
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"head">>, [],
-          [{<<"meta">>,
-            [{<<"http-equiv">>,<<"Content-Type">>},
-             {<<"content">>,<<"text/html; charset=UTF-8">>}],
-            []},
-           {<<"title">>,[],[<<"Foo">>]},
-           {<<"link">>,
-            [{<<"rel">>,<<"stylesheet">>},
-             {<<"type">>,<<"text/css">>},
-             {<<"href">>,<<"/static/rel/dojo/resources/dojo.css">>},
-             {<<"media">>,<<"screen">>}],
-            []},
-           {<<"link">>,
-            [{<<"rel">>,<<"stylesheet">>},
-             {<<"type">>,<<"text/css">>},
-             {<<"href">>,<<"/static/foo.css">>},
-             {<<"media">>,<<"screen">>}],
-            []},
-           {comment,<<"[if lt IE 7]>\n   <style type=\"text/css\">\n     .no_ie { display: none; }\n   </style>\n   <![endif]">>},
-           {<<"link">>,
-            [{<<"rel">>,<<"icon">>},
-             {<<"href">>,<<"/static/images/favicon.ico">>},
-             {<<"type">>,<<"image/x-icon">>}],
-            []},
-           {<<"link">>,
-            [{<<"rel">>,<<"shortcut icon">>},
-             {<<"href">>,<<"/static/images/favicon.ico">>},
-             {<<"type">>,<<"image/x-icon">>}],
-            []}]},
-         {<<"body">>,
-          [{<<"id">>,<<"home">>},
-           {<<"class">>,<<"tundra">>}],
-          [<<"&lt;<this<!-- is -->CDATA>&gt;">>]}]},
-       mochiweb_html:parse(D0)),
-    ?assertEqual(
-       {<<"html">>,[],
-        [{pi, <<"xml:namespace">>,
-          [{<<"prefix">>,<<"o">>},
-           {<<"ns">>,<<"urn:schemas-microsoft-com:office:office">>}]}]},
-       mochiweb_html:parse(
-         <<"<html><?xml:namespace prefix=\"o\" ns=\"urn:schemas-microsoft-com:office:office\"?></html>">>)),
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"dd">>, [], [<<"foo">>]},
-         {<<"dt">>, [], [<<"bar">>]}]},
-       mochiweb_html:parse(<<"<html><dd>foo<dt>bar</html>">>)),
-    %% Singleton sadness
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"link">>, [], []},
-         <<"foo">>,
-         {<<"br">>, [], []},
-         <<"bar">>]},
-       mochiweb_html:parse(<<"<html><link>foo<br>bar</html>">>)),
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"link">>, [], [<<"foo">>,
-                           {<<"br">>, [], []},
-                           <<"bar">>]}]},
-       mochiweb_html:parse(<<"<html><link>foo<br>bar</link></html>">>)),
-    %% Case insensitive tags
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"head">>, [], [<<"foo">>,
-                           {<<"br">>, [], []},
-                           <<"BAR">>]},
-         {<<"body">>, [{<<"class">>, <<"">>}, {<<"bgcolor">>, <<"#Aa01fF">>}], []}
-        ]},
-       mochiweb_html:parse(<<"<html><Head>foo<bR>BAR</head><body Class=\"\" bgcolor=\"#Aa01fF\"></BODY></html>">>)),
-    ok.
-
-exhaustive_is_singleton_test() ->
-    T = mochiweb_cover:clause_lookup_table(mochiweb_html, is_singleton),
-    [?assertEqual(V, mochiweb_html:is_singleton(K)) || {K, V} <- T].
-
-tokenize_attributes_test() ->
-    ?assertEqual(
-       {<<"foo">>,
-        [{<<"bar">>, <<"b\"az">>},
-         {<<"wibble">>, <<"wibble">>},
-         {<<"taco", 16#c2, 16#a9>>, <<"bell">>},
-         {<<"quux">>, <<"quux">>}],
-        []},
-       mochiweb_html:parse(<<"<foo bar=\"b&quot;az\" wibble taco&copy;=bell quux">>)),
-    ok.
-
-tokens2_test() ->
-    D0 = <<"<channel><title>from __future__ import *</title><link>http://bob.pythonmac.org</link><description>Bob's Rants</description></channel>">>,
-    ?assertEqual(
-       [{start_tag,<<"channel">>,[],false},
-        {start_tag,<<"title">>,[],false},
-        {data,<<"from __future__ import *">>,false},
-        {end_tag,<<"title">>},
-        {start_tag,<<"link">>,[],true},
-        {data,<<"http://bob.pythonmac.org">>,false},
-        {end_tag,<<"link">>},
-        {start_tag,<<"description">>,[],false},
-        {data,<<"Bob's Rants">>,false},
-        {end_tag,<<"description">>},
-        {end_tag,<<"channel">>}],
-       mochiweb_html:tokens(D0)),
-    ok.
-
-to_tokens_test() ->
-    ?assertEqual(
-       [{start_tag, <<"p">>, [{class, 1}], false},
-        {end_tag, <<"p">>}],
-       mochiweb_html:to_tokens({p, [{class, 1}], []})),
-    ?assertEqual(
-       [{start_tag, <<"p">>, [], false},
-        {end_tag, <<"p">>}],
-       mochiweb_html:to_tokens({p})),
-    ?assertEqual(
-       [{'=', <<"data">>}],
-       mochiweb_html:to_tokens({'=', <<"data">>})),
-    ?assertEqual(
-       [{comment, <<"comment">>}],
-       mochiweb_html:to_tokens({comment, <<"comment">>})),
-    %% This is only allowed in sub-tags:
-    %% {p, [{"class", "foo"}]} as {p, [{"class", "foo"}], []}
-    %% On the outside it's always treated as follows:
-    %% {p, [], [{"class", "foo"}]} as {p, [], [{"class", "foo"}]}
-    ?assertEqual(
-       [{start_tag, <<"html">>, [], false},
-        {start_tag, <<"p">>, [{class, 1}], false},
-        {end_tag, <<"p">>},
-        {end_tag, <<"html">>}],
-       mochiweb_html:to_tokens({html, [{p, [{class, 1}]}]})),
-    ok.
-
-parse2_test() ->
-    D0 = <<"<channel><title>from __future__ import *</title><link>http://bob.pythonmac.org<br>foo</link><description>Bob's Rants</description></channel>">>,
-    ?assertEqual(
-       {<<"channel">>,[],
-        [{<<"title">>,[],[<<"from __future__ import *">>]},
-         {<<"link">>,[],[
-                         <<"http://bob.pythonmac.org">>,
-                         {<<"br">>,[],[]},
-                         <<"foo">>]},
-         {<<"description">>,[],[<<"Bob's Rants">>]}]},
-       mochiweb_html:parse(D0)),
-    ok.
-
-parse_tokens_test() ->
-    D0 = [{doctype,[<<"HTML">>,<<"PUBLIC">>,<<"-//W3C//DTD HTML 4.01 Transitional//EN">>]},
-          {data,<<"\n">>,true},
-          {start_tag,<<"html">>,[],false}],
-    ?assertEqual(
-       {<<"html">>, [], []},
-       mochiweb_html:parse_tokens(D0)),
-    D1 = D0 ++ [{end_tag, <<"html">>}],
-    ?assertEqual(
-       {<<"html">>, [], []},
-       mochiweb_html:parse_tokens(D1)),
-    D2 = D0 ++ [{start_tag, <<"body">>, [], false}],
-    ?assertEqual(
-       {<<"html">>, [], [{<<"body">>, [], []}]},
-       mochiweb_html:parse_tokens(D2)),
-    D3 = D0 ++ [{start_tag, <<"head">>, [], false},
-                {end_tag, <<"head">>},
-                {start_tag, <<"body">>, [], false}],
-    ?assertEqual(
-       {<<"html">>, [], [{<<"head">>, [], []}, {<<"body">>, [], []}]},
-       mochiweb_html:parse_tokens(D3)),
-    D4 = D3 ++ [{data,<<"\n">>,true},
-                {start_tag,<<"div">>,[{<<"class">>,<<"a">>}],false},
-                {start_tag,<<"a">>,[{<<"name">>,<<"#anchor">>}],false},
-                {end_tag,<<"a">>},
-                {end_tag,<<"div">>},
-                {start_tag,<<"div">>,[{<<"class">>,<<"b">>}],false},
-                {start_tag,<<"div">>,[{<<"class">>,<<"c">>}],false},
-                {end_tag,<<"div">>},
-                {end_tag,<<"div">>}],
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"head">>, [], []},
-         {<<"body">>, [],
-          [{<<"div">>, [{<<"class">>, <<"a">>}], [{<<"a">>, [{<<"name">>, <<"#anchor">>}], []}]},
-           {<<"div">>, [{<<"class">>, <<"b">>}], [{<<"div">>, [{<<"class">>, <<"c">>}], []}]}
-          ]}]},
-       mochiweb_html:parse_tokens(D4)),
-    D5 = [{start_tag,<<"html">>,[],false},
-          {data,<<"\n">>,true},
-          {data,<<"boo">>,false},
-          {data,<<"hoo">>,false},
-          {data,<<"\n">>,true},
-          {end_tag,<<"html">>}],
-    ?assertEqual(
-       {<<"html">>, [], [<<"\nboohoo\n">>]},
-       mochiweb_html:parse_tokens(D5)),
-    D6 = [{start_tag,<<"html">>,[],false},
-          {data,<<"\n">>,true},
-          {data,<<"\n">>,true},
-          {end_tag,<<"html">>}],
-    ?assertEqual(
-       {<<"html">>, [], []},
-       mochiweb_html:parse_tokens(D6)),
-    D7 = [{start_tag,<<"html">>,[],false},
-          {start_tag,<<"ul">>,[],false},
-          {start_tag,<<"li">>,[],false},
-          {data,<<"word">>,false},
-          {start_tag,<<"li">>,[],false},
-          {data,<<"up">>,false},
-          {end_tag,<<"li">>},
-          {start_tag,<<"li">>,[],false},
-          {data,<<"fdsa">>,false},
-          {start_tag,<<"br">>,[],true},
-          {data,<<"asdf">>,false},
-          {end_tag,<<"ul">>},
-          {end_tag,<<"html">>}],
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"ul">>, [],
-          [{<<"li">>, [], [<<"word">>]},
-           {<<"li">>, [], [<<"up">>]},
-           {<<"li">>, [], [<<"fdsa">>,{<<"br">>, [], []}, <<"asdf">>]}]}]},
-       mochiweb_html:parse_tokens(D7)),
-    ok.
-
-destack_test() ->
-    ?assertEqual(
-       {<<"a">>, [], []},
-       mochiweb_html:destack([{<<"a">>, [], []}])),
-    ?assertEqual(
-       {<<"a">>, [], [{<<"b">>, [], []}]},
-       mochiweb_html:destack([{<<"b">>, [], []}, {<<"a">>, [], []}])),
-    ?assertEqual(
-       {<<"a">>, [], [{<<"b">>, [], [{<<"c">>, [], []}]}]},
-       mochiweb_html:destack(
-         [{<<"c">>, [], []}, {<<"b">>, [], []}, {<<"a">>, [], []}])),
-    ?assertEqual(
-       [{<<"a">>, [], [{<<"b">>, [], [{<<"c">>, [], []}]}]}],
-       mochiweb_html:destack(
-         <<"b">>,
-         [{<<"c">>, [], []}, {<<"b">>, [], []}, {<<"a">>, [], []}])),
-    ?assertEqual(
-       [{<<"b">>, [], [{<<"c">>, [], []}]}, {<<"a">>, [], []}],
-       mochiweb_html:destack(
-         <<"c">>,
-         [{<<"c">>, [], []}, {<<"b">>, [], []},{<<"a">>, [], []}])),
-    ok.
-
-doctype_test() ->
-    ?assertEqual(
-       {<<"html">>,[],[{<<"head">>,[],[]}]},
-       mochiweb_html:parse("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"
-                           "<html><head></head></body></html>")),
-    %% http://code.google.com/p/mochiweb/issues/detail?id=52
-    ?assertEqual(
-       {<<"html">>,[],[{<<"head">>,[],[]}]},
-       mochiweb_html:parse("<html>"
-                           "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"
-                           "<head></head></body></html>")),
-    %% http://github.com/mochi/mochiweb/pull/13
-    ?assertEqual(
-       {<<"html">>,[],[{<<"head">>,[],[]}]},
-       mochiweb_html:parse("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"/>"
-                           "<html>"
-                           "<head></head></body></html>")),
-    ok.
-
-dumb_br_test() ->
-    %% http://code.google.com/p/mochiweb/issues/detail?id=71
-    ?assertEqual(
-       {<<"div">>,[],[{<<"br">>, [], []}, {<<"br">>, [], []}, <<"z">>]},
-       mochiweb_html:parse("<div><br/><br/>z</br/></br/></div>")),
-    ?assertEqual(
-       {<<"div">>,[],[{<<"br">>, [], []}, {<<"br">>, [], []}, <<"z">>]},
-       mochiweb_html:parse("<div><br><br>z</br/></br/></div>")),
-    ?assertEqual(
-       {<<"div">>,[],[{<<"br">>, [], []}, {<<"br">>, [], []}, <<"z">>, {<<"br">>, [], []}, {<<"br">>, [], []}]},
-       mochiweb_html:parse("<div><br><br>z<br/><br/></div>")),
-    ?assertEqual(
-       {<<"div">>,[],[{<<"br">>, [], []}, {<<"br">>, [], []}, <<"z">>]},
-       mochiweb_html:parse("<div><br><br>z</br></br></div>")).
-
-
-php_test() ->
-    %% http://code.google.com/p/mochiweb/issues/detail?id=71
-    ?assertEqual(
-       [{pi, <<"php\n">>}],
-       mochiweb_html:tokens(
-         "<?php\n?>")),
-    ?assertEqual(
-       {<<"div">>, [], [{pi, <<"php\n">>}]},
-       mochiweb_html:parse(
-         "<div><?php\n?></div>")),
-    ok.
-
-parse_unquoted_attr_test() ->
-    D0 = <<"<html><img src=/images/icon.png/></html>">>,
-    ?assertEqual(
-        {<<"html">>,[],[
-            { <<"img">>, [ { <<"src">>, <<"/images/icon.png">> } ], [] }
-        ]},
-        mochiweb_html:parse(D0)),
-
-    D1 = <<"<html><img src=/images/icon.png></img></html>">>,
-        ?assertEqual(
-            {<<"html">>,[],[
-                { <<"img">>, [ { <<"src">>, <<"/images/icon.png">> } ], [] }
-            ]},
-            mochiweb_html:parse(D1)),
-
-    D2 = <<"<html><img src=/images/icon&gt;.png width=100></img></html>">>,
-        ?assertEqual(
-            {<<"html">>,[],[
-                { <<"img">>, [ { <<"src">>, <<"/images/icon>.png">> }, { <<"width">>, <<"100">> } ], [] }
-            ]},
-            mochiweb_html:parse(D2)),
-    ok.
-
-parse_quoted_attr_test() ->
-    D0 = <<"<html><img src='/images/icon.png'></html>">>,
-    ?assertEqual(
-        {<<"html">>,[],[
-            { <<"img">>, [ { <<"src">>, <<"/images/icon.png">> } ], [] }
-        ]},
-        mochiweb_html:parse(D0)),
-
-    D1 = <<"<html><img src=\"/images/icon.png'></html>">>,
-    ?assertEqual(
-        {<<"html">>,[],[
-            { <<"img">>, [ { <<"src">>, <<"/images/icon.png'></html>">> } ], [] }
-        ]},
-        mochiweb_html:parse(D1)),
-
-    D2 = <<"<html><img src=\"/images/icon&gt;.png\"></html>">>,
-    ?assertEqual(
-        {<<"html">>,[],[
-            { <<"img">>, [ { <<"src">>, <<"/images/icon>.png">> } ], [] }
-        ]},
-        mochiweb_html:parse(D2)),
-
-    %% Quoted attributes can contain whitespace and newlines
-    D3 = <<"<html><a href=\"#\" onclick=\"javascript: test(1,\ntrue);\"></html>">>,
-    ?assertEqual(
-        {<<"html">>,[],[
-            { <<"a">>, [ { <<"href">>, <<"#">> }, {<<"onclick">>, <<"javascript: test(1,\ntrue);">>} ], [] }
-        ]},
-        mochiweb_html:parse(D3)),
-    ok.
-
-parse_missing_attr_name_test() ->
-    D0 = <<"<html =black></html>">>,
-    ?assertEqual(
-        {<<"html">>, [ { <<"=">>, <<"=">> }, { <<"black">>, <<"black">> } ], [] },
-       mochiweb_html:parse(D0)),
-    ok.
-
-parse_broken_pi_test() ->
-        D0 = <<"<html><?xml:namespace prefix = o ns = \"urn:schemas-microsoft-com:office:office\" /></html>">>,
-        ?assertEqual(
-                {<<"html">>, [], [
-                        { pi, <<"xml:namespace">>, [ { <<"prefix">>, <<"o">> },
-                                                     { <<"ns">>, <<"urn:schemas-microsoft-com:office:office">> } ] }
-                ] },
-                mochiweb_html:parse(D0)),
-        ok.
-
-parse_funny_singletons_test() ->
-        D0 = <<"<html><input><input>x</input></input></html>">>,
-        ?assertEqual(
-                {<<"html">>, [], [
-                        { <<"input">>, [], [] },
-                        { <<"input">>, [], [ <<"x">> ] }
-                ] },
-                mochiweb_html:parse(D0)),
-        ok.
-
-to_html_singleton_test() ->
-    D0 = <<"<link />">>,
-    T0 = {<<"link">>,[],[]},
-    ?assertEqual(D0, iolist_to_binary(mochiweb_html:to_html(T0))),
-
-    D1 = <<"<head><link /></head>">>,
-    T1 = {<<"head">>,[],[{<<"link">>,[],[]}]},
-    ?assertEqual(D1, iolist_to_binary(mochiweb_html:to_html(T1))),
-
-    D2 = <<"<head><link /><link /></head>">>,
-    T2 = {<<"head">>,[],[{<<"link">>,[],[]}, {<<"link">>,[],[]}]},
-    ?assertEqual(D2, iolist_to_binary(mochiweb_html:to_html(T2))),
-
-    %% Make sure singletons are converted to singletons.
-    D3 = <<"<head><link /></head>">>,
-    T3 = {<<"head">>,[],[{<<"link">>,[],[<<"funny">>]}]},
-    ?assertEqual(D3, iolist_to_binary(mochiweb_html:to_html(T3))),
-
-    D4 = <<"<link />">>,
-    T4 = {<<"link">>,[],[<<"funny">>]},
-    ?assertEqual(D4, iolist_to_binary(mochiweb_html:to_html(T4))),
-
-    ok.
-
-parse_amp_test_() ->
-    [?_assertEqual(
-       {<<"html">>,[],
-        [{<<"body">>,[{<<"onload">>,<<"javascript:A('1&2')">>}],[]}]},
-       mochiweb_html:parse("<html><body onload=\"javascript:A('1&2')\"></body></html>")),
-     ?_assertEqual(
-        {<<"html">>,[],
-         [{<<"body">>,[{<<"onload">>,<<"javascript:A('1& 2')">>}],[]}]},
-        mochiweb_html:parse("<html><body onload=\"javascript:A('1& 2')\"></body></html>")),
-     ?_assertEqual(
-        {<<"html">>,[],
-         [{<<"body">>,[],[<<"& ">>]}]},
-        mochiweb_html:parse("<html><body>& </body></html>")),
-     ?_assertEqual(
-        {<<"html">>,[],
-         [{<<"body">>,[],[<<"&">>]}]},
-        mochiweb_html:parse("<html><body>&</body></html>")),
-     ?_assertEqual(
-        {<<"html">>,[],
-         [{<<"body">>,[],[<<"&;">>]}]},
-        mochiweb_html:parse("<html><body>&;</body></html>")),
-     ?_assertEqual(
-        {<<"html">>,[],
-         [{<<"body">>,[],[<<"&MISSING;">>]}]},
-        mochiweb_html:parse("<html><body>&MISSING;</body></html>"))].
-
-parse_unescaped_lt_test() ->
-    D1 = <<"<div> < < <a href=\"/\">Back</a></div>">>,
-    ?assertEqual(
-        {<<"div">>, [], [<<" < < ">>, {<<"a">>, [{<<"href">>, <<"/">>}],
-                                       [<<"Back">>]}]},
-        mochiweb_html:parse(D1)),
-
-    D2 = <<"<div> << <a href=\"/\">Back</a></div>">>,
-    ?assertEqual(
-        {<<"div">>, [], [<<" << ">>, {<<"a">>, [{<<"href">>, <<"/">>}],
-                                      [<<"Back">>]}]},
-    mochiweb_html:parse(D2)).
-
-html5_doctype_test() ->
-    ?assertEqual(
-       [{doctype,[<<"html">>]},
-        {start_tag,<<"head">>,[],false},
-        {end_tag,<<"head">>},
-        {start_tag,<<"body">>,[],false},
-        {end_tag,<<"body">>}],
-       mochiweb_html:tokens("<!doctype html><head></head><body></body>")).
-
-implicit_html_test() ->
-    %% https://github.com/mochi/mochiweb/issues/110
-    ?assertEqual(
-       {<<"html">>, [],
-        [{<<"head">>, [], []},
-         {<<"body">>, [], []}]},
-       mochiweb_html:parse("<!doctype html><head></head><body></body>")).
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_http_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_http_tests.erl
deleted file mode 100644 (file)
index 0003451..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
--module(mochiweb_http_tests).
--include_lib("eunit/include/eunit.hrl").
-
--ifdef(gen_tcp_r15b_workaround).
--define(SHOULD_HAVE_BUG, true).
--else.
--define(SHOULD_HAVE_BUG, false).
--endif.
-
-has_acceptor_bug_test_() ->
-    {setup,
-     fun start_server/0,
-     fun mochiweb_http:stop/1,
-     fun has_acceptor_bug_tests/1}.
-
-start_server() ->
-    application:start(inets),
-    {ok, Pid} = mochiweb_http:start_link([{port, 0},
-                                          {loop, fun responder/1}]),
-    Pid.
-
-has_acceptor_bug_tests(Server) ->
-    Port = mochiweb_socket_server:get(Server, port),
-    [{"1000 should be fine even with the bug",
-      ?_assertEqual(false, has_bug(Port, 1000))},
-     {"10000 should trigger the bug if present",
-      ?_assertEqual(?SHOULD_HAVE_BUG, has_bug(Port, 10000))}].
-
-responder(Req) ->
-    Req:respond({200,
-                 [{"Content-Type", "text/html"}],
-                 ["<html><body>Hello</body></html>"]}).
-
-has_bug(Port, Len) ->
-  case
-    httpc:request(get, {"http://127.0.0.1:" ++ integer_to_list(Port) ++ "/",
-                        [{"X-Random", lists:duplicate(Len, $a)}]}, [], [])
-  of
-      {error, socket_closed_remotely} ->
-          true;
-      {ok, {{"HTTP/1.1", 200, "OK"}, _, "<html><body>Hello</body></html>"}} ->
-          false;
-      {ok, {{"HTTP/1.1", 400, "Bad Request"}, _, []}} ->
-          false
-  end.
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_request_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_request_tests.erl
deleted file mode 100644 (file)
index b40c867..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
--module(mochiweb_request_tests).
-
--ifdef(TEST).
--include_lib("eunit/include/eunit.hrl").
-
-accepts_content_type_test() ->
-    Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "multipart/related"}])),
-    ?assertEqual(true, Req1:accepts_content_type("multipart/related")),
-    ?assertEqual(true, Req1:accepts_content_type(<<"multipart/related">>)),
-
-    Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html"}])),
-    ?assertEqual(false, Req2:accepts_content_type("multipart/related")),
-
-    Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html, multipart/*"}])),
-    ?assertEqual(true, Req3:accepts_content_type("multipart/related")),
-
-    Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html, multipart/*; q=0.0"}])),
-    ?assertEqual(false, Req4:accepts_content_type("multipart/related")),
-
-    Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html, multipart/*; q=0"}])),
-    ?assertEqual(false, Req5:accepts_content_type("multipart/related")),
-
-    Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html, */*; q=0.0"}])),
-    ?assertEqual(false, Req6:accepts_content_type("multipart/related")),
-
-    Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "multipart/*; q=0.0, */*"}])),
-    ?assertEqual(false, Req7:accepts_content_type("multipart/related")),
-
-    Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "*/*; q=0.0, multipart/*"}])),
-    ?assertEqual(true, Req8:accepts_content_type("multipart/related")),
-
-    Req9 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "*/*; q=0.0, multipart/related"}])),
-    ?assertEqual(true, Req9:accepts_content_type("multipart/related")),
-
-    Req10 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html; level=1"}])),
-    ?assertEqual(true, Req10:accepts_content_type("text/html;level=1")),
-
-    Req11 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html; level=1, text/html"}])),
-    ?assertEqual(true, Req11:accepts_content_type("text/html")),
-
-    Req12 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html; level=1; q=0.0, text/html"}])),
-    ?assertEqual(false, Req12:accepts_content_type("text/html;level=1")),
-
-    Req13 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html; level=1; q=0.0, text/html"}])),
-    ?assertEqual(false, Req13:accepts_content_type("text/html; level=1")),
-
-    Req14 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html;level=1;q=0.1, text/html"}])),
-    ?assertEqual(true, Req14:accepts_content_type("text/html; level=1")).
-
-accepted_encodings_test() ->
-    Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-                                mochiweb_headers:make([])),
-    ?assertEqual(["identity"],
-                 Req1:accepted_encodings(["gzip", "identity"])),
-
-    Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "gzip, deflate"}])),
-    ?assertEqual(["gzip", "identity"],
-                 Req2:accepted_encodings(["gzip", "identity"])),
-
-    Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "gzip;q=0.5, deflate"}])),
-    ?assertEqual(["deflate", "gzip", "identity"],
-                 Req3:accepted_encodings(["gzip", "deflate", "identity"])),
-
-    Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "identity, *;q=0"}])),
-    ?assertEqual(["identity"],
-                 Req4:accepted_encodings(["gzip", "deflate", "identity"])),
-
-    Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "gzip; q=0.1, *;q=0"}])),
-    ?assertEqual(["gzip"],
-                 Req5:accepted_encodings(["gzip", "deflate", "identity"])),
-
-    Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "gzip; q=, *;q=0"}])),
-    ?assertEqual(bad_accept_encoding_value,
-                 Req6:accepted_encodings(["gzip", "deflate", "identity"])),
-
-    Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "gzip;q=2.0, *;q=0"}])),
-    ?assertEqual(bad_accept_encoding_value,
-                 Req7:accepted_encodings(["gzip", "identity"])),
-
-    Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept-Encoding", "deflate, *;q=0.0"}])),
-    ?assertEqual([],
-                 Req8:accepted_encodings(["gzip", "identity"])).
-
-accepted_content_types_test() ->
-    Req1 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html"}])),
-    ?assertEqual(["text/html"],
-        Req1:accepted_content_types(["text/html", "application/json"])),
-
-    Req2 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html, */*;q=0"}])),
-    ?assertEqual(["text/html"],
-        Req2:accepted_content_types(["text/html", "application/json"])),
-
-    Req3 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/*, */*;q=0"}])),
-    ?assertEqual(["text/html"],
-        Req3:accepted_content_types(["text/html", "application/json"])),
-
-    Req4 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/*;q=0.8, */*;q=0.5"}])),
-    ?assertEqual(["text/html", "application/json"],
-        Req4:accepted_content_types(["application/json", "text/html"])),
-
-    Req5 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/*;q=0.8, */*;q=0.5"}])),
-    ?assertEqual(["text/html", "application/json"],
-        Req5:accepted_content_types(["text/html", "application/json"])),
-
-    Req6 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/*;q=0.5, */*;q=0.5"}])),
-    ?assertEqual(["application/json", "text/html"],
-        Req6:accepted_content_types(["application/json", "text/html"])),
-
-    Req7 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make(
-            [{"Accept", "text/html;q=0.5, application/json;q=0.5"}])),
-    ?assertEqual(["application/json", "text/html"],
-        Req7:accepted_content_types(["application/json", "text/html"])),
-
-    Req8 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/html"}])),
-    ?assertEqual([],
-        Req8:accepted_content_types(["application/json"])),
-
-    Req9 = mochiweb_request:new(nil, 'GET', "/foo", {1, 1},
-        mochiweb_headers:make([{"Accept", "text/*;q=0.9, text/html;q=0.5, */*;q=0.7"}])),
-    ?assertEqual(["application/json", "text/html"],
-        Req9:accepted_content_types(["text/html", "application/json"])).
-
-should_close_test() ->
-    F = fun (V, H) ->
-                (mochiweb_request:new(
-                   nil, 'GET', "/", V,
-                   mochiweb_headers:make(H)
-                  )):should_close()
-        end,
-    ?assertEqual(
-       true,
-       F({1, 1}, [{"Connection", "close"}])),
-    ?assertEqual(
-       true,
-       F({1, 0}, [{"Connection", "close"}])),
-    ?assertEqual(
-       true,
-       F({1, 1}, [{"Connection", "ClOSe"}])),
-    ?assertEqual(
-       false,
-       F({1, 1}, [{"Connection", "closer"}])),
-    ?assertEqual(
-       false,
-       F({1, 1}, [])),
-    ?assertEqual(
-       true,
-       F({1, 0}, [])),
-    ?assertEqual(
-       false,
-       F({1, 0}, [{"Connection", "Keep-Alive"}])),
-    ok.
-
--endif.
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_socket_server_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_socket_server_tests.erl
deleted file mode 100644 (file)
index c64f5b7..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
--module(mochiweb_socket_server_tests).
-
--ifdef(TEST).
--include_lib("eunit/include/eunit.hrl").
-
-socket_server(Opts, ServerFun) ->
-    ServerOpts = [{ip, "127.0.0.1"}, {port, 0}, {backlog, 5}, {loop, ServerFun}],
-    {ok, Server} = mochiweb_socket_server:start(ServerOpts ++ Opts),
-    Port = mochiweb_socket_server:get(Server, port),
-    {Server, Port}.
-
-echo_loop(Socket) ->
-    ok = mochiweb_socket:setopts(Socket, [{active, once}]),
-    receive
-        {_Protocol, _, Data} ->
-            gen_tcp:send(Socket, Data),
-            echo_loop(Socket);
-        {tcp_closed, Socket} ->
-            ok
-    end.
-
-start_client_conns(Port, NumClients, ClientFun, ClientArgs, Tester) ->
-    Opts = [binary, {active, false}, {packet, 1}],
-    lists:foreach(fun (_N) ->
-                          case gen_tcp:connect("127.0.0.1", Port, Opts) of
-                              {ok, Socket} ->
-                                  spawn_link(fun() -> ClientFun(Socket, ClientArgs) end);
-                              {error, E} ->
-                                  Tester ! {client_conn_error, E}
-                          end
-                  end, lists:seq(1, NumClients)).
-
-client_fun(_Socket, []) -> ok;
-client_fun(Socket, [{close_sock} | Cmds]) ->
-    mochiweb_socket:close(Socket),
-    client_fun(Socket, Cmds);
-client_fun(Socket, [{send_pid, To} | Cmds]) ->
-    To ! {client, self()},
-    client_fun(Socket, Cmds);
-client_fun(Socket, [{send, Data, Tester} | Cmds]) ->
-    case gen_tcp:send(Socket, Data) of
-        ok -> ok;
-        {error, E} -> Tester ! {client_send_error, self(), E}
-    end,
-    client_fun(Socket, Cmds);
-client_fun(Socket, [{recv, Length, Timeout, Tester} | Cmds]) ->
-    case gen_tcp:recv(Socket, Length, Timeout) of
-        {ok, _} -> ok;
-        {error, E} -> Tester ! {client_recv_error, self(), E}
-    end,
-    client_fun(Socket, Cmds);
-client_fun(Socket, [{wait_msg, Msg} | Cmds]) ->
-    receive
-        M when M =:= Msg -> ok
-    end,
-    client_fun(Socket, Cmds);
-client_fun(Socket, [{send_msg, Msg, To} | Cmds]) ->
-    To ! {Msg, self()},
-    client_fun(Socket, Cmds).
-
-test_basic_accept(Max, PoolSize, NumClients, ReportTo) ->
-    Tester = self(),
-
-    ServerOpts = [{max, Max}, {acceptor_pool_size, PoolSize}],
-    ServerLoop =
-        fun (Socket, _Opts) ->
-                Tester ! {server_accepted, self()},
-                mochiweb_socket:setopts(Socket, [{packet, 1}]),
-                echo_loop(Socket)
-        end,
-    {Server, Port} = socket_server(ServerOpts, ServerLoop),
-
-    Data = <<"data">>,
-    Timeout = 2000,
-    ClientCmds = [{send_pid, Tester}, {wait_msg, go},
-                  {send, Data, Tester}, {recv, size(Data), Timeout, Tester},
-                  {close_sock}, {send_msg, done, Tester}],
-    start_client_conns(Port, NumClients, fun client_fun/2, ClientCmds, Tester),
-
-    EventCount = min(NumClients, max(Max, PoolSize)),
-
-    ConnectLoop =
-        fun (Loop, Connected, Accepted, Errors) ->
-                case (length(Accepted) + Errors >= EventCount
-                        andalso length(Connected) + Errors >= NumClients) of
-                    true -> {Connected, Accepted};
-                    false ->
-                        receive
-                            {server_accepted, ServerPid} ->
-                                Loop(Loop, Connected, [ServerPid | Accepted], Errors);
-                            {client, ClientPid} ->
-                                Loop(Loop, [ClientPid | Connected], Accepted, Errors);
-                            {client_conn_error, _E} ->
-                                Loop(Loop, Connected, Accepted, Errors + 1)
-                        end
-                end
-        end,
-    {Connected, Accepted} = ConnectLoop(ConnectLoop, [], [], 0),
-
-    ActiveAfterConnect = mochiweb_socket_server:get(Server, active_sockets),
-    WaitingAfterConnect = mochiweb_socket_server:get(Server, waiting_acceptors),
-
-    lists:foreach(fun(Pid) -> Pid ! go end, Connected),
-    WaitLoop =
-        fun (Loop, Done) ->
-                case (length(Done) >= length(Connected)) of
-                    true ->
-                        ok;
-                    false ->
-                        receive
-                            {done, From} ->
-                                Loop(Loop, [From | Done])
-                        end
-                end
-        end,
-    ok = WaitLoop(WaitLoop, []),
-
-    mochiweb_socket_server:stop(Server),
-
-    ReportTo ! {result, {length(Accepted),
-                         ActiveAfterConnect, WaitingAfterConnect}}.
-
-normal_acceptor_test_fun() ->
-    %        {Max, PoolSize, NumClients,
-    %         {ExpectedAccepts,
-    %          ExpectedActiveAfterConnect, ExpectedWaitingAfterConnect}
-    Tests = [{3, 1, 1,   {1,   1, 1}},
-             {3, 1, 2,   {2,   2, 1}},
-             {3, 1, 3,   {3,   3, 0}},
-             {3, 3, 3,   {3,   3, 0}},
-             {1, 3, 3,   {3,   3, 0}}, % Max is overridden to PoolSize
-             {3, 2, 6,  {3,   3, 0}}
-            ],
-    [fun () ->
-             Self = self(),
-             spawn(fun () ->
-                           test_basic_accept(Max, PoolSize, NumClients, Self)
-                   end),
-             Result = receive {result, R} -> R end,
-             ?assertEqual(Expected, Result)
-     end || {Max, PoolSize, NumClients, Expected} <- Tests].
-
--define(LARGE_TIMEOUT, 40).
-
-normal_acceptor_test_() ->
-    Tests = normal_acceptor_test_fun(),
-    {timeout, ?LARGE_TIMEOUT, Tests}.
-
--endif.
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_test_util.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_test_util.erl
deleted file mode 100644 (file)
index a0bf11a..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
--module(mochiweb_test_util).
--export([with_server/3, client_request/4, sock_fun/2,
-         read_server_headers/1, drain_reply/3]).
--include("mochiweb_test_util.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-ssl_cert_opts() ->
-    EbinDir = filename:dirname(code:which(?MODULE)),
-    CertDir = filename:join([EbinDir, "..", "support", "test-materials"]),
-    CertFile = filename:join(CertDir, "test_ssl_cert.pem"),
-    KeyFile = filename:join(CertDir, "test_ssl_key.pem"),
-    [{certfile, CertFile}, {keyfile, KeyFile}].
-
-with_server(Transport, ServerFun, ClientFun) ->
-    ServerOpts0 = [{ip, "127.0.0.1"}, {port, 0}, {loop, ServerFun}],
-    ServerOpts = case Transport of
-        plain ->
-            ServerOpts0;
-        ssl ->
-            ServerOpts0 ++ [{ssl, true}, {ssl_opts, ssl_cert_opts()}]
-    end,
-    {ok, Server} = mochiweb_http:start_link(ServerOpts),
-    Port = mochiweb_socket_server:get(Server, port),
-    Res = (catch ClientFun(Transport, Port)),
-    mochiweb_http:stop(Server),
-    Res.
-
-sock_fun(Transport, Port) ->
-    Opts = [binary, {active, false}, {packet, http}],
-    case Transport of
-        plain ->
-            {ok, Socket} = gen_tcp:connect("127.0.0.1", Port, Opts),
-            fun (recv) ->
-                    gen_tcp:recv(Socket, 0);
-                ({recv, Length}) ->
-                    gen_tcp:recv(Socket, Length);
-                ({send, Data}) ->
-                    gen_tcp:send(Socket, Data);
-                ({setopts, L}) ->
-                    inet:setopts(Socket, L);
-                (get) ->
-                    Socket
-            end;
-        ssl ->
-            {ok, Socket} = ssl:connect("127.0.0.1", Port, [{ssl_imp, new} | Opts]),
-            fun (recv) ->
-                    ssl:recv(Socket, 0);
-                ({recv, Length}) ->
-                    ssl:recv(Socket, Length);
-                ({send, Data}) ->
-                    ssl:send(Socket, Data);
-                ({setopts, L}) ->
-                    ssl:setopts(Socket, L);
-                (get) ->
-                    {ssl, Socket}
-            end
-    end.
-
-client_request(Transport, Port, Method, TestReqs) ->
-    client_request(sock_fun(Transport, Port), Method, TestReqs).
-
-client_request(SockFun, _Method, []) ->
-    {the_end, {error, closed}} = {the_end, SockFun(recv)},
-    ok;
-client_request(SockFun, Method,
-               [#treq{path=Path, body=Body, xreply=ExReply, xheaders=ExHeaders} | Rest]) ->
-    Request = [atom_to_list(Method), " ", Path, " HTTP/1.1\r\n",
-               client_headers(Body, Rest =:= []),
-               "\r\n",
-               Body],
-    ok = SockFun({setopts, [{packet, http}]}),
-    ok = SockFun({send, Request}),
-    case Method of
-        'GET' ->
-            {ok, {http_response, {1,1}, 200, "OK"}} = SockFun(recv);
-        'POST' ->
-            {ok, {http_response, {1,1}, 201, "Created"}} = SockFun(recv);
-        'CONNECT' ->
-            {ok, {http_response, {1,1}, 200, "OK"}} = SockFun(recv)
-    end,
-    Headers = read_server_headers(SockFun),
-    ?assertMatch("MochiWeb" ++ _, mochiweb_headers:get_value("Server", Headers)),
-    ?assert(mochiweb_headers:get_value("Date", Headers) =/= undefined),
-    ?assert(mochiweb_headers:get_value("Content-Type", Headers) =/= undefined),
-    ContentLength = list_to_integer(mochiweb_headers:get_value("Content-Length", Headers)),
-    EHeaders = mochiweb_headers:make(ExHeaders),
-    lists:foreach(
-      fun (K) ->
-              ?assertEqual(mochiweb_headers:get_value(K, EHeaders),
-                           mochiweb_headers:get_value(K, Headers))
-      end,
-      %% Assumes implementation details of the headers
-      gb_trees:keys(EHeaders)),
-    {payload, ExReply} = {payload, drain_reply(SockFun, ContentLength, <<>>)},
-    client_request(SockFun, Method, Rest).
-
-read_server_headers(SockFun) ->
-    ok = SockFun({setopts, [{packet, httph}]}),
-    Headers = read_server_headers(SockFun, mochiweb_headers:empty()),
-    ok = SockFun({setopts, [{packet, raw}]}),
-    Headers.
-
-read_server_headers(SockFun, Headers) ->
-    case SockFun(recv) of
-        {ok, http_eoh} ->
-            Headers;
-        {ok, {http_header, _, Header, _, Value}} ->
-            read_server_headers(
-              SockFun,
-              mochiweb_headers:insert(Header, Value, Headers))
-    end.
-
-client_headers(Body, IsLastRequest) ->
-    ["Host: localhost\r\n",
-     case Body of
-        <<>> ->
-            "";
-        _ ->
-            ["Content-Type: application/octet-stream\r\n",
-             "Content-Length: ", integer_to_list(byte_size(Body)), "\r\n"]
-     end,
-     case IsLastRequest of
-         true ->
-             "Connection: close\r\n";
-         false ->
-             ""
-     end].
-
-drain_reply(_SockFun, 0, Acc) ->
-    Acc;
-drain_reply(SockFun, Length, Acc) ->
-    Sz = erlang:min(Length, 1024),
-    {ok, B} = SockFun({recv, Sz}),
-    drain_reply(SockFun, Length - Sz, <<Acc/bytes, B/bytes>>).
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_test_util.hrl b/rabbitmq-server/deps/mochiweb/test/mochiweb_test_util.hrl
deleted file mode 100644 (file)
index 503be98..0000000
+++ /dev/null
@@ -1 +0,0 @@
--record(treq, {path, body= <<>>, xreply= <<>>, xheaders= []}).
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_tests.erl
deleted file mode 100644 (file)
index 0b558ac..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
--module(mochiweb_tests).
--include_lib("eunit/include/eunit.hrl").
--include("mochiweb_test_util.hrl").
-
-with_server(Transport, ServerFun, ClientFun) ->
-    mochiweb_test_util:with_server(Transport, ServerFun, ClientFun).
-
-request_test() ->
-    R = mochiweb_request:new(z, z, "/foo/bar/baz%20wibble+quux?qs=2", z, []),
-    "/foo/bar/baz wibble quux" = R:get(path),
-    ok.
-
--define(LARGE_TIMEOUT, 60).
-
-single_http_GET_test() ->
-    do_GET(plain, 1).
-
-single_https_GET_test() ->
-    do_GET(ssl, 1).
-
-multiple_http_GET_test() ->
-    do_GET(plain, 3).
-
-multiple_https_GET_test() ->
-    do_GET(ssl, 3).
-
-hundred_http_GET_test_() -> % note the underscore
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_GET(plain,100)) end}.
-
-hundred_https_GET_test_() -> % note the underscore
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_GET(ssl,100)) end}.
-
-single_128_http_POST_test() ->
-    do_POST(plain, 128, 1).
-
-single_128_https_POST_test() ->
-    do_POST(ssl, 128, 1).
-
-single_2k_http_POST_test() ->
-    do_POST(plain, 2048, 1).
-
-single_2k_https_POST_test() ->
-    do_POST(ssl, 2048, 1).
-
-single_100k_http_POST_test_() -> % note the underscore
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_POST(plain, 102400, 1)) end}.
-
-single_100k_https_POST_test_() -> % note the underscore
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_POST(ssl, 102400, 1)) end}.
-
-multiple_100k_http_POST_test() ->
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_POST(plain, 102400, 3)) end}.
-
-multiple_100K_https_POST_test() ->
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_POST(ssl, 102400, 3)) end}.
-
-hundred_128_http_POST_test_() -> % note the underscore
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_POST(plain, 128, 100)) end}.
-
-hundred_128_https_POST_test_() -> % note the underscore
-    {timeout, ?LARGE_TIMEOUT,
-     fun() -> ?assertEqual(ok, do_POST(ssl, 128, 100)) end}.
-
-single_GET_scheme_test_() ->
-    [{"ssl", ?_assertEqual(ok, do_GET("derp", ssl, 1))},
-     {"plain", ?_assertEqual(ok, do_GET("derp", plain, 1))}].
-
-single_GET_absoluteURI_test_() ->
-    Uri = "https://example.com:123/x/",
-    ServerFun = fun (Req) ->
-                        Req:ok({"text/plain", Req:get(path)})
-                end,
-    %% Note that all the scheme/host/port information is discarded from path
-    ClientFun = new_client_fun('GET', [#treq{path = Uri, xreply = <<"/x/">>}]),
-    [{atom_to_list(Transport),
-      ?_assertEqual(ok, with_server(Transport, ServerFun, ClientFun))}
-     || Transport <- [ssl, plain]].
-
-single_CONNECT_test_() ->
-    [{"ssl", ?_assertEqual(ok, do_CONNECT(ssl, 1))},
-     {"plain", ?_assertEqual(ok, do_CONNECT(plain, 1))}].
-
-single_GET_any_test_() ->
-    ServerFun = fun (Req) ->
-                        Req:ok({"text/plain", Req:get(path)})
-                end,
-    ClientFun = new_client_fun('GET', [#treq{path = "*", xreply = <<"*">>}]),
-    [{atom_to_list(Transport),
-      ?_assertEqual(ok, with_server(Transport, ServerFun, ClientFun))}
-     || Transport <- [ssl, plain]].
-
-
-cookie_header_test() ->
-    ReplyPrefix = "You requested: ",
-    ExHeaders = [{"Set-Cookie", "foo=bar"},
-                 {"Set-Cookie", "foo=baz"}],
-    ServerFun = fun (Req) ->
-                        Reply = ReplyPrefix ++ Req:get(path),
-                        Req:ok({"text/plain", ExHeaders, Reply})
-                end,
-    Path = "cookie_header",
-    ExpectedReply = list_to_binary(ReplyPrefix ++ Path),
-    TestReqs = [#treq{path=Path, xreply=ExpectedReply, xheaders=ExHeaders}],
-    ClientFun = new_client_fun('GET', TestReqs),
-    ok = with_server(plain, ServerFun, ClientFun),
-    ok.
-
-
-do_CONNECT(Transport, Times) ->
-    PathPrefix = "example.com:",
-    ReplyPrefix = "You requested: ",
-    ServerFun = fun (Req) ->
-                        Reply = ReplyPrefix ++ Req:get(path),
-                        Req:ok({"text/plain", Reply})
-                end,
-    TestReqs = [begin
-                    Path = PathPrefix ++ integer_to_list(N),
-                    ExpectedReply = list_to_binary(ReplyPrefix ++ Path),
-                    #treq{path=Path, xreply=ExpectedReply}
-                end || N <- lists:seq(1, Times)],
-    ClientFun = new_client_fun('CONNECT', TestReqs),
-    ok = with_server(Transport, ServerFun, ClientFun),
-    ok.
-
-do_GET(Transport, Times) ->
-    do_GET("/whatever/", Transport, Times).
-
-do_GET(PathPrefix, Transport, Times) ->
-    ReplyPrefix = "You requested: ",
-    ServerFun = fun (Req) ->
-                        Reply = ReplyPrefix ++ Req:get(path),
-                        Req:ok({"text/plain", Reply})
-                end,
-    TestReqs = [begin
-                    Path = PathPrefix ++ integer_to_list(N),
-                    ExpectedReply = list_to_binary(ReplyPrefix ++ Path),
-                    #treq{path=Path, xreply=ExpectedReply}
-                end || N <- lists:seq(1, Times)],
-    ClientFun = new_client_fun('GET', TestReqs),
-    ok = with_server(Transport, ServerFun, ClientFun),
-    ok.
-
-do_POST(Transport, Size, Times) ->
-    ServerFun = fun (Req) ->
-                        Body = Req:recv_body(),
-                        Headers = [{"Content-Type", "application/octet-stream"}],
-                        Req:respond({201, Headers, Body})
-                end,
-    TestReqs = [begin
-                    Path = "/stuff/" ++ integer_to_list(N),
-                    Body = crypto:rand_bytes(Size),
-                    #treq{path=Path, body=Body, xreply=Body}
-                end || N <- lists:seq(1, Times)],
-    ClientFun = new_client_fun('POST', TestReqs),
-    ok = with_server(Transport, ServerFun, ClientFun),
-    ok.
-
-new_client_fun(Method, TestReqs) ->
-    fun (Transport, Port) ->
-            mochiweb_test_util:client_request(Transport, Port, Method, TestReqs)
-    end.
-
-close_on_unread_data_test() ->
-    ok = with_server(
-           plain,
-           fun mochiweb_request:not_found/1,
-           fun close_on_unread_data_client/2).
-
-close_on_unread_data_client(Transport, Port) ->
-    SockFun = mochiweb_test_util:sock_fun(Transport, Port),
-    %% A normal GET request should not trigger this behavior
-    Request0 = string:join(
-                 ["GET / HTTP/1.1",
-                  "Host: localhost",
-                  "",
-                  ""],
-                 "\r\n"),
-    ok = SockFun({setopts, [{packet, http}]}),
-    ok = SockFun({send, Request0}),
-    ?assertMatch(
-       {ok, {http_response, {1, 1}, 404, _}},
-       SockFun(recv)),
-    Headers0 = mochiweb_test_util:read_server_headers(SockFun),
-    ?assertEqual(
-       undefined,
-       mochiweb_headers:get_value("Connection", Headers0)),
-    Len0 = list_to_integer(
-             mochiweb_headers:get_value("Content-Length", Headers0)),
-    _Body0 = mochiweb_test_util:drain_reply(SockFun, Len0, <<>>),
-    %% Re-use same socket
-    Request = string:join(
-                ["POST / HTTP/1.1",
-                 "Host: localhost",
-                 "Content-Type: application/json",
-                 "Content-Length: 2",
-                 "",
-                 "{}"],
-                "\r\n"),
-    ok = SockFun({setopts, [{packet, http}]}),
-    ok = SockFun({send, Request}),
-    ?assertMatch(
-       {ok, {http_response, {1, 1}, 404, _}},
-       SockFun(recv)),
-    Headers = mochiweb_test_util:read_server_headers(SockFun),
-    %% Expect to see a Connection: close header when we know the
-    %% server will close the connection re #146
-    ?assertEqual(
-       "close",
-       mochiweb_headers:get_value("Connection", Headers)),
-    Len = list_to_integer(mochiweb_headers:get_value("Content-Length", Headers)),
-    _Body = mochiweb_test_util:drain_reply(SockFun, Len, <<>>),
-    ?assertEqual({error, closed}, SockFun(recv)),
-    ok.
diff --git a/rabbitmq-server/deps/mochiweb/test/mochiweb_websocket_tests.erl b/rabbitmq-server/deps/mochiweb/test/mochiweb_websocket_tests.erl
deleted file mode 100644 (file)
index eb8de5b..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
--module(mochiweb_websocket_tests).
--author('lukasz.lalik@zadane.pl').
-
-%% The MIT License (MIT)
-
-%% Copyright (c) 2012 Zadane.pl sp. z o.o.
-
-%% 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.
-
--include_lib("eunit/include/eunit.hrl").
-
-make_handshake_for_correct_client_test() ->
-    %% Hybi handshake
-    Req1 = mochiweb_request:new(
-             nil, 'GET', "/foo", {1, 1},
-             mochiweb_headers:make([{"Sec-WebSocket-Key",
-                                     "Xn3fdKyc3qEXPuj2A3O+ZA=="}])),
-
-    {Version1,
-     {HttpCode1, Headers1, _}} = mochiweb_websocket:make_handshake(Req1),
-    ?assertEqual(hybi, Version1),
-    ?assertEqual(101, HttpCode1),
-    ?assertEqual("Upgrade", proplists:get_value("Connection", Headers1)),
-    ?assertEqual(<<"BIFTHkJk4r5t8kuud82tZJaQsCE=">>,
-                 proplists:get_value("Sec-Websocket-Accept", Headers1)),
-
-    %% Hixie handshake
-    {Version2, {HttpCode2, Headers2, Body2}} =
-        mochiweb_websocket:hixie_handshake(
-          "ws://",
-          "localhost", "/",
-          "33j284    9  z63 e 9 7",
-          "TF'3|6D12659H 7 70",
-          <<175,181,191,215,128,195,144,120>>,
-          "null"),
-    ?assertEqual(hixie, Version2),
-    ?assertEqual(101, HttpCode2),
-    ?assertEqual("null", proplists:get_value("Sec-WebSocket-Origin", Headers2)),
-    ?assertEqual("ws://localhost/",
-                 proplists:get_value("Sec-WebSocket-Location", Headers2)),
-    ?assertEqual(
-       <<230,144,237,94,84,214,41,69,244,150,134,167,221,103,239,246>>,
-       Body2).
-
-hybi_frames_decode_test() ->
-    ?assertEqual(
-       [{1, <<"foo">>}],
-       mochiweb_websocket:parse_hybi_frames(
-         nil, <<129,131,118,21,153,58,16,122,246>>, [])),
-    ?assertEqual(
-       [{1, <<"foo">>}, {1, <<"bar">>}],
-       mochiweb_websocket:parse_hybi_frames(
-         nil,
-         <<129,131,1,225,201,42,103,142,166,129,131,93,222,214,66,63,191,164>>,
-         [])).
-
-hixie_frames_decode_test() ->
-    ?assertEqual(
-       [],
-       mochiweb_websocket:parse_hixie_frames(<<>>, [])),
-    ?assertEqual(
-       [<<"foo">>],
-       mochiweb_websocket:parse_hixie_frames(<<0,102,111,111,255>>, [])),
-    ?assertEqual(
-       [<<"foo">>, <<"bar">>],
-       mochiweb_websocket:parse_hixie_frames(
-         <<0,102,111,111,255,0,98,97,114,255>>,
-         [])).
-
-end_to_end_test_factory(ServerTransport) ->
-    mochiweb_test_util:with_server(
-      ServerTransport,
-      fun end_to_end_server/1,
-      fun (Transport, Port) ->
-              end_to_end_client(mochiweb_test_util:sock_fun(Transport, Port))
-      end).
-
-end_to_end_server(Req) ->
-    ?assertEqual("Upgrade", Req:get_header_value("connection")),
-    ?assertEqual("websocket", Req:get_header_value("upgrade")),
-    {ReentryWs, _ReplyChannel} = mochiweb_websocket:upgrade_connection(
-                                   Req,
-                                   fun end_to_end_ws_loop/3),
-    ReentryWs(ok).
-
-end_to_end_ws_loop(Payload, State, ReplyChannel) ->
-    %% Echo server
-    lists:foreach(ReplyChannel, Payload),
-    State.
-
-end_to_end_client(S) ->
-    %% Key and Accept per https://tools.ietf.org/html/rfc6455
-    UpgradeReq = string:join(
-                   ["GET / HTTP/1.1",
-                    "Host: localhost",
-                    "Upgrade: websocket",
-                    "Connection: Upgrade",
-                    "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==",
-                    "",
-                    ""], "\r\n"),
-    ok = S({send, UpgradeReq}),
-    {ok, {http_response, {1,1}, 101, _}} = S(recv),
-    read_expected_headers(
-      S,
-      [{'Upgrade', "websocket"},
-       {'Connection', "Upgrade"},
-       {'Content-Length', "0"},
-       {"Sec-Websocket-Accept", "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="}]),
-    %% The first message sent over telegraph :)
-    SmallMessage = <<"What hath God wrought?">>,
-    ok = S({send,
-       << 1:1, %% Fin
-          0:1, %% Rsv1
-          0:1, %% Rsv2
-          0:1, %% Rsv3
-          2:4, %% Opcode, 1 = text frame
-          1:1, %% Mask on
-          (byte_size(SmallMessage)):7, %% Length, <125 case
-          0:32, %% Mask (trivial)
-          SmallMessage/binary >>}),
-    {ok, WsFrames} = S(recv),
-    << 1:1, %% Fin
-       0:1, %% Rsv1
-       0:1, %% Rsv2
-       0:1, %% Rsv3
-       1:4, %% Opcode, text frame (all mochiweb suports for now)
-       MsgSize:8, %% Expecting small size
-       SmallMessage/binary >> = WsFrames,
-    ?assertEqual(MsgSize, byte_size(SmallMessage)),
-    ok.
-
-read_expected_headers(S, D) ->
-    Headers = mochiweb_test_util:read_server_headers(S),
-    lists:foreach(
-      fun ({K, V}) ->
-              ?assertEqual(V, mochiweb_headers:get_value(K, Headers))
-      end,
-      D).
-
-end_to_end_http_test() ->
-    end_to_end_test_factory(plain).
-
-end_to_end_https_test() ->
-    end_to_end_test_factory(ssl).
diff --git a/rabbitmq-server/deps/rabbit_common/LICENSE b/rabbitmq-server/deps/rabbit_common/LICENSE
deleted file mode 100644 (file)
index b086024..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-This package, the RabbitMQ Management Plugin is licensed under the MPL. For the
-MPL, please see LICENSE-MPL-RabbitMQ.
-
-This package makes use of the following third party libraries:
-jQuery     - http://jquery.com/                       - MIT license, see LICENSE-MIT-jQuery164
-EJS        - http://embeddedjs.com/                   - MIT license, see LICENSE-MIT-EJS10
-Sammy      - http://code.quirkey.com/sammy/           - MIT license, see LICENSE-MIT-Sammy060
-Cowboy     - http://ninenines.eu/                     - ISC license
-base64.js  - http://code.google.com/p/stringencoders/ - BSD license, see LICENSE-BSD-base64js
-If you have any questions regarding licensing, please contact us at
-info@rabbitmq.com.
diff --git a/rabbitmq-server/deps/rabbit_common/build.config b/rabbitmq-server/deps/rabbit_common/build.config
deleted file mode 100644 (file)
index b143068..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-# plugins/edoc
-plugins/elvis
-plugins/escript
-plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbit_common/erlang.mk b/rabbitmq-server/deps/rabbit_common/erlang.mk
deleted file mode 100644 (file)
index fc2d806..0000000
+++ /dev/null
@@ -1,6617 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbit_common/mk/rabbitmq-tests.mk b/rabbitmq-server/deps/rabbit_common/mk/rabbitmq-tests.mk
deleted file mode 100644 (file)
index c61252c..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-.PHONY: tests-with-broker standalone-tests
-
-ifeq ($(filter rabbitmq-run.mk,$(notdir $(MAKEFILE_LIST))),)
-include $(dir $(lastword $(MAKEFILE_LIST)))rabbitmq-run.mk
-endif
-
-test_verbose_0 = @echo " TEST  " $@;
-test_verbose_2 = set -x;
-test_verbose = $(test_verbose_$(V))
-
-TEST_BEAM_DIRS = $(CURDIR)/test \
-                $(DEPS_DIR)/rabbitmq_test/ebin
-
-pre-standalone-tests:: virgin-test-tmpdir
-
-tests:: tests-with-broker standalone-tests
-
-tests-with-broker: pre-standalone-tests test-dist
-       $(verbose) rm -f $(TEST_TMPDIR)/.passed
-       $(verbose) $(MAKE) start-background-node \
-               RABBITMQ_SERVER_START_ARGS='$(patsubst %, -pa %,$(TEST_BEAM_DIRS))' \
-               $(WITH_BROKER_TEST_MAKEVARS) \
-               LOG_TO_STDIO=yes
-       $(verbose) $(MAKE) start-rabbit-on-node
-       -$(exec_verbose) echo > $(TEST_TMPDIR)/test-output && \
-       if $(foreach SCRIPT,$(WITH_BROKER_SETUP_SCRIPTS), \
-            MAKE='$(MAKE)' \
-            DEPS_DIR='$(DEPS_DIR)' \
-            NODE_TMPDIR='$(NODE_TMPDIR)' \
-            RABBITMQCTL='$(RABBITMQCTL)' \
-            RABBITMQ_NODENAME='$(RABBITMQ_NODENAME)' \
-            $(WITH_BROKER_TEST_ENVVARS) \
-            $(SCRIPT) &&) \
-          $(foreach CMD,$(WITH_BROKER_TEST_COMMANDS), \
-            echo >> $(TEST_TMPDIR)/test-output && \
-            echo "$(CMD)." \
-               | tee -a $(TEST_TMPDIR)/test-output \
-               | $(ERL_CALL) $(ERL_CALL_OPTS) \
-               | tee -a $(TEST_TMPDIR)/test-output \
-               | egrep '{ok, (ok|passed)}' >/dev/null &&) \
-          $(foreach SCRIPT,$(WITH_BROKER_TEST_SCRIPTS), \
-            MAKE='$(MAKE)' \
-            DEPS_DIR='$(DEPS_DIR)' \
-            NODE_TMPDIR='$(NODE_TMPDIR)' \
-            RABBITMQCTL='$(RABBITMQCTL)' \
-            RABBITMQ_NODENAME='$(RABBITMQ_NODENAME)' \
-            $(WITH_BROKER_TEST_ENVVARS) \
-            $(SCRIPT) &&) : ; \
-        then \
-         touch $(TEST_TMPDIR)/.passed ; \
-       fi
-       $(verbose) if test -f $(TEST_TMPDIR)/.passed; then \
-         printf "\nPASSED\n" ; \
-       else \
-         cat $(TEST_TMPDIR)/test-output ; \
-         printf "\n\nFAILED\n" ; \
-       fi
-       $(verbose) sleep 1
-       $(verbose) echo 'rabbit_misc:report_cover(), init:stop().' | $(ERL_CALL) $(ERL_CALL_OPTS) >/dev/null
-       $(verbose) sleep 1
-       $(verbose) test -f $(TEST_TMPDIR)/.passed
-
-standalone-tests: pre-standalone-tests test-dist
-       $(exec_verbose) $(if $(STANDALONE_TEST_COMMANDS), \
-         $(foreach CMD,$(STANDALONE_TEST_COMMANDS), \
-           MAKE='$(MAKE)' \
-           DEPS_DIR='$(DEPS_DIR)' \
-           TEST_TMPDIR='$(TEST_TMPDIR)' \
-           RABBITMQCTL='$(RABBITMQCTL)' \
-           ERL_LIBS='$(CURDIR)/$(DIST_DIR):$(DIST_ERL_LIBS)' \
-           $(ERL) $(ERL_OPTS) $(patsubst %,-pa %,$(TEST_BEAM_DIRS)) \
-           -sname standalone_test \
-           -eval "init:stop(case $(CMD) of ok -> 0; passed -> 0; _Else -> 1 end)" && \
-         ) \
-       :)
-       $(verbose) $(if $(STANDALONE_TEST_SCRIPTS), \
-       $(foreach SCRIPT,$(STANDALONE_TEST_SCRIPTS), \
-           MAKE='$(MAKE)' \
-           DEPS_DIR='$(DEPS_DIR)' \
-           TEST_TMPDIR='$(TEST_TMPDIR)' \
-           RABBITMQCTL='$(RABBITMQCTL)' \
-           $(SCRIPT) &&) :)
-
-# Add an alias for the old `make test` target.
-.PHONY: test
-test: tests
diff --git a/rabbitmq-server/deps/rabbit_common/src/rabbit_ct_broker_helpers.erl b/rabbitmq-server/deps/rabbit_common/src/rabbit_ct_broker_helpers.erl
deleted file mode 100644 (file)
index 05ede9d..0000000
+++ /dev/null
@@ -1,1037 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_ct_broker_helpers).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("kernel/include/inet.hrl").
--include("include/rabbit.hrl").
-
--export([
-    setup_steps/0,
-    teardown_steps/0,
-    start_rabbitmq_nodes/1,
-    stop_rabbitmq_nodes/1,
-    rewrite_node_config_file/2,
-    cluster_nodes/1, cluster_nodes/2,
-
-    get_node_configs/1, get_node_configs/2,
-    get_node_config/2, get_node_config/3, set_node_config/3,
-    nodename_to_index/2,
-    node_uri/2, node_uri/3,
-
-    control_action/2, control_action/3, control_action/4,
-    rabbitmqctl/3, rabbitmqctl_list/3,
-
-    add_code_path_to_node/2,
-    add_code_path_to_all_nodes/2,
-    rpc/5, rpc/6,
-    rpc_all/4, rpc_all/5,
-
-    start_node/2,
-    start_broker/2,
-    restart_broker/2,
-    stop_broker/2,
-    restart_node/2,
-    stop_node/2,
-    stop_node_after/3,
-    kill_node/2,
-    kill_node_after/3,
-
-    set_partition_handling_mode/3,
-    set_partition_handling_mode_globally/2,
-    enable_dist_proxy_manager/1,
-    enable_dist_proxy/1,
-    enable_dist_proxy_on_node/3,
-    block_traffic_between/2,
-    allow_traffic_between/2,
-
-    get_connection_pids/1,
-    get_queue_sup_pid/1,
-
-    set_policy/6,
-    clear_policy/3,
-    set_ha_policy/4, set_ha_policy/5,
-    set_ha_policy_all/1,
-    set_ha_policy_two_pos/1,
-    set_ha_policy_two_pos_batch_sync/1,
-
-    set_parameter/5,
-    clear_parameter/4,
-
-    enable_plugin/3,
-    disable_plugin/3,
-
-    test_channel/0
-  ]).
-
-%% Internal functions exported to be used by rpc:call/4.
--export([
-    do_restart_broker/0
-  ]).
-
--define(DEFAULT_USER, "guest").
--define(NODE_START_ATTEMPTS, 10).
-
--define(TCP_PORTS_BASE, 21000).
--define(TCP_PORTS_LIST, [
-    tcp_port_amqp,
-    tcp_port_amqp_tls,
-    tcp_port_mgmt,
-    tcp_port_erlang_dist,
-    tcp_port_erlang_dist_proxy,
-    tcp_port_mqtt,
-    tcp_port_mqtt_tls,
-    tcp_port_web_mqtt,
-    tcp_port_stomp,
-    tcp_port_stomp_tls,
-    tcp_port_web_stomp
-  ]).
-
-%% -------------------------------------------------------------------
-%% Broker setup/teardown steps.
-%% -------------------------------------------------------------------
-
-setup_steps() ->
-    [
-      fun run_make_dist/1,
-      fun start_rabbitmq_nodes/1,
-      fun share_dist_and_proxy_ports_map/1
-    ].
-
-teardown_steps() ->
-    [
-      fun stop_rabbitmq_nodes/1
-    ].
-
-run_make_dist(Config) ->
-    SrcDir = ?config(current_srcdir, Config),
-    case rabbit_ct_helpers:make(Config, SrcDir, ["test-dist"]) of
-        {ok, _} -> Config;
-        _       -> {skip, "Failed to run \"make test-dist\""}
-    end.
-
-start_rabbitmq_nodes(Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_username, list_to_binary(?DEFAULT_USER)},
-        {rmq_password, list_to_binary(?DEFAULT_USER)},
-        {rmq_hostname, "localhost"},
-        {rmq_vhost, <<"/">>},
-        {rmq_channel_max, 0}]),
-    NodesCount0 = rabbit_ct_helpers:get_config(Config1, rmq_nodes_count),
-    NodesCount = case NodesCount0 of
-        undefined                                -> 1;
-        N when is_integer(N) andalso N >= 1      -> N;
-        L when is_list(L) andalso length(L) >= 1 -> length(L)
-    end,
-    Clustered0 = rabbit_ct_helpers:get_config(Config1, rmq_nodes_clustered),
-    Clustered = case Clustered0 of
-        undefined            -> true;
-        C when is_boolean(C) -> C
-    end,
-    Master = self(),
-    Starters = [
-      spawn_link(fun() -> start_rabbitmq_node(Master, Config1, [], I) end)
-      || I <- lists:seq(0, NodesCount - 1)
-    ],
-    wait_for_rabbitmq_nodes(Config1, Starters, [], Clustered).
-
-wait_for_rabbitmq_nodes(Config, [], NodeConfigs, Clustered) ->
-    NodeConfigs1 = [NC || {_, NC} <- lists:keysort(1, NodeConfigs)],
-    Config1 = rabbit_ct_helpers:set_config(Config, {rmq_nodes, NodeConfigs1}),
-    if
-        Clustered -> cluster_nodes(Config1);
-        true      -> Config1
-    end;
-wait_for_rabbitmq_nodes(Config, Starting, NodeConfigs, Clustered) ->
-    receive
-        {_, {skip, _} = Error} ->
-            NodeConfigs1 = [NC || {_, NC} <- NodeConfigs],
-            Config1 = rabbit_ct_helpers:set_config(Config,
-              {rmq_nodes, NodeConfigs1}),
-            stop_rabbitmq_nodes(Config1),
-            Error;
-        {Pid, I, NodeConfig} when NodeConfigs =:= [] ->
-            wait_for_rabbitmq_nodes(Config, Starting -- [Pid],
-              [{I, NodeConfig} | NodeConfigs], Clustered);
-        {Pid, I, NodeConfig} ->
-            wait_for_rabbitmq_nodes(Config, Starting -- [Pid],
-              [{I, NodeConfig} | NodeConfigs], Clustered)
-    end.
-
-%% To start a RabbitMQ node, we need to:
-%%   1. Pick TCP port numbers
-%%   2. Generate a node name
-%%   3. Write a configuration file
-%%   4. Start the node
-%%
-%% If this fails (usually because the node name is taken or a TCP port
-%% is already in use), we start again with another set of TCP ports. The
-%% node name is derived from the AMQP TCP port so a new node name is
-%% generated.
-
-start_rabbitmq_node(Master, Config, NodeConfig, I) ->
-    Attempts0 = rabbit_ct_helpers:get_config(NodeConfig, failed_boot_attempts),
-    Attempts = case Attempts0 of
-        undefined -> 0;
-        N         -> N
-    end,
-    NodeConfig1 = init_tcp_port_numbers(Config, NodeConfig, I),
-    NodeConfig2 = init_nodename(Config, NodeConfig1, I),
-    NodeConfig3 = init_config_filename(Config, NodeConfig2, I),
-    Steps = [
-      fun write_config_file/3,
-      fun do_start_rabbitmq_node/3
-    ],
-    case run_node_steps(Config, NodeConfig3, I, Steps) of
-        {skip, _} = Error
-        when Attempts >= ?NODE_START_ATTEMPTS ->
-            %% It's unlikely we'll ever succeed to start RabbitMQ.
-            Master ! {self(), Error},
-            unlink(Master);
-        {skip, _} ->
-            %% Try again with another TCP port numbers base.
-            NodeConfig4 = move_nonworking_nodedir_away(NodeConfig3),
-            NodeConfig5 = rabbit_ct_helpers:set_config(NodeConfig4,
-              {failed_boot_attempts, Attempts + 1}),
-            start_rabbitmq_node(Master, Config, NodeConfig5, I);
-        NodeConfig4 ->
-            Master ! {self(), I, NodeConfig4},
-            unlink(Master)
-    end.
-
-run_node_steps(Config, NodeConfig, I, [Step | Rest]) ->
-    case Step(Config, NodeConfig, I) of
-        {skip, _} = Error -> Error;
-        NodeConfig1       -> run_node_steps(Config, NodeConfig1, I, Rest)
-    end;
-run_node_steps(_, NodeConfig, _, []) ->
-    NodeConfig.
-
-init_tcp_port_numbers(Config, NodeConfig, I) ->
-    %% If there is no TCP port numbers base previously calculated,
-    %% use the TCP port 21000. If a base was previously calculated,
-    %% increment it by the number of TCP ports we may open.
-    %%
-    %% Port 21000 is an arbitrary choice. We don't want to use the
-    %% default AMQP port of 5672 so other AMQP clients on the same host
-    %% do not accidentally use the testsuite broker. There seems to be
-    %% no registered service around this port in /etc/services. And it
-    %% should be far enough away from the default ephemeral TCP ports
-    %% range.
-    ExtraPorts = case rabbit_ct_helpers:get_config(Config, rmq_extra_tcp_ports) of
-        undefined           -> [];
-        EP when is_list(EP) -> EP
-    end,
-    PortsCount = length(?TCP_PORTS_LIST) + length(ExtraPorts),
-    Base = case rabbit_ct_helpers:get_config(NodeConfig, tcp_ports_base) of
-        undefined -> tcp_port_base_for_broker(Config, I, PortsCount);
-        P         -> P + PortsCount
-    end,
-    NodeConfig1 = rabbit_ct_helpers:set_config(NodeConfig,
-      {tcp_ports_base, Base}),
-    %% Now, compute all TCP port numbers from this base.
-    {NodeConfig2, _} = lists:foldl(
-      fun(PortName, {NewConfig, NextPort}) ->
-          {
-            rabbit_ct_helpers:set_config(NewConfig, {PortName, NextPort}),
-            NextPort + 1
-          }
-      end,
-      {NodeConfig1, Base}, ?TCP_PORTS_LIST ++ ExtraPorts),
-    %% Finally, update the RabbitMQ configuration with the computed TCP
-    %% port numbers. Extra TCP ports are not added automatically to the
-    %% configuration.
-    update_tcp_ports_in_rmq_config(NodeConfig2, ?TCP_PORTS_LIST).
-
-tcp_port_base_for_broker(Config, I, PortsCount) ->
-    Base = case rabbit_ct_helpers:get_config(Config, tcp_ports_base) of
-        undefined ->
-            ?TCP_PORTS_BASE;
-        {skip_n_nodes, N} ->
-            tcp_port_base_for_broker1(?TCP_PORTS_BASE, N, PortsCount);
-        B ->
-            B
-    end,
-    tcp_port_base_for_broker1(Base, I, PortsCount).
-
-tcp_port_base_for_broker1(Base, I, PortsCount) ->
-    Base + I * PortsCount * ?NODE_START_ATTEMPTS.
-
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_amqp = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbit, [{tcp_listeners, [?config(Key, NodeConfig)]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_amqp_tls = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbit, [{ssl_listeners, [?config(Key, NodeConfig)]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_mgmt = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_management, [{listener, [{port, ?config(Key, NodeConfig)}]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_mqtt = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_mqtt, [{tcp_listeners, [?config(Key, NodeConfig)]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_mqtt_tls = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_mqtt, [{ssl_listeners, [?config(Key, NodeConfig)]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_web_mqtt = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_web_mqtt, [{tcp_config, [{port, ?config(Key, NodeConfig)}]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_web_stomp = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_web_stomp, [{tcp_config, [{port, ?config(Key, NodeConfig)}]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_stomp = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_stomp, [{tcp_listeners, [?config(Key, NodeConfig)]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_stomp_tls = Key | Rest]) ->
-    NodeConfig1 = rabbit_ct_helpers:merge_app_env(NodeConfig,
-      {rabbitmq_stomp, [{ssl_listeners, [?config(Key, NodeConfig)]}]}),
-    update_tcp_ports_in_rmq_config(NodeConfig1, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_erlang_dist | Rest]) ->
-    %% The Erlang distribution port doesn't appear in the configuration file.
-    update_tcp_ports_in_rmq_config(NodeConfig, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, [tcp_port_erlang_dist_proxy | Rest]) ->
-    %% inet_proxy_dist port doesn't appear in the configuration file.
-    update_tcp_ports_in_rmq_config(NodeConfig, Rest);
-update_tcp_ports_in_rmq_config(NodeConfig, []) ->
-    NodeConfig.
-
-init_nodename(Config, NodeConfig, I) ->
-    Nodename0 = case rabbit_ct_helpers:get_config(Config, rmq_nodes_count) of
-        NodesList when is_list(NodesList) ->
-            Name = lists:nth(I + 1, NodesList),
-            rabbit_misc:format("~s@localhost", [Name]);
-        _ ->
-            Base = ?config(tcp_ports_base, NodeConfig),
-            Suffix0 = rabbit_ct_helpers:get_config(Config,
-              rmq_nodename_suffix),
-            Suffix = case Suffix0 of
-                undefined               -> "";
-                _ when is_atom(Suffix0) -> [$- | atom_to_list(Suffix0)];
-                _                       -> [$- | Suffix0]
-            end,
-            rabbit_misc:format("rmq-ct~s-~b-~b@localhost",
-              [Suffix, I + 1, Base])
-    end,
-    Nodename = list_to_atom(Nodename0),
-    rabbit_ct_helpers:set_config(NodeConfig, [
-        {nodename, Nodename},
-        {initial_nodename, Nodename}
-      ]).
-
-init_config_filename(Config, NodeConfig, _I) ->
-    PrivDir = ?config(priv_dir, Config),
-    Nodename = ?config(nodename, NodeConfig),
-    ConfigDir = filename:join(PrivDir, Nodename),
-    ConfigFile = filename:join(ConfigDir, Nodename),
-    rabbit_ct_helpers:set_config(NodeConfig,
-      {erlang_node_config_filename, ConfigFile}).
-
-write_config_file(Config, NodeConfig, _I) ->
-    %% Prepare a RabbitMQ configuration.
-    ErlangConfigBase = ?config(erlang_node_config, Config),
-    ErlangConfigOverlay = ?config(erlang_node_config, NodeConfig),
-    ErlangConfig = rabbit_ct_helpers:merge_app_env_in_erlconf(ErlangConfigBase,
-      ErlangConfigOverlay),
-    ConfigFile = ?config(erlang_node_config_filename, NodeConfig),
-    ConfigDir = filename:dirname(ConfigFile),
-    Ret1 = file:make_dir(ConfigDir),
-    Ret2 = file:write_file(ConfigFile ++ ".config",
-      io_lib:format("% vim:ft=erlang:~n~n~p.~n", [ErlangConfig])),
-    case {Ret1, Ret2} of
-        {ok, ok} ->
-            NodeConfig;
-        {{error, eexist}, ok} ->
-            NodeConfig;
-        {{error, Reason}, _} when Reason =/= eexist ->
-            {skip, "Failed to create Erlang node config directory \"" ++
-             ConfigDir ++ "\": " ++ file:format_error(Reason)};
-        {_, {error, Reason}} ->
-            {skip, "Failed to create Erlang node config file \"" ++
-             ConfigFile ++ "\": " ++ file:format_error(Reason)}
-    end.
-
-do_start_rabbitmq_node(Config, NodeConfig, I) ->
-    WithPlugins0 = rabbit_ct_helpers:get_config(Config,
-      broker_with_plugins),
-    WithPlugins = case is_list(WithPlugins0) of
-        true  -> lists:nth(I + 1, WithPlugins0);
-        false -> WithPlugins0
-    end,
-    SrcDir = case WithPlugins of
-        false -> ?config(rabbit_srcdir, Config);
-        _     -> ?config(current_srcdir, Config)
-    end,
-    PrivDir = ?config(priv_dir, Config),
-    Nodename = ?config(nodename, NodeConfig),
-    InitialNodename = ?config(initial_nodename, NodeConfig),
-    DistPort = ?config(tcp_port_erlang_dist, NodeConfig),
-    ConfigFile = ?config(erlang_node_config_filename, NodeConfig),
-    %% Use inet_proxy_dist to handle distribution. This is used by the
-    %% partitions testsuite.
-    DistMod = rabbit_ct_helpers:get_config(Config, erlang_dist_module),
-    StartArgs0 = case DistMod of
-        undefined ->
-            "";
-        _ ->
-            DistModS = atom_to_list(DistMod),
-            DistModPath = filename:absname(
-              filename:dirname(code:where_is_file(DistModS ++ ".beam"))),
-            DistArg = re:replace(DistModS, "_dist$", "", [{return, list}]),
-            "-pa \"" ++ DistModPath ++ "\" -proto_dist " ++ DistArg
-    end,
-    %% Set the net_ticktime.
-    CurrentTicktime = case net_kernel:get_net_ticktime() of
-        {ongoing_change_to, T} -> T;
-        T                      -> T
-    end,
-    StartArgs1 = case rabbit_ct_helpers:get_config(Config, net_ticktime) of
-        undefined ->
-            case CurrentTicktime of
-                60 -> ok;
-                _  -> net_kernel:set_net_ticktime(60)
-            end,
-            StartArgs0;
-        Ticktime ->
-            case CurrentTicktime of
-                Ticktime -> ok;
-                _        -> net_kernel:set_net_ticktime(Ticktime)
-            end,
-            StartArgs0 ++ " -kernel net_ticktime " ++ integer_to_list(Ticktime)
-    end,
-    Cmd = ["start-background-broker",
-      {"RABBITMQ_NODENAME=~s", [Nodename]},
-      {"RABBITMQ_NODENAME_FOR_PATHS=~s", [InitialNodename]},
-      {"RABBITMQ_DIST_PORT=~b", [DistPort]},
-      {"RABBITMQ_CONFIG_FILE=~s", [ConfigFile]},
-      {"RABBITMQ_SERVER_START_ARGS=~s", [StartArgs1]},
-      {"TEST_TMPDIR=~s", [PrivDir]}],
-    case rabbit_ct_helpers:make(Config, SrcDir, Cmd) of
-        {ok, _} -> query_node(Config, NodeConfig);
-        _       -> {skip, "Failed to initialize RabbitMQ"}
-    end.
-
-query_node(Config, NodeConfig) ->
-    Nodename = ?config(nodename, NodeConfig),
-    PidFile = rpc(Config, Nodename, os, getenv, ["RABBITMQ_PID_FILE"]),
-    MnesiaDir = rpc(Config, Nodename, mnesia, system_info, [directory]),
-    {ok, PluginsDir} = rpc(Config, Nodename, application, get_env,
-      [rabbit, plugins_dir]),
-    {ok, EnabledPluginsFile} = rpc(Config, Nodename, application, get_env,
-      [rabbit, enabled_plugins_file]),
-    rabbit_ct_helpers:set_config(NodeConfig, [
-        {pid_file, PidFile},
-        {mnesia_dir, MnesiaDir},
-        {plugins_dir, PluginsDir},
-        {enabled_plugins_file, EnabledPluginsFile}
-      ]).
-
-cluster_nodes(Config) ->
-    [NodeConfig1 | NodeConfigs] = get_node_configs(Config),
-    cluster_nodes1(Config, NodeConfig1, NodeConfigs).
-
-cluster_nodes(Config, Nodes) ->
-    [NodeConfig1 | NodeConfigs] = [
-      get_node_config(Config, Node) || Node <- Nodes],
-    cluster_nodes1(Config, NodeConfig1, NodeConfigs).
-
-cluster_nodes1(Config, NodeConfig1, [NodeConfig2 | Rest]) ->
-    case cluster_nodes(Config, NodeConfig2, NodeConfig1) of
-        ok    -> cluster_nodes1(Config, NodeConfig1, Rest);
-        Error -> Error
-    end;
-cluster_nodes1(Config, _, []) ->
-    Config.
-
-cluster_nodes(Config, NodeConfig1, NodeConfig2) ->
-    Nodename1 = ?config(nodename, NodeConfig1),
-    Nodename2 = ?config(nodename, NodeConfig2),
-    Cmds = [
-      ["stop_app"],
-      ["join_cluster", Nodename2],
-      ["start_app"]
-    ],
-    cluster_nodes1(Config, Nodename1, Nodename2, Cmds).
-
-cluster_nodes1(Config, Nodename1, Nodename2, [Cmd | Rest]) ->
-    case rabbitmqctl(Config, Nodename1, Cmd) of
-        {ok, _} -> cluster_nodes1(Config, Nodename1, Nodename2, Rest);
-        _       -> {skip,
-                    "Failed to cluster nodes \"" ++ atom_to_list(Nodename1) ++
-                    "\" and \"" ++ atom_to_list(Nodename2) ++ "\""}
-    end;
-cluster_nodes1(_, _, _, []) ->
-    ok.
-
-move_nonworking_nodedir_away(NodeConfig) ->
-    ConfigFile = ?config(erlang_node_config_filename, NodeConfig),
-    ConfigDir = filename:dirname(ConfigFile),
-    NewName = filename:join(
-      filename:dirname(ConfigDir),
-      "_unused_nodedir_" ++ filename:basename(ConfigDir)),
-    file:rename(ConfigDir, NewName),
-    lists:keydelete(erlang_node_config_filename, 1, NodeConfig).
-
-share_dist_and_proxy_ports_map(Config) ->
-    Map = [
-      {
-        ?config(tcp_port_erlang_dist, NodeConfig),
-        ?config(tcp_port_erlang_dist_proxy, NodeConfig)
-      } || NodeConfig <- get_node_configs(Config)],
-    rpc_all(Config,
-      application, set_env, [kernel, dist_and_proxy_ports_map, Map]),
-    Config.
-
-rewrite_node_config_file(Config, Node) ->
-    NodeConfig = get_node_config(Config, Node),
-    I = if
-        is_integer(Node) -> Node;
-        true             -> nodename_to_index(Config, Node)
-    end,
-    %% Keep copies of previous config file.
-    ConfigFile = ?config(erlang_node_config_filename, NodeConfig),
-    case rotate_config_file(ConfigFile) of
-        ok ->
-            ok;
-        {error, Reason} ->
-            ct:pal("Failed to rotate config file ~s: ~s",
-              [ConfigFile, file:format_error(Reason)])
-    end,
-    %% Now we can write the new file. The caller is responsible for
-    %% restarting the broker/node.
-    case write_config_file(Config, NodeConfig, I) of
-        {skip, Error} -> {error, Error};
-        _NodeConfig1  -> ok
-    end.
-
-rotate_config_file(ConfigFile) ->
-    rotate_config_file(ConfigFile, ConfigFile ++ ".config", 1).
-
-rotate_config_file(ConfigFile, OldName, Ext) ->
-    NewName = rabbit_misc:format("~s.config.~b", [ConfigFile, Ext]),
-    case filelib:is_file(NewName) of
-        true  ->
-            case rotate_config_file(ConfigFile, NewName, Ext + 1) of
-                ok    -> file:rename(OldName, NewName);
-                Error -> Error
-            end;
-        false ->
-            file:rename(OldName, NewName)
-    end.
-
-stop_rabbitmq_nodes(Config) ->
-    NodeConfigs = get_node_configs(Config),
-    [stop_rabbitmq_node(Config, NodeConfig) || NodeConfig <- NodeConfigs],
-    proplists:delete(rmq_nodes, Config).
-
-stop_rabbitmq_node(Config, NodeConfig) ->
-    SrcDir = ?config(current_srcdir, Config),
-    PrivDir = ?config(priv_dir, Config),
-    Nodename = ?config(nodename, NodeConfig),
-    InitialNodename = ?config(initial_nodename, NodeConfig),
-    Cmd = ["stop-rabbit-on-node", "stop-node",
-      {"RABBITMQ_NODENAME=~s", [Nodename]},
-      {"RABBITMQ_NODENAME_FOR_PATHS=~s", [InitialNodename]},
-      {"TEST_TMPDIR=~s", [PrivDir]}],
-    rabbit_ct_helpers:make(Config, SrcDir, Cmd),
-    NodeConfig.
-
-%% -------------------------------------------------------------------
-%% Helpers for partition simulation
-%% -------------------------------------------------------------------
-
-enable_dist_proxy_manager(Config) ->
-    inet_tcp_proxy_manager:start(),
-    rabbit_ct_helpers:set_config(Config,
-      {erlang_dist_module, inet_proxy_dist}).
-
-enable_dist_proxy(Config) ->
-    NodeConfigs = rabbit_ct_broker_helpers:get_node_configs(Config),
-    Nodes = [?config(nodename, NodeConfig) || NodeConfig <- NodeConfigs],
-    ManagerNode = node(),
-    ok = lists:foreach(
-      fun(NodeConfig) ->
-          ok = rabbit_ct_broker_helpers:rpc(Config,
-            ?config(nodename, NodeConfig),
-            ?MODULE, enable_dist_proxy_on_node,
-            [NodeConfig, ManagerNode, Nodes])
-      end, NodeConfigs),
-    Config.
-
-enable_dist_proxy_on_node(NodeConfig, ManagerNode, Nodes) ->
-    Nodename = ?config(nodename, NodeConfig),
-    DistPort = ?config(tcp_port_erlang_dist, NodeConfig),
-    ProxyPort = ?config(tcp_port_erlang_dist_proxy, NodeConfig),
-    ok = inet_tcp_proxy:start(ManagerNode, DistPort, ProxyPort),
-    ok = inet_tcp_proxy:reconnect(Nodes -- [Nodename]).
-
-block_traffic_between(NodeA, NodeB) ->
-    rpc:call(NodeA, inet_tcp_proxy, block, [NodeB]),
-    rpc:call(NodeB, inet_tcp_proxy, block, [NodeA]).
-
-allow_traffic_between(NodeA, NodeB) ->
-    rpc:call(NodeA, inet_tcp_proxy, allow, [NodeB]),
-    rpc:call(NodeB, inet_tcp_proxy, allow, [NodeA]).
-
-set_partition_handling_mode_globally(Config, Mode) ->
-    rabbit_ct_broker_helpers:rpc_all(Config,
-      application, set_env, [rabbit, cluster_partition_handling, Mode]).
-
-set_partition_handling_mode(Config, Nodes, Mode) ->
-    rabbit_ct_broker_helpers:rpc(Config, Nodes,
-      application, set_env, [rabbit, cluster_partition_handling, Mode]).
-
-%% -------------------------------------------------------------------
-%% Calls to rabbitmqctl from Erlang.
-%% -------------------------------------------------------------------
-
-control_action(Command, Node) ->
-    control_action(Command, Node, [], []).
-
-control_action(Command, Node, Args) ->
-    control_action(Command, Node, Args, []).
-
-control_action(Command, Node, Args, Opts) ->
-    rpc:call(Node, rabbit_control_main, action,
-             [Command, Node, Args, Opts,
-              fun (F, A) ->
-                      error_logger:info_msg(F ++ "~n", A)
-              end]).
-
-%% Use rabbitmqctl(1) instead of using the Erlang API.
-
-rabbitmqctl(Config, Node, Args) ->
-    Rabbitmqctl = ?config(rabbitmqctl_cmd, Config),
-    NodeConfig = get_node_config(Config, Node),
-    Nodename = ?config(nodename, NodeConfig),
-    Env = [
-      {"RABBITMQ_PID_FILE", ?config(pid_file, NodeConfig)},
-      {"RABBITMQ_MNESIA_DIR", ?config(mnesia_dir, NodeConfig)},
-      {"RABBITMQ_PLUGINS_DIR", ?config(plugins_dir, NodeConfig)},
-      {"RABBITMQ_ENABLED_PLUGINS_FILE",
-        ?config(enabled_plugins_file, NodeConfig)}
-    ],
-    Cmd = [Rabbitmqctl, "-n", Nodename | Args],
-    rabbit_ct_helpers:exec(Cmd, [{env, Env}]).
-
-rabbitmqctl_list(Config, Node, Args) ->
-    {ok, StdOut} = rabbitmqctl(Config, Node, Args),
-    [<<"Listing", _/binary>>|Rows] = re:split(StdOut, <<"\n">>, [trim]),
-    [re:split(Row, <<"\t">>) || Row <- Rows].
-
-%% -------------------------------------------------------------------
-%% Other helpers.
-%% -------------------------------------------------------------------
-
-get_node_configs(Config) ->
-    ?config(rmq_nodes, Config).
-
-get_node_configs(Config, Key) ->
-    NodeConfigs = get_node_configs(Config),
-    [?config(Key, NodeConfig) || NodeConfig <- NodeConfigs].
-
-get_node_config(Config, Node) when is_atom(Node) andalso Node =/= undefined ->
-    NodeConfigs = get_node_configs(Config),
-    get_node_config1(NodeConfigs, Node);
-get_node_config(Config, I) when is_integer(I) andalso I >= 0 ->
-    NodeConfigs = get_node_configs(Config),
-    lists:nth(I + 1, NodeConfigs).
-
-get_node_config1([NodeConfig | Rest], Node) ->
-    case ?config(nodename, NodeConfig) of
-        Node -> NodeConfig;
-        _    -> case ?config(initial_nodename, NodeConfig) of
-                    Node -> NodeConfig;
-                    _    -> get_node_config1(Rest, Node)
-                end
-    end;
-get_node_config1([], Node) ->
-    exit({unknown_node, Node}).
-
-get_node_config(Config, Node, Key) ->
-    NodeConfig = get_node_config(Config, Node),
-    ?config(Key, NodeConfig).
-
-set_node_config(Config, Node, Tuples) ->
-    NodeConfig = get_node_config(Config, Node),
-    NodeConfig1 = rabbit_ct_helpers:set_config(NodeConfig, Tuples),
-    replace_entire_node_config(Config, Node, NodeConfig1).
-
-replace_entire_node_config(Config, Node, NewNodeConfig) ->
-    NodeConfigs = get_node_configs(Config),
-    NodeConfigs1 = lists:map(
-      fun(NodeConfig) ->
-          Match = case ?config(nodename, NodeConfig) of
-              Node -> true;
-              _    -> case ?config(initial_nodename, NodeConfig) of
-                      Node -> true;
-                      _    -> false
-                  end
-          end,
-          if
-              Match -> NewNodeConfig;
-              true  -> NodeConfig
-          end
-      end, NodeConfigs),
-    rabbit_ct_helpers:set_config(Config, {rmq_nodes, NodeConfigs1}).
-
-nodename_to_index(Config, Node) ->
-    NodeConfigs = get_node_configs(Config),
-    nodename_to_index1(NodeConfigs, Node, 0).
-
-nodename_to_index1([NodeConfig | Rest], Node, I) ->
-    case ?config(nodename, NodeConfig) of
-        Node -> I;
-        _    -> case ?config(initial_nodename, NodeConfig) of
-                    Node -> I;
-                    _    -> nodename_to_index1(Rest, Node, I + 1)
-                end
-    end;
-nodename_to_index1([], Node, _) ->
-    exit({unknown_node, Node}).
-
-node_uri(Config, Node) ->
-    node_uri(Config, Node, []).
-
-node_uri(Config, Node, amqp) ->
-    node_uri(Config, Node, []);
-node_uri(Config, Node, management) ->
-    node_uri(Config, Node, [
-        {scheme, "http"},
-        {tcp_port_name, tcp_port_mgmt}
-      ]);
-node_uri(Config, Node, Options) ->
-    Scheme = proplists:get_value(scheme, Options, "amqp"),
-    Hostname = case proplists:get_value(use_ipaddr, Options, false) of
-        true ->
-            {ok, Hostent} = inet:gethostbyname(?config(rmq_hostname, Config)),
-            format_ipaddr_for_uri(Hostent);
-        Family when Family =:= inet orelse Family =:= inet6 ->
-            {ok, Hostent} = inet:gethostbyname(?config(rmq_hostname, Config),
-              Family),
-            format_ipaddr_for_uri(Hostent);
-        false ->
-            ?config(rmq_hostname, Config)
-    end,
-    TcpPortName = proplists:get_value(tcp_port_name, Options, tcp_port_amqp),
-    TcpPort = get_node_config(Config, Node, TcpPortName),
-    UserPass = case proplists:get_value(with_user, Options, false) of
-        true ->
-            User = proplists:get_value(user, Options, "guest"),
-            Password = proplists:get_value(password, Options, "guest"),
-            io_lib:format("~s:~s@", [User, Password]);
-        false ->
-            ""
-    end,
-    list_to_binary(
-      rabbit_misc:format("~s://~s~s:~b",
-        [Scheme, UserPass, Hostname, TcpPort])).
-
-format_ipaddr_for_uri(
-  #hostent{h_addrtype = inet, h_addr_list = [IPAddr | _]}) ->
-    {A, B, C, D} = IPAddr,
-    io_lib:format("~b.~b.~b.~b", [A, B, C, D]);
-format_ipaddr_for_uri(
-  #hostent{h_addrtype = inet6, h_addr_list = [IPAddr | _]}) ->
-    {A, B, C, D, E, F, G, H} = IPAddr,
-    Res0 = io_lib:format(
-      "~.16b:~.16b:~.16b:~.16b:~.16b:~.16b:~.16b:~.16b",
-      [A, B, C, D, E, F, G, H]),
-    Res1 = re:replace(Res0, "(^0(:0)+$|^(0:)+|(:0)+$)|:(0:)+", "::"),
-    "[" ++ Res1 ++ "]".
-
-%% Functions to execute code on a remote node/broker.
-
-add_code_path_to_node(Node, Module) ->
-    Path1 = filename:dirname(code:which(Module)),
-    Path2 = filename:dirname(code:which(?MODULE)),
-    Paths = lists:usort([Path1, Path2]),
-    ExistingPaths = rpc:call(Node, code, get_path, []),
-    lists:foreach(
-      fun(P) ->
-          case lists:member(P, ExistingPaths) of
-              true  -> ok;
-              false -> true = rpc:call(Node, code, add_pathz, [P])
-          end
-      end, Paths).
-
-add_code_path_to_all_nodes(Config, Module) ->
-    Nodenames = get_node_configs(Config, nodename),
-    [ok = add_code_path_to_node(Nodename, Module)
-      || Nodename <- Nodenames],
-    ok.
-
-rpc(Config, Node, Module, Function, Args)
-when is_atom(Node) andalso Node =/= undefined ->
-    rpc(Config, Node, Module, Function, Args, infinity);
-rpc(Config, I, Module, Function, Args)
-when is_integer(I) andalso I >= 0 ->
-    Node = get_node_config(Config, I, nodename),
-    rpc(Config, Node, Module, Function, Args);
-rpc(Config, Nodes, Module, Function, Args)
-when is_list(Nodes) ->
-    [rpc(Config, Node, Module, Function, Args) || Node <- Nodes].
-
-rpc(_Config, Node, Module, Function, Args, Timeout)
-when is_atom(Node) andalso Node =/= undefined ->
-    %% We add some directories to the broker node search path.
-    add_code_path_to_node(Node, Module),
-    %% If there is an exception, rpc:call/{4,5} returns the exception as
-    %% a "normal" return value. If there is an exit signal, we raise
-    %% it again. In both cases, we have no idea of the module and line
-    %% number which triggered the issue.
-    Ret = case Timeout of
-        infinity -> rpc:call(Node, Module, Function, Args);
-        _        -> rpc:call(Node, Module, Function, Args, Timeout)
-    end,
-    case Ret of
-        {badrpc, {'EXIT', Reason}} -> exit(Reason);
-        {badrpc, Reason}           -> exit(Reason);
-        Ret                        -> Ret
-    end;
-rpc(Config, I, Module, Function, Args, Timeout)
-when is_integer(I) andalso I >= 0 ->
-    Node = get_node_config(Config, I, nodename),
-    rpc(Config, Node, Module, Function, Args, Timeout);
-rpc(Config, Nodes, Module, Function, Args, Timeout)
-when is_list(Nodes) ->
-    [rpc(Config, Node, Module, Function, Args, Timeout) || Node <- Nodes].
-
-rpc_all(Config, Module, Function, Args) ->
-    Nodes = get_node_configs(Config, nodename),
-    rpc(Config, Nodes, Module, Function, Args).
-
-rpc_all(Config, Module, Function, Args, Timeout) ->
-    Nodes = get_node_configs(Config, nodename),
-    rpc(Config, Nodes, Module, Function, Args, Timeout).
-
-%% Functions to start/restart/stop only the broker or the full Erlang
-%% node.
-
-start_node(Config, Node) ->
-    NodeConfig = get_node_config(Config, Node),
-    I = if
-        is_atom(Node) -> nodename_to_index(Config, Node);
-        true          -> Node
-    end,
-    case do_start_rabbitmq_node(Config, NodeConfig, I) of
-        {skip, _} = Error -> {error, Error};
-        _                 -> ok
-    end.
-
-start_broker(Config, Node) ->
-    ok = rpc(Config, Node, rabbit, start, []).
-
-restart_broker(Config, Node) ->
-    ok = rpc(Config, Node, ?MODULE, do_restart_broker, []).
-
-do_restart_broker() ->
-    ok = rabbit:stop(),
-    ok = rabbit:start().
-
-stop_broker(Config, Node) ->
-    ok = rpc(Config, Node, rabbit, stop, []).
-
-restart_node(Config, Node) ->
-    ok = stop_node(Config, Node),
-    ok = start_node(Config, Node).
-
-stop_node(Config, Node) ->
-    NodeConfig = get_node_config(Config, Node),
-    case stop_rabbitmq_node(Config, NodeConfig) of
-        {skip, _} = Error -> Error;
-        _                 -> ok
-    end.
-
-stop_node_after(Config, Node, Sleep) ->
-    timer:sleep(Sleep),
-    stop_node(Config, Node).
-
-kill_node(Config, Node) ->
-    Pid = rpc(Config, Node, os, getpid, []),
-    %% FIXME maybe_flush_cover(Cfg),
-    os:cmd("kill -9 " ++ Pid),
-    await_os_pid_death(Pid).
-
-kill_node_after(Config, Node, Sleep) ->
-    timer:sleep(Sleep),
-    kill_node(Config, Node).
-
-await_os_pid_death(Pid) ->
-    case rabbit_misc:is_os_process_alive(Pid) of
-        true  -> timer:sleep(100),
-                 await_os_pid_death(Pid);
-        false -> ok
-    end.
-
-%% From a given list of gen_tcp client connections, return the list of
-%% connection handler PID in RabbitMQ.
-get_connection_pids(Connections) ->
-    ConnInfos = [
-      begin
-          {ok, {Addr, Port}} = inet:sockname(Connection),
-          [{peer_host, Addr}, {peer_port, Port}]
-      end || Connection <- Connections],
-    lists:filter(
-      fun(Conn) ->
-          ConnInfo = rabbit_networking:connection_info(Conn,
-            [peer_host, peer_port]),
-          %% On at least Mac OS X, for a connection on localhost, the
-          %% client side of the connection gives its IPv4 address
-          %% (127.0.0.1), but the server side gives some kind of
-          %% non-standard IPv6 address (::ffff:7f00:1, not even the
-          %% standard ::1). So let's test for this alternate form too.
-          AltConnInfo = case proplists:get_value(peer_host, ConnInfo) of
-              {0, 0, 0, 0, 0, 16#ffff, 16#7f00, N} ->
-                  lists:keyreplace(peer_host, 1, ConnInfo,
-                      {peer_host, {127, 0, 0, N}});
-              _ ->
-                  ConnInfo
-          end,
-          lists:member(ConnInfo, ConnInfos) orelse
-          lists:member(AltConnInfo, ConnInfos)
-      end, rabbit_networking:connections()).
-
-%% Return the PID of the given queue's supervisor.
-get_queue_sup_pid(QueuePid) ->
-    Sups = supervisor:which_children(rabbit_amqqueue_sup_sup),
-    get_queue_sup_pid(Sups, QueuePid).
-
-get_queue_sup_pid([{_, SupPid, _, _} | Rest], QueuePid) ->
-    WorkerPids = [Pid || {_, Pid, _, _} <- supervisor:which_children(SupPid)],
-    case lists:member(QueuePid, WorkerPids) of
-        true  -> SupPid;
-        false -> get_queue_sup_pid(Rest, QueuePid)
-    end;
-get_queue_sup_pid([], _QueuePid) ->
-    undefined.
-
-%% -------------------------------------------------------------------
-%% Policy helpers.
-%% -------------------------------------------------------------------
-
-set_policy(Config, Node, Name, Pattern, ApplyTo, Definition) ->
-    ok = rpc(Config, Node,
-      rabbit_policy, set, [<<"/">>, Name, Pattern, Definition, 0, ApplyTo]).
-
-clear_policy(Config, Node, Name) ->
-    ok = rpc(Config, Node,
-      rabbit_policy, delete, [<<"/">>, Name]).
-
-set_ha_policy(Config, Node, Pattern, Policy) ->
-    set_ha_policy(Config, Node, Pattern, Policy, []).
-
-set_ha_policy(Config, Node, Pattern, Policy, Extra) ->
-    set_policy(Config, Node, Pattern, Pattern, <<"queues">>,
-      ha_policy(Policy) ++ Extra).
-
-ha_policy(<<"all">>)      -> [{<<"ha-mode">>,   <<"all">>}];
-ha_policy({Mode, Params}) -> [{<<"ha-mode">>,   Mode},
-                              {<<"ha-params">>, Params}].
-
-set_ha_policy_all(Config) ->
-    set_ha_policy(Config, 0, <<".*">>, <<"all">>),
-    Config.
-
-set_ha_policy_two_pos(Config) ->
-    Members = [
-      rabbit_misc:atom_to_binary(N)
-      || N <- get_node_configs(Config, nodename)],
-    TwoNodes = [M || M <- lists:sublist(Members, 2)],
-    set_ha_policy(Config, 0, <<"^ha.two.">>, {<<"nodes">>, TwoNodes},
-                  [{<<"ha-promote-on-shutdown">>, <<"always">>}]),
-    set_ha_policy(Config, 0, <<"^ha.auto.">>, {<<"nodes">>, TwoNodes},
-                  [{<<"ha-sync-mode">>,           <<"automatic">>},
-                   {<<"ha-promote-on-shutdown">>, <<"always">>}]),
-    Config.
-
-set_ha_policy_two_pos_batch_sync(Config) ->
-    Members = [
-      rabbit_misc:atom_to_binary(N)
-      || N <- get_node_configs(Config, nodename)],
-    TwoNodes = [M || M <- lists:sublist(Members, 2)],
-    set_ha_policy(Config, 0, <<"^ha.two.">>, {<<"nodes">>, TwoNodes},
-                  [{<<"ha-promote-on-shutdown">>, <<"always">>}]),
-    set_ha_policy(Config, 0, <<"^ha.auto.">>, {<<"nodes">>, TwoNodes},
-                  [{<<"ha-sync-mode">>,           <<"automatic">>},
-                   {<<"ha-sync-batch-size">>,     200},
-                   {<<"ha-promote-on-shutdown">>, <<"always">>}]),
-    Config.
-
-%% -------------------------------------------------------------------
-%% Parameter helpers.
-%% -------------------------------------------------------------------
-
-set_parameter(Config, Node, Component, Name, Value) ->
-    ok = rpc(Config, Node,
-      rabbit_runtime_parameters, set, [<<"/">>, Component, Name, Value, none]).
-
-clear_parameter(Config, Node, Component, Name) ->
-    ok = rpc(Config, Node,
-      rabbit_runtime_parameters, clear, [<<"/">>, Component, Name]).
-
-%% -------------------------------------------------------------------
-%% Parameter helpers.
-%% -------------------------------------------------------------------
-
-enable_plugin(Config, Node, Plugin) ->
-    plugin_action(Config, Node, enable, [Plugin], []).
-
-disable_plugin(Config, Node, Plugin) ->
-    plugin_action(Config, Node, disable, [Plugin], []).
-
-plugin_action(Config, Node, Command, Args, Opts) ->
-    PluginsFile = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      enabled_plugins_file),
-    PluginsDir = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      plugins_dir),
-    Nodename = rabbit_ct_broker_helpers:get_node_config(Config, Node,
-      nodename),
-    rabbit_ct_broker_helpers:rpc(Config, Node,
-      rabbit_plugins_main, action,
-      [Command, Nodename, Args, Opts, PluginsFile, PluginsDir]).
-
-%% -------------------------------------------------------------------
-
-test_channel() ->
-    Me = self(),
-    Writer = spawn(fun () -> test_writer(Me) end),
-    {ok, Limiter} = rabbit_limiter:start_link(no_id),
-    {ok, Ch} = rabbit_channel:start_link(
-                 1, Me, Writer, Me, "", rabbit_framing_amqp_0_9_1,
-                 user(<<"guest">>), <<"/">>, [], Me, Limiter),
-    {Writer, Limiter, Ch}.
-
-test_writer(Pid) ->
-    receive
-        {'$gen_call', From, flush} -> gen_server:reply(From, ok),
-                                      test_writer(Pid);
-        {send_command, Method}     -> Pid ! Method,
-                                      test_writer(Pid);
-        shutdown                   -> ok
-    end.
-
-user(Username) ->
-    #user{username       = Username,
-          tags           = [administrator],
-          authz_backends = [{rabbit_auth_backend_internal, none}]}.
diff --git a/rabbitmq-server/deps/rabbit_common/src/rabbit_ct_helpers.erl b/rabbitmq-server/deps/rabbit_common/src/rabbit_ct_helpers.erl
deleted file mode 100644 (file)
index ece6fe1..0000000
+++ /dev/null
@@ -1,537 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_ct_helpers).
-
--include_lib("common_test/include/ct.hrl").
-
--export([
-    log_environment/0,
-    run_steps/2,
-    run_setup_steps/1, run_setup_steps/2,
-    run_teardown_steps/1, run_teardown_steps/2,
-    ensure_application_srcdir/3,
-    start_long_running_testsuite_monitor/1,
-    stop_long_running_testsuite_monitor/1,
-    config_to_testcase_name/2,
-    testcases/1,
-    testcase_number/3,
-    testcase_absname/2, testcase_absname/3,
-    testcase_started/2, testcase_finished/2,
-    exec/1, exec/2,
-    make/3,
-    get_config/2, set_config/2,
-    merge_app_env/2, merge_app_env_in_erlconf/2,
-    cover_work_factor/2
-  ]).
-
--define(SSL_CERT_PASSWORD, "test").
-
-%% -------------------------------------------------------------------
-%% Testsuite internal helpers.
-%% -------------------------------------------------------------------
-
-log_environment() ->
-    Vars = lists:sort(fun(A, B) -> A =< B end, os:getenv()),
-    ct:pal(?LOW_IMPORTANCE, "Environment variables:~n~s", [
-        [io_lib:format("  ~s~n", [V]) || V <- Vars]]).
-
-run_setup_steps(Config) ->
-    run_setup_steps(Config, []).
-
-run_setup_steps(Config, ExtraSteps) ->
-    Steps = [
-      fun ensure_current_srcdir/1,
-      fun ensure_rabbit_common_srcdir/1,
-      fun ensure_erlang_mk_depsdir/1,
-      fun ensure_rabbit_srcdir/1,
-      fun ensure_make_cmd/1,
-      fun ensure_erl_call_cmd/1,
-      fun ensure_rabbitmqctl_cmd/1,
-      fun ensure_ssl_certs/1,
-      fun start_long_running_testsuite_monitor/1
-    ],
-    run_steps(Config, Steps ++ ExtraSteps).
-
-run_teardown_steps(Config) ->
-    run_teardown_steps(Config, []).
-
-run_teardown_steps(Config, ExtraSteps) ->
-    Steps = [
-      fun stop_long_running_testsuite_monitor/1
-    ],
-    run_steps(Config, ExtraSteps ++ Steps).
-
-run_steps(Config, [Step | Rest]) ->
-    case Step(Config) of
-        {skip, _} = Error -> Error;
-        Config1           -> run_steps(Config1, Rest)
-    end;
-run_steps(Config, []) ->
-    Config.
-
-ensure_current_srcdir(Config) ->
-    Path = case get_config(Config, current_srcdir) of
-        undefined ->
-            os:getenv("PWD");
-        P ->
-            P
-    end,
-    case filelib:is_dir(Path) of
-        true  -> set_config(Config, {current_srcdir, Path});
-        false -> {skip,
-                  "Current source directory required, " ++
-                  "please set 'current_srcdir' in ct config"}
-    end.
-
-ensure_rabbit_common_srcdir(Config) ->
-    Path = case get_config(Config, rabbit_common_srcdir) of
-        undefined ->
-            filename:dirname(
-              filename:dirname(
-                code:which(?MODULE)));
-        P ->
-            P
-    end,
-    case filelib:is_dir(Path) of
-        true  -> set_config(Config, {rabbit_common_srcdir, Path});
-        false -> {skip,
-                  "rabbit_common source directory required, " ++
-                  "please set 'rabbit_common_srcdir' in ct config"}
-    end.
-
-ensure_erlang_mk_depsdir(Config) ->
-    Path = case get_config(Config, erlang_mk_depsdir) of
-        undefined ->
-            case os:getenv("DEPS_DIR") of
-                false ->
-                    %% Try the common locations.
-                    SrcDir = ?config(rabbit_common_srcdir, Config),
-                    Ds = [
-                      filename:join(SrcDir, "deps"),
-                      filename:join(SrcDir, "../../deps")
-                    ],
-                    case lists:filter(fun filelib:is_dir/1, Ds) of
-                        [P |_] -> P;
-                        []     -> false
-                    end;
-                P ->
-                    P
-            end;
-        P ->
-            P
-    end,
-    case Path =/= false andalso filelib:is_dir(Path) of
-        true  -> set_config(Config, {erlang_mk_depsdir, Path});
-        false -> {skip,
-                  "deps directory required, " ++
-                  "please set DEPSD_DIR or 'erlang_mk_depsdir' " ++
-                  "in ct config"}
-    end.
-
-ensure_rabbit_srcdir(Config) ->
-    ensure_application_srcdir(Config, rabbit, rabbit).
-
-ensure_application_srcdir(Config, App, Module) ->
-    AppS = atom_to_list(App),
-    Key = list_to_atom(AppS ++ "_srcdir"),
-    Path = case get_config(Config, Key) of
-        undefined ->
-            case code:which(Module) of
-                non_existing ->
-                    filename:join(?config(rabbit_common_srcdir, Config), AppS);
-                P ->
-                    filename:dirname(
-                      filename:dirname(P))
-            end;
-        P ->
-            P
-    end,
-    case filelib:is_dir(Path) of
-        true  -> set_config(Config, {Key, Path});
-        false -> {skip,
-                  AppS ++ "source directory required, " ++
-                  "please set '" ++ AppS ++ "_srcdir' in ct config"}
-    end.
-
-ensure_make_cmd(Config) ->
-    Make = case get_config(Config, make_cmd) of
-        undefined ->
-            case os:getenv("MAKE") of
-                false -> "make";
-                M     -> M
-            end;
-        M ->
-            M
-    end,
-    Cmd = [Make, "--version"],
-    case exec(Cmd, [{match_stdout, "GNU Make"}]) of
-        {ok, _} -> set_config(Config, {make_cmd, Make});
-        _       -> {skip,
-                    "GNU Make required, " ++
-                    "please set MAKE or 'make_cmd' in ct config"}
-    end.
-
-ensure_erl_call_cmd(Config) ->
-    ErlCallDir = code:lib_dir(erl_interface, bin),
-    ErlCall = filename:join(ErlCallDir, "erl_call"),
-    Cmd = [ErlCall],
-    case exec(Cmd, [{match_stdout, "Usage: "}]) of
-        {ok, _} -> set_config(Config, {erl_call_cmd, ErlCall});
-        _       -> {skip,
-                    "erl_call required, " ++
-                    "please set ERL_CALL or 'erl_call_cmd' in ct config"}
-    end.
-
-ensure_rabbitmqctl_cmd(Config) ->
-    Rabbitmqctl = case get_config(Config, rabbitmqctl_cmd) of
-        undefined ->
-            case os:getenv("RABBITMQCTL") of
-                false ->
-                    SrcDir = ?config(rabbit_srcdir, Config),
-                    R = filename:join(SrcDir, "scripts/rabbitmqctl"),
-                    case filelib:is_file(R) of
-                        true  -> R;
-                        false -> false
-                    end;
-                R ->
-                    R
-            end;
-        R ->
-            R
-    end,
-    Error = {skip, "rabbitmqctl required, " ++
-             "please set RABBITMQCTL or 'rabbitmqctl_cmd' in ct config"},
-    case Rabbitmqctl of
-        false ->
-            Error;
-        _ ->
-            Cmd = [Rabbitmqctl],
-            case exec(Cmd, [drop_stdout]) of
-                {error, 64, _} ->
-                    set_config(Config, {rabbitmqctl_cmd, Rabbitmqctl});
-                _ ->
-                    Error
-            end
-    end.
-
-ensure_ssl_certs(Config) ->
-    SrcDir = ?config(rabbit_common_srcdir, Config),
-    CertsMakeDir = filename:join([SrcDir, "tools", "tls-certs"]),
-    PrivDir = ?config(priv_dir, Config),
-    CertsDir = filename:join(PrivDir, "certs"),
-    CertsPwd = proplists:get_value(rmq_certspwd, Config, ?SSL_CERT_PASSWORD),
-    Cmd = [
-      "PASSWORD=" ++ CertsPwd,
-      "DIR=" ++ CertsDir],
-    case make(Config, CertsMakeDir, Cmd) of
-        {ok, _} ->
-            %% Add SSL certs to the broker configuration.
-            Config1 = merge_app_env(Config,
-              {rabbit, [
-                  {ssl_options, [
-                      {cacertfile, filename:join([CertsDir, "testca", "cacert.pem"])},
-                      {certfile, filename:join([CertsDir, "server", "cert.pem"])},
-                      {keyfile, filename:join([CertsDir, "server", "key.pem"])},
-                      {verify, verify_peer},
-                      {fail_if_no_peer_cert, true}
-                    ]}]}),
-            set_config(Config1, {rmq_certsdir, CertsDir});
-        _ ->
-            {skip, "Failed to create SSL certificates"}
-    end.
-
-%% -------------------------------------------------------------------
-%% Process to log a message every minute during long testcases.
-%% -------------------------------------------------------------------
-
--define(PING_CT_INTERVAL, 60 * 1000). %% In milliseconds.
-
-start_long_running_testsuite_monitor(Config) ->
-    Pid = spawn(
-      fun() ->
-          {ok, TimerRef} = timer:send_interval(?PING_CT_INTERVAL, ping_ct),
-          long_running_testsuite_monitor(TimerRef, [])
-      end),
-    set_config(Config, {long_running_testsuite_monitor, Pid}).
-
-stop_long_running_testsuite_monitor(Config) ->
-    ?config(long_running_testsuite_monitor, Config) ! stop,
-    Config.
-
-long_running_testsuite_monitor(TimerRef, Testcases) ->
-    receive
-        {started, Testcase} ->
-            Testcases1 = [{Testcase, time_compat:monotonic_time(seconds)}
-                          | Testcases],
-            long_running_testsuite_monitor(TimerRef, Testcases1);
-        {finished, Testcase} ->
-            Testcases1 = proplists:delete(Testcase, Testcases),
-            long_running_testsuite_monitor(TimerRef, Testcases1);
-        ping_ct ->
-            T1 = time_compat:monotonic_time(seconds),
-            ct:pal(?STD_IMPORTANCE, "Testcases still in progress:~s",
-              [[
-                  begin
-                      TDiff = format_time_diff(T1, T0),
-                      rabbit_misc:format("~n - ~s (~s)", [TC, TDiff])
-                  end
-                  || {TC, T0} <- Testcases
-                ]]),
-            long_running_testsuite_monitor(TimerRef, Testcases);
-        stop ->
-            timer:cancel(TimerRef)
-    end.
-
-format_time_diff(T1, T0) ->
-    Diff = T1 - T0,
-    Hours = Diff div 3600,
-    Diff1 = Diff rem 3600,
-    Minutes = Diff1 div 60,
-    Seconds = Diff1 rem 60,
-    rabbit_misc:format("~b:~2..0b:~2..0b", [Hours, Minutes, Seconds]).
-
-testcase_started(Config, Testcase) ->
-    Testcase1 = config_to_testcase_name(Config, Testcase),
-    ?config(long_running_testsuite_monitor, Config) ! {started, Testcase1},
-    Config.
-
-testcase_finished(Config, Testcase) ->
-    Testcase1 = config_to_testcase_name(Config, Testcase),
-    ?config(long_running_testsuite_monitor, Config) ! {finished, Testcase1},
-    Config.
-
-config_to_testcase_name(Config, Testcase) ->
-    testcase_absname(Config, Testcase).
-
-testcase_absname(Config, Testcase) ->
-    testcase_absname(Config, Testcase, "/").
-
-testcase_absname(Config, Testcase, Sep) ->
-    Name = rabbit_misc:format("~s", [Testcase]),
-    case get_config(Config, tc_group_properties) of
-        [] ->
-            Name;
-        Props ->
-            Name1 = case Name of
-                "" ->
-                    rabbit_misc:format("~s",
-                      [proplists:get_value(name, Props)]);
-                _ ->
-                    rabbit_misc:format("~s~s~s",
-                      [proplists:get_value(name, Props), Sep, Name])
-            end,
-            testcase_absname1(Name1,
-              get_config(Config, tc_group_path), Sep)
-    end.
-
-testcase_absname1(Name, [Props | Rest], Sep) ->
-    Name1 = rabbit_misc:format("~s~s~s",
-      [proplists:get_value(name, Props), Sep, Name]),
-    testcase_absname1(Name1, Rest, Sep);
-testcase_absname1(Name, [], _) ->
-    lists:flatten(Name).
-
-testcases(Testsuite) ->
-    All = Testsuite:all(),
-    testcases1(Testsuite, All, [], []).
-
-testcases1(Testsuite, [{group, GroupName} | Rest], CurrentPath, Testcases) ->
-    Group = {GroupName, _, _} = lists:keyfind(GroupName, 1, Testsuite:groups()),
-    testcases1(Testsuite, [Group | Rest], CurrentPath, Testcases);
-testcases1(Testsuite, [{GroupName, _, Children} | Rest],
-  CurrentPath, Testcases) ->
-    Testcases1 = testcases1(Testsuite, Children,
-      [[{name, GroupName}] | CurrentPath], Testcases),
-    testcases1(Testsuite, Rest, CurrentPath, Testcases1);
-testcases1(Testsuite, [Testcase | Rest], CurrentPath, Testcases)
-when is_atom(Testcase) ->
-    {Props, Path} = case CurrentPath of
-        []      -> {[], []};
-        [H | T] -> {H, T}
-    end,
-    Name = config_to_testcase_name([
-        {tc_group_properties, Props},
-        {tc_group_path, Path}
-      ], Testcase),
-    testcases1(Testsuite, Rest, CurrentPath, [Name | Testcases]);
-testcases1(_, [], [], Testcases) ->
-    lists:reverse(Testcases);
-testcases1(_, [], _, Testcases) ->
-    Testcases.
-
-testcase_number(Config, TestSuite, TestName) ->
-    Testcase = config_to_testcase_name(Config, TestName),
-    Testcases = testcases(TestSuite),
-    testcase_number1(Testcases, Testcase, 0).
-
-testcase_number1([Testcase | _], Testcase, N) ->
-    N;
-testcase_number1([_ | Rest], Testcase, N) ->
-    testcase_number1(Rest, Testcase, N + 1);
-testcase_number1([], _, N) ->
-    N.
-
-%% -------------------------------------------------------------------
-%% Helpers for helpers.
-%% -------------------------------------------------------------------
-
-exec(Cmd) ->
-    exec(Cmd, []).
-
-exec([Cmd | Args], Options) when is_list(Cmd) orelse is_binary(Cmd) ->
-    Cmd1 = case (lists:member($/, Cmd) orelse lists:member($\\, Cmd)) of
-        true ->
-            Cmd;
-        false ->
-            case os:find_executable(Cmd) of
-                false -> Cmd;
-                Path  -> Path
-            end
-    end,
-    Args1 = [format_arg(Arg) || Arg <- Args],
-    {LocalOptions, PortOptions} = lists:partition(
-      fun
-          ({match_stdout, _}) -> true;
-          (drop_stdout)       -> true;
-          (_)                 -> false
-      end, Options),
-    PortOptions1 = case lists:member(nouse_stdio, PortOptions) of
-        true  -> PortOptions;
-        false -> [use_stdio, stderr_to_stdout | PortOptions]
-    end,
-    Log = "+ ~s (pid ~p)",
-    {PortOptions2, Log1} = case proplists:get_value(env, PortOptions1) of
-        undefined ->
-            {PortOptions1, Log};
-        Env ->
-            Env1 = [
-              begin
-                  Key1 = format_arg(Key),
-                  Value1 = format_arg(Value),
-                  {Key1, Value1}
-              end
-              || {Key, Value} <- Env
-            ],
-            {
-              [{env, Env1} | proplists:delete(env, PortOptions1)],
-              Log ++ "~n~nEnvironment variables:~n" ++
-              string:join(
-                [rabbit_misc:format("  ~s=~s", [K, V]) || {K, V} <- Env1],
-                "~n")
-            }
-    end,
-    ct:pal(?LOW_IMPORTANCE, Log1, [string:join([Cmd1 | Args1], " "), self()]),
-    try
-        Port = erlang:open_port(
-          {spawn_executable, Cmd1}, [
-            {args, Args1},
-            exit_status
-            | PortOptions2]),
-        port_receive_loop(Port, "", LocalOptions)
-    catch
-        error:Reason ->
-            ct:pal(?LOW_IMPORTANCE, "~s: ~s",
-              [Cmd1, file:format_error(Reason)]),
-            {error, Reason, file:format_error(Reason)}
-    end.
-
-format_arg({Format, FormatArgs}) ->
-    rabbit_misc:format(Format, FormatArgs);
-format_arg(Arg) when is_atom(Arg) ->
-    atom_to_list(Arg);
-format_arg(Arg) when is_binary(Arg) ->
-    binary_to_list(Arg);
-format_arg(Arg) ->
-    Arg.
-
-port_receive_loop(Port, Stdout, Options) ->
-    receive
-        {Port, {exit_status, X}} ->
-            DropStdout = lists:member(drop_stdout, Options) orelse
-              Stdout =:= "",
-            if
-                DropStdout ->
-                    ct:pal(?LOW_IMPORTANCE, "Exit code: ~p (pid ~p)",
-                      [X, self()]);
-                true ->
-                    ct:pal(?LOW_IMPORTANCE, "~s~nExit code: ~p (pid ~p)",
-                      [Stdout, X, self()])
-            end,
-            case proplists:get_value(match_stdout, Options) of
-                undefined ->
-                    case X of
-                        0 -> {ok, Stdout};
-                        _ -> {error, X, Stdout}
-                    end;
-                RE ->
-                    case re:run(Stdout, RE, [{capture, none}]) of
-                        match   -> {ok, Stdout};
-                        nomatch -> {error, X, Stdout}
-                    end
-            end;
-        {Port, {data, Out}} ->
-            port_receive_loop(Port, Stdout ++ Out, Options)
-    end.
-
-make(Config, Dir, Args) ->
-    Make = ?config(make_cmd, Config),
-    Verbosity = case os:getenv("V") of
-        false -> [];
-        V     -> ["V=" ++ V]
-    end,
-    Cmd = [Make, "-C", Dir] ++ Verbosity ++ Args,
-    exec(Cmd).
-
-%% This is the same as ?config(), except this one doesn't log a warning
-%% if the key is missing.
-get_config(Config, Key) ->
-    proplists:get_value(Key, Config).
-
-set_config(Config, Tuple) when is_tuple(Tuple) ->
-    Key = element(1, Tuple),
-    lists:keystore(Key, 1, Config, Tuple);
-set_config(Config, [Tuple | Rest]) ->
-    Config1 = set_config(Config, Tuple),
-    set_config(Config1, Rest);
-set_config(Config, []) ->
-    Config.
-
-merge_app_env(Config, Env) ->
-    ErlangConfig = proplists:get_value(erlang_node_config, Config, []),
-    ErlangConfig1 = merge_app_env_in_erlconf(ErlangConfig, Env),
-    set_config(Config, {erlang_node_config, ErlangConfig1}).
-
-merge_app_env_in_erlconf(ErlangConfig, {App, Env}) ->
-    AppConfig = proplists:get_value(App, ErlangConfig, []),
-    AppConfig1 = lists:foldl(
-      fun({Key, _} = Tuple, AC) ->
-          lists:keystore(Key, 1, AC, Tuple)
-      end, AppConfig, Env),
-    lists:keystore(App, 1, ErlangConfig, {App, AppConfig1});
-merge_app_env_in_erlconf(ErlangConfig, [Env | Rest]) ->
-    ErlangConfig1 = merge_app_env_in_erlconf(ErlangConfig, Env),
-    merge_app_env_in_erlconf(ErlangConfig1, Rest);
-merge_app_env_in_erlconf(ErlangConfig, []) ->
-    ErlangConfig.
-
-%% -------------------------------------------------------------------
-%% Cover-related functions.
-%% -------------------------------------------------------------------
-
-%% TODO.
-cover_work_factor(_Config, Without) ->
-    Without.
diff --git a/rabbitmq-server/deps/rabbit_common/tools/tls-certs/Makefile b/rabbitmq-server/deps/rabbit_common/tools/tls-certs/Makefile
deleted file mode 100644 (file)
index 7799587..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-ifndef DIR
-$(error DIR must be specified)
-endif
-
-PASSWORD ?= changeme
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-openssl_output_0 = 2>/dev/null
-openssl_output = $(openssl_output_$(V))
-
-.PRECIOUS: %/testca/cacert.pem
-.PHONY: all testca server client clean
-
-all: server client
-       @:
-
-testca: $(DIR)/testca/cacert.pem
-
-server: TARGET = server
-server: $(DIR)/server/cert.pem
-       @:
-
-client: TARGET = client
-client: $(DIR)/client/cert.pem
-       @:
-
-$(DIR)/testca/cacert.pem:
-       $(gen_verbose) mkdir -p $(dir $@)
-       $(verbose) { ( cd $(dir $@) && \
-           mkdir -p certs private && \
-           chmod 700 private && \
-           echo 01 > serial && \
-           :> index.txt && \
-           openssl req -x509 -config $(CURDIR)/openssl.cnf -newkey rsa:2048 -days 365 \
-             -out cacert.pem -outform PEM -subj /CN=MyTestCA/L=$$$$/ -nodes && \
-           openssl x509 -in cacert.pem -out cacert.cer -outform DER ) $(openssl_output) \
-         || (rm -rf $(dir $@) && false); }
-
-$(DIR)/%/cert.pem: $(DIR)/testca/cacert.pem
-       $(gen_verbose) mkdir -p $(DIR)/$(TARGET)
-       $(verbose) { ( cd $(DIR)/$(TARGET) && \
-           openssl genrsa -out key.pem 2048 &&\
-           openssl req -new -key key.pem -out req.pem -outform PEM\
-               -subj /CN=$$(hostname)/O=$(TARGET)/L=$$$$/ -nodes &&\
-           cd ../testca && \
-           openssl ca -config $(CURDIR)/openssl.cnf -in ../$(TARGET)/req.pem -out \
-             ../$(TARGET)/cert.pem -notext -batch -extensions \
-             $(TARGET)_ca_extensions && \
-           cd ../$(TARGET) && \
-           openssl pkcs12 -export -out keycert.p12 -in cert.pem -inkey key.pem \
-           -passout pass:$(PASSWORD) ) $(openssl_output) || (rm -rf $(DIR)/$(TARGET) && false); }
-
-clean:
-       rm -rf $(DIR)/testca
-       rm -rf $(DIR)/server
-       rm -rf $(DIR)/client
diff --git a/rabbitmq-server/deps/rabbit_common/tools/tls-certs/openssl.cnf b/rabbitmq-server/deps/rabbit_common/tools/tls-certs/openssl.cnf
deleted file mode 100644 (file)
index 93ffb2f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-[ ca ]
-default_ca = testca
-
-[ testca ]
-dir = .
-certificate = $dir/cacert.pem
-database = $dir/index.txt
-new_certs_dir = $dir/certs
-private_key = $dir/private/cakey.pem
-serial = $dir/serial
-
-default_crl_days = 7
-default_days = 365
-default_md = sha1
-
-policy = testca_policy
-x509_extensions = certificate_extensions
-
-[ testca_policy ]
-commonName = supplied
-stateOrProvinceName = optional
-countryName = optional
-emailAddress = optional
-organizationName = optional
-organizationalUnitName = optional
-domainComponent = optional
-
-[ certificate_extensions ]
-basicConstraints = CA:false
-
-[ req ]
-default_bits = 2048
-default_keyfile = ./private/cakey.pem
-default_md = sha1
-prompt = yes
-distinguished_name = root_ca_distinguished_name
-x509_extensions = root_ca_extensions
-
-[ root_ca_distinguished_name ]
-commonName = hostname
-
-[ root_ca_extensions ]
-basicConstraints = CA:true
-keyUsage = keyCertSign, cRLSign
-
-[ client_ca_extensions ]
-basicConstraints = CA:false
-keyUsage = digitalSignature
-extendedKeyUsage = 1.3.6.1.5.5.7.3.2
-
-[ server_ca_extensions ]
-basicConstraints = CA:false
-keyUsage = keyEncipherment
-extendedKeyUsage = 1.3.6.1.5.5.7.3.1
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE.erl b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE.erl
deleted file mode 100644 (file)
index 85fc6d7..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Federation.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(system_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("rabbit_common/include/rabbit_framing.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, dotnet},
-      {group, java}
-    ].
-
-groups() ->
-    [
-      {dotnet, [], [
-          roundtrip,
-          default_outcome,
-          outcomes,
-          fragmentation,
-          message_annotations,
-          footer,
-          data_types,
-          %% TODO at_most_once,
-          reject,
-          redelivery,
-          routing,
-          invalid_routes
-        ]},
-      {java, [], [
-          roundtrip,
-          message_annotations,
-          footer
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config.
-
-end_per_suite(Config) ->
-    Config.
-
-init_per_group(Group, Config) ->
-    Suffix = rabbit_ct_helpers:testcase_absname(Config, "", "-"),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, Suffix},
-        {amqp10_client_library, Group}
-      ]),
-    GroupSetupStep = case Group of
-        dotnet -> fun build_dotnet_test_project/1;
-        java   -> fun build_maven_test_project/1
-    end,
-    rabbit_ct_helpers:run_setup_steps(Config1, [
-        GroupSetupStep
-      ] ++
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_group(_, Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-build_dotnet_test_project(Config) ->
-    TestProjectDir = filename:join(
-      [?config(data_dir, Config), "dotnet-tests"]),
-    Ret = rabbit_ct_helpers:exec(["dotnet", "restore"],
-      [{cd, TestProjectDir}]),
-    case Ret of
-        {ok, _} ->
-            rabbit_ct_helpers:set_config(Config,
-              {dotnet_test_project_dir, TestProjectDir});
-        _ ->
-            {skip, "Failed to fetch .NET Core test project dependencies"}
-    end.
-
-build_maven_test_project(Config) ->
-    TestProjectDir = filename:join([?config(data_dir, Config), "java-tests"]),
-    Ret = rabbit_ct_helpers:exec(["mvn", "test-compile"],
-      [{cd, TestProjectDir}]),
-    case Ret of
-        {ok, _} ->
-            rabbit_ct_helpers:set_config(Config,
-              {maven_test_project_dir, TestProjectDir});
-        _ ->
-            {skip, "Failed to build Maven test project"}
-    end.
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-roundtrip(Config) ->
-    run(Config, [
-        {dotnet, "roundtrip"},
-        {java, "RoundTripTest"}
-      ]).
-
-default_outcome(Config) ->
-    run(Config, [
-        {dotnet, "default_outcome"}
-      ]).
-
-outcomes(Config) ->
-    run(Config, [
-        {dotnet, "outcomes"}
-      ]).
-
-fragmentation(Config) ->
-    run(Config, [
-        {dotnet, "fragmentation"}
-      ]).
-
-message_annotations(Config) ->
-    run(Config, [
-        {dotnet, "message_annotations"},
-        {java, "MessageAnnotationsTest"}
-      ]).
-
-footer(Config) ->
-    run(Config, [
-        {dotnet, "footer"},
-        {java, "FooterTest"}
-      ]).
-
-data_types(Config) ->
-    run(Config, [
-        {dotnet, "data_types"}
-      ]).
-
-%% at_most_once(Config) ->
-%%     run(Config, [
-%%       ]).
-
-reject(Config) ->
-    run(Config, [
-        {dotnet, "reject"}
-      ]).
-
-redelivery(Config) ->
-    run(Config, [
-        {dotnet, "redelivery"}
-      ]).
-
-routing(Config) ->
-    Ch = rabbit_ct_client_helpers:open_channel(Config, 0),
-    amqp_channel:call(Ch, #'queue.declare'{queue   = <<"transient_q">>,
-                                           durable = false}),
-    amqp_channel:call(Ch, #'queue.declare'{queue   = <<"durable_q">>,
-                                           durable = true}),
-    amqp_channel:call(Ch, #'queue.declare'{queue       = <<"autodel_q">>,
-                                           auto_delete = true}),
-    run(Config, [
-        {dotnet, "routing"}
-      ]).
-
-invalid_routes(Config) ->
-    run(Config, [
-        {dotnet, "invalid_routes"}
-      ]).
-
-run(Config, Flavors) ->
-    ClientLibrary = ?config(amqp10_client_library, Config),
-    Fun = case ClientLibrary of
-        dotnet -> fun run_dotnet_test/2;
-        java   -> fun run_java_test/2
-    end,
-    case proplists:get_value(ClientLibrary, Flavors) of
-        false    -> ok;
-        TestName -> Fun(Config, TestName)
-    end.
-
-run_dotnet_test(Config, Method) ->
-    TestProjectDir = ?config(dotnet_test_project_dir, Config),
-    Ret = rabbit_ct_helpers:exec([
-        "dotnet",
-        "test",
-        %% TODO `--params` is not supported by dotnet-test-nunit
-        %% 3.4.0-beta-1.
-        %% "--params", {"rmq_broker_uri=~s",
-        %%   [rabbit_ct_broker_helpers:node_uri(Config, 0)]},
-        "--where", {"method == ~s", [Method]},
-        "--noresult"
-      ],
-      [
-        {cd, TestProjectDir},
-        {env, [
-            {"RMQ_BROKER_URI", rabbit_ct_broker_helpers:node_uri(Config, 0)}
-          ]}
-      ]),
-    {ok, _} = Ret.
-
-run_java_test(Config, Class) ->
-    TestProjectDir = ?config(maven_test_project_dir, Config),
-    Ret = rabbit_ct_helpers:exec([
-        "mvn",
-        "test",
-        {"-Dtest=~s", [Class]},
-        {"-Drmq_broker_uri=~s", [rabbit_ct_broker_helpers:node_uri(Config, 0)]}
-      ],
-      [{cd, TestProjectDir}]),
-    {ok, _} = Ret.
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/dotnet-tests/project.json b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/dotnet-tests/project.json
deleted file mode 100644 (file)
index 7073181..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "version": "1.0.0-*",
-  "buildOptions": {
-    "debugType": "portable",
-    "emitEntryPoint": false
-  },
-
-  "dependencies": {},
-
-  "frameworks": {
-    "netcoreapp1.0": {
-      "dependencies": {
-        "Microsoft.NETCore.App": {
-          "type": "platform",
-          "version": "1.0.0"
-        },
-       "NUnit": "3.4.0",
-       "dotnet-test-nunit": "3.4.0-beta-1",
-       "AmqpNetLite": "1.1.9-rc"
-      },
-      "imports": "dnxcore50"
-    }
-  },
-
-  "testRunner": "nunit"
-}
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/dotnet-tests/src/testsuite.cs b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/dotnet-tests/src/testsuite.cs
deleted file mode 100644 (file)
index c2dfea1..0000000
+++ /dev/null
@@ -1,499 +0,0 @@
-// vim:sw=4:et:
-
-using NUnit.Framework;
-
-using System;
-using System.Linq;
-using System.Threading;
-
-using Amqp;
-using Amqp.Framing;
-using Amqp.Types;
-
-namespace RabbitMQ.Amqp10
-{
-    [TestFixture]
-    public class Testsuite
-    {
-        [Test]
-        public void roundtrip()
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "roundtrip-q");
-
-            Message message1 = new Message("Testing roundtrip");
-            sender.Send(message1);
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "roundtrip-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-            receiver.Accept(message2);
-
-            sender.Close();
-            receiver.Close();
-            session.Close();
-            connection.Close();
-
-            Assert.That(message2.GetBody<string>(),
-              Is.EqualTo(message1.GetBody<string>()));
-        }
-
-        [TestCase("amqp:accepted:list", null)]
-        [TestCase("amqp:rejected:list", null)]
-        [TestCase("amqp:released:list", null)]
-        public void default_outcome(string default_outcome, string condition)
-        {
-            Outcome default_outcome_obj = null;
-            switch (default_outcome) {
-                case "amqp:accepted:list":
-                           default_outcome_obj = new Accepted();
-                           break;
-                case "amqp:rejected:list":
-                           default_outcome_obj = new Rejected();
-                           break;
-                case "amqp:released:list":
-                           default_outcome_obj = new Released();
-                           break;
-                case "amqp:modified:list":
-                           default_outcome_obj = new Modified();
-                           break;
-            }
-
-            Attach attach = new Attach() {
-                Source = new Source() {
-                  Address = "default_outcome-q",
-                  DefaultOutcome = default_outcome_obj
-                },
-                Target = new Target()
-              };
-
-            do_test_outcomes(attach, condition);
-        }
-
-        [TestCase("amqp:accepted:list", null)]
-        [TestCase("amqp:rejected:list", null)]
-        [TestCase("amqp:released:list", null)]
-        [TestCase("amqp:modified:list", "amqp:not-implemented")]
-        public void outcomes(string outcome, string condition)
-        {
-            Attach attach = new Attach() {
-                Source = new Source() {
-                  Address = "outcomes-q",
-                  Outcomes = new Symbol[] { new Symbol(outcome) }
-                },
-                Target = new Target()
-              };
-
-            do_test_outcomes(attach, condition);
-        }
-
-        internal void do_test_outcomes(Attach attach, string condition)
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-
-            ManualResetEvent mre = new ManualResetEvent(false);
-            string error_name = null;
-
-            OnAttached attached = (Link link, Attach _attach) => {
-                error_name = null;
-                mre.Set();
-            };
-
-            ClosedCallback closed = (AmqpObject amqp_obj, Error error) => {
-                error_name = error.Condition;
-                mre.Set();
-            };
-            session.Closed = closed;
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", attach, attached);
-
-            mre.WaitOne();
-            if (condition == null) {
-                Assert.That(error_name, Is.Null);
-
-                session.Closed = null;
-                receiver.Close();
-                session.Close();
-            } else {
-                Assert.That(error_name, Is.EqualTo(condition));
-            }
-
-            connection.Close();
-        }
-
-        [TestCase(512U, 512U)]
-        [TestCase(512U, 600U)]
-        [TestCase(512U, 1024U)]
-        [TestCase(1024U, 1024U)]
-        public void fragmentation(uint frame_size, uint payload_size)
-        {
-            string uri = get_broker_uri();
-            Address address = new Address(uri);
-
-            Open open = new Open()
-            {
-                ContainerId = Guid.NewGuid().ToString(),
-                HostName = address.Host,
-                ChannelMax = 256,
-                MaxFrameSize = frame_size
-            };
-
-            Connection connection = new Connection(address, null, open, null);
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "fragmentation-q");
-
-            Message message1 = new Message(String.Concat(
-              Enumerable.Repeat("a", (int)payload_size)));
-            sender.Send(message1);
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "fragmentation-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-            receiver.Accept(message2);
-
-            sender.Close();
-            receiver.Close();
-            session.Close();
-            connection.Close();
-
-            Assert.That(message2.GetBody<string>(),
-              Is.EqualTo(message1.GetBody<string>()));
-        }
-
-        [Test]
-        public void message_annotations()
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "annotations-q");
-
-            Message message1 = new Message("Testing message annotations");
-            message1.MessageAnnotations = new MessageAnnotations();
-            message1.MessageAnnotations[new Symbol("key1")] = "value1";
-            message1.MessageAnnotations[new Symbol("key2")] = "value2";
-            sender.Send(message1);
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "annotations-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-            receiver.Accept(message2);
-
-            sender.Close();
-            receiver.Close();
-            session.Close();
-            connection.Close();
-
-            Assert.That(message2.GetBody<string>(),
-              Is.EqualTo(message1.GetBody<string>()));
-            Assert.That(message2.MessageAnnotations.Descriptor,
-              Is.EqualTo(message1.MessageAnnotations.Descriptor));
-            Assert.That(message2.MessageAnnotations.Map,
-              Is.EqualTo(message1.MessageAnnotations.Map));
-        }
-
-        [Test]
-        public void footer()
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "footer-q");
-
-            Message message1 = new Message("Testing footer");
-            message1.Footer = new Footer();
-            message1.Footer[new Symbol("key1")] = "value1";
-            message1.Footer[new Symbol("key2")] = "value2";
-            sender.Send(message1);
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "footer-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-            receiver.Accept(message2);
-
-            sender.Close();
-            receiver.Close();
-            session.Close();
-            connection.Close();
-
-            Assert.That(message2.GetBody<string>(),
-              Is.EqualTo(message1.GetBody<string>()));
-            Assert.That(message2.Footer.Descriptor,
-              Is.EqualTo(message1.Footer.Descriptor));
-            Assert.That(message2.Footer.Map,
-              Is.EqualTo(message1.Footer.Map));
-        }
-
-        [Test]
-        public void data_types()
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "data_types-q");
-
-            var list = new Amqp.Types.List();
-            list.Add(true);
-            list.Add('$');
-            list.Add(Byte.MaxValue);
-            list.Add(Int16.MinValue);
-            list.Add(Int32.MinValue);
-            list.Add(Int64.MinValue);
-            list.Add(UInt16.MaxValue);
-            list.Add(UInt32.MaxValue);
-            list.Add(UInt64.MaxValue);
-            list.Add(Double.NaN);
-            list.Add(null);
-            list.Add("\uFFF9");
-            list.Add(new Symbol("Symbol"));
-            list.Add(DateTime.Parse("2008-11-01T19:35:00.0000000Z").ToUniversalTime());
-            list.Add(new Guid("f275ea5e-0c57-4ad7-b11a-b20c563d3b71"));
-            list.Add(new Amqp.Types.List() { "Boolean", true });
-            list.Add(new AmqpSequence() {
-              List = new Amqp.Types.List() { "Integer", 1 }
-            });
-
-            AmqpSequence body = new AmqpSequence() { List = list };
-            Message message1 = new Message(body);
-            sender.Send(message1);
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "data_types-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-            receiver.Accept(message2);
-
-            sender.Close();
-            receiver.Close();
-            session.Close();
-            connection.Close();
-
-            /* AmqpSequence apparently can't be compared directly: we must
-             * compare their list instead. */
-            var list1 = message1.GetBody<AmqpSequence>().List;
-            var list2 = message2.GetBody<AmqpSequence>().List;
-            Assert.That(list2.Count, Is.EqualTo(list1.Count));
-
-            for (int i = 0; i < list1.Count; ++i) {
-                if (list[i] != null &&
-                  list1[i].GetType() == typeof(AmqpSequence)) {
-                    Assert.That(
-                      ((AmqpSequence)list2[i]).List,
-                      Is.EqualTo(((AmqpSequence)list1[i]).List));
-                } else {
-                    Assert.That(list2[i], Is.EqualTo(list1[i]));
-                }
-            }
-        }
-
-        [Test]
-        public void reject()
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "reject-q");
-
-            Message message1 = new Message("Testing reject");
-            sender.Send(message1);
-            sender.Close();
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "reject-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-            receiver.Reject(message2);
-
-            Assert.That(receiver.Receive(100), Is.Null);
-
-            receiver.Close();
-            session.Close();
-            connection.Close();
-        }
-
-        [Test]
-        public void redelivery()
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", "redelivery-q");
-
-            Message message1 = new Message("Testing redelivery");
-            sender.Send(message1);
-            sender.Close();
-
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", "redelivery-q");
-            receiver.SetCredit(100, true);
-            Message message2 = receiver.Receive();
-
-            Assert.That(message2.Header.FirstAcquirer, Is.True);
-            // FIXME Assert.That(message2.Delivery.Settled, Is.False);
-
-            receiver.Close();
-            session.Close();
-
-            session = new Session(connection);
-            receiver = new ReceiverLink(session,
-              "test-receiver", "redelivery-q");
-            receiver.SetCredit(100, true);
-            Message message3 = receiver.Receive();
-            receiver.Accept(message3);
-
-            Assert.That(message3.GetBody<string>(),
-              Is.EqualTo(message2.GetBody<string>()));
-            Assert.That(message3.Header.FirstAcquirer, Is.False);
-
-            Assert.That(receiver.Receive(100), Is.Null);
-
-            receiver.Close();
-            session.Close();
-            connection.Close();
-        }
-
-        [TestCase("/queue/test", "test", "", true)]
-        [TestCase("test", "/queue/test", "", true)]
-        [TestCase("test", "test", "", true)]
-
-        [TestCase("/topic/a.b.c.d",      "/topic/#.c.*",              "",        true)]
-        [TestCase("/exchange/amq.topic", "/topic/#.c.*",              "a.b.c.d", true)]
-        [TestCase("/topic/w.x.y.z",      "/exchange/amq.topic/#.y.*", "",        true)]
-        [TestCase("/exchange/amq.topic", "/exchange/amq.topic/#.y.*", "w.x.y.z", true)]
-
-        [TestCase("/exchange/amq.fanout",  "/exchange/amq.fanout/",  "",  true)]
-        [TestCase("/exchange/amq.direct",  "/exchange/amq.direct/",  "",  true)]
-        [TestCase("/exchange/amq.direct",  "/exchange/amq.direct/a", "a", true)]
-
-        /* FIXME: The following three tests rely on the queue "test"
-         * created by previous tests in this function. */
-        [TestCase("/queue/test",     "/amq/queue/test", "", true)]
-        [TestCase("/amq/queue/test", "/queue/test",     "", true)]
-        [TestCase("/amq/queue/test", "/amq/queue/test", "", true)]
-
-        /* The following tests verify that a queue created out-of-band
-         * in AMQP is reachable from the AMQP 1.0 world. Queues are created
-         * from the common_test suite. */
-        [TestCase("/amq/queue/transient_q", "/amq/queue/transient_q", "", true)]
-        [TestCase("/amq/queue/durable_q",   "/amq/queue/durable_q",   "", true)]
-        [TestCase("/amq/queue/autodel_q",   "/amq/queue/autodel_q",   "", true)]
-
-        public void routing(String target, String source,
-          String routing_key, bool succeed)
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-            SenderLink sender = new SenderLink(session,
-              "test-sender", target);
-            ReceiverLink receiver = new ReceiverLink(session,
-              "test-receiver", source);
-            receiver.SetCredit(100, true);
-
-            Random rnd = new Random();
-            Message message1 = new Message(rnd.Next(10000));
-            Properties props = new Properties() {
-                Subject = routing_key
-            };
-            message1.Properties = props;
-            sender.Send(message1);
-
-            if (succeed) {
-                Message message2 = receiver.Receive(3000);
-                receiver.Accept(message2);
-                Assert.That(message2, Is.Not.Null);
-                Assert.That(message2.GetBody<int>(),
-                  Is.EqualTo(message1.GetBody<int>()));
-            } else {
-                Message message2 = receiver.Receive(100);
-                Assert.That(message2, Is.Null);
-            }
-
-            sender.Close();
-            receiver.Close();
-            session.Close();
-            connection.Close();
-        }
-
-        [TestCase("/exchange/missing", "amqp:not-found")]
-        [TestCase("/fruit/orange", "amqp:invalid-field")]
-        public void invalid_routes(string dest, string condition)
-        {
-            string uri = get_broker_uri();
-
-            Connection connection = new Connection(new Address(uri));
-            Session session = new Session(connection);
-
-            ManualResetEvent mre = new ManualResetEvent(false);
-            string error_name = null;
-
-            OnAttached attached = delegate(Link link, Attach attach) {
-                mre.Set();
-            };
-
-            ClosedCallback closed = (AmqpObject amqp_obj, Error error) => {
-                error_name = error.Condition;
-                mre.Set();
-            };
-            session.Closed = closed;
-
-            SenderLink sender = new SenderLink(session,
-              "test-sender", new Target() { Address = dest }, attached);
-            mre.WaitOne();
-            Assert.That(error_name, Is.EqualTo(condition));
-
-            error_name = null;
-            mre.Reset();
-
-            Assert.That(
-              () => {
-                  ReceiverLink receiver = new ReceiverLink(session,
-                    "test-receiver", dest);
-                  receiver.Close();
-              },
-              Throws.TypeOf<Amqp.AmqpException>()
-              .With.Property("Error")
-              .With.Property("Condition").EqualTo(new Symbol(condition)));
-
-            session.Closed = null;
-            session.Close();
-            connection.Close();
-        }
-
-        internal string get_broker_uri()
-        {
-            TestParameters parameters = TestContext.Parameters;
-            string uri = parameters["rmq_broker_uri"];
-            if (uri == null)
-                uri =
-                  System.Environment.GetEnvironmentVariable("RMQ_BROKER_URI");
-            Assert.That(uri, Is.Not.Null);
-
-            return uri;
-        }
-    }
-}
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/pom.xml b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/pom.xml
deleted file mode 100644 (file)
index 53f533e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.rabbitmq.amqp1_0.tests.proton</groupId>
-  <artifactId>rabbitmq-amqp1.0-java-tests</artifactId>
-  <packaging>jar</packaging>
-  <version>1.0-SNAPSHOT</version>
-  <name>rabbitmq-amqp1.0-java-tests</name>
-  <url>http://www.rabbitmq.com</url>
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.12</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.qpid</groupId>
-      <artifactId>proton-j</artifactId>
-      <version>0.13.0</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.19.1</version>
-        <configuration>
-          <systemPropertyVariables>
-            <rmq_broker_uri>${rmq_broker_uri}</rmq_broker_uri>
-          </systemPropertyVariables>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/FooterTest.java b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/FooterTest.java
deleted file mode 100644 (file)
index 8cb85a6..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// vim:sw=4:et:
-
-package com.rabbitmq.amqp1_0.tests.proton;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.qpid.proton.message.Message;
-import org.apache.qpid.proton.message.impl.MessageImpl;
-import org.apache.qpid.proton.messenger.Messenger;
-import org.apache.qpid.proton.messenger.impl.MessengerImpl;
-import org.apache.qpid.proton.amqp.messaging.AmqpValue;
-import org.apache.qpid.proton.amqp.messaging.Footer;
-import org.apache.qpid.proton.amqp.Symbol;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * Unit test for simple App.
- */
-public class FooterTest
-    extends TestCase
-{
-    public static final String ADDRESS = "/footer-q";
-    public static final String PAYLOAD = "Payload";
-
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public FooterTest(String testName)
-    {
-        super(testName);
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite(FooterTest.class);
-    }
-
-    public void test_footer()
-    {
-        String uri = System.getProperty("rmq_broker_uri");
-        assertNotNull(uri);
-        String address = uri + ADDRESS;
-
-        Messenger mng = new MessengerImpl();
-        Message sent_msg, received_msg;
-
-        mng.setTimeout(1000);
-        try {
-            mng.start();
-        } catch (Exception e) {
-            fail();
-        }
-
-        sent_msg = new MessageImpl();
-        sent_msg.setAddress(address);
-        sent_msg.setBody(new AmqpValue(PAYLOAD));
-
-        Map<Symbol, Object> map = new HashMap<Symbol, Object>();
-        map.put(Symbol.valueOf("key1"), "value1");
-        map.put(Symbol.valueOf("key2"), "value2");
-        Footer annotations = new Footer(map);
-        sent_msg.setFooter(annotations);
-
-        mng.put(sent_msg);
-        mng.send();
-
-        mng.subscribe(address);
-        mng.recv();
-        received_msg = mng.get();
-
-        assertEquals(sent_msg.getSubject(),
-          received_msg.getSubject());
-        assertEquals(sent_msg.getContentType(),
-          received_msg.getContentType());
-        assertEquals(sent_msg.getBody().toString(),
-          received_msg.getBody().toString());
-        assertEquals(sent_msg.getFooter().toString(),
-          received_msg.getFooter().toString());
-
-        mng.stop();
-    }
-}
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/MessageAnnotationsTest.java b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/MessageAnnotationsTest.java
deleted file mode 100644 (file)
index d056bc3..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// vim:sw=4:et:
-
-package com.rabbitmq.amqp1_0.tests.proton;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.qpid.proton.message.Message;
-import org.apache.qpid.proton.message.impl.MessageImpl;
-import org.apache.qpid.proton.messenger.Messenger;
-import org.apache.qpid.proton.messenger.impl.MessengerImpl;
-import org.apache.qpid.proton.amqp.messaging.AmqpValue;
-import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
-import org.apache.qpid.proton.amqp.Symbol;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * Unit test for simple App.
- */
-public class MessageAnnotationsTest
-    extends TestCase
-{
-    public static final String ADDRESS = "/message_annotations-q";
-    public static final String PAYLOAD = "Payload";
-
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public MessageAnnotationsTest(String testName)
-    {
-        super(testName);
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite(MessageAnnotationsTest.class);
-    }
-
-    public void test_message_annotations()
-    {
-        String uri = System.getProperty("rmq_broker_uri");
-        assertNotNull(uri);
-        String address = uri + ADDRESS;
-
-        Messenger mng = new MessengerImpl();
-        Message sent_msg, received_msg;
-
-        mng.setTimeout(1000);
-        try {
-            mng.start();
-        } catch (Exception e) {
-            fail();
-        }
-
-        sent_msg = new MessageImpl();
-        sent_msg.setAddress(address);
-        sent_msg.setBody(new AmqpValue(PAYLOAD));
-
-        Map<Symbol, Object> map = new HashMap<Symbol, Object>();
-        map.put(Symbol.valueOf("key1"), "value1");
-        map.put(Symbol.valueOf("key2"), "value2");
-        MessageAnnotations annotations = new MessageAnnotations(map);
-        sent_msg.setMessageAnnotations(annotations);
-
-        mng.put(sent_msg);
-        mng.send();
-
-        mng.subscribe(address);
-        mng.recv();
-        received_msg = mng.get();
-
-        assertEquals(sent_msg.getSubject(),
-          received_msg.getSubject());
-        assertEquals(sent_msg.getContentType(),
-          received_msg.getContentType());
-        assertEquals(sent_msg.getBody().toString(),
-          received_msg.getBody().toString());
-        assertEquals(sent_msg.getMessageAnnotations().toString(),
-          received_msg.getMessageAnnotations().toString());
-
-        mng.stop();
-    }
-}
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/RoundTripTest.java b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/system_SUITE_data/java-tests/src/test/java/com/rabbitmq/amqp1_0/tests/proton/RoundTripTest.java
deleted file mode 100644 (file)
index 16d82da..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-// vim:sw=4:et:
-
-package com.rabbitmq.amqp1_0.tests.proton;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.qpid.proton.message.Message;
-import org.apache.qpid.proton.message.impl.MessageImpl;
-import org.apache.qpid.proton.messenger.Messenger;
-import org.apache.qpid.proton.messenger.impl.MessengerImpl;
-import org.apache.qpid.proton.amqp.messaging.AmqpValue;
-
-/**
- * Unit test for simple App.
- */
-public class RoundTripTest
-    extends TestCase
-{
-    public static final String ADDRESS = "/roundtrip-q";
-    public static final String PAYLOAD = "Payload";
-
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public RoundTripTest(String testName)
-    {
-        super(testName);
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite(RoundTripTest.class);
-    }
-
-    public void test_roundtrip()
-    {
-        String uri = System.getProperty("rmq_broker_uri");
-        assertNotNull(uri);
-        String address = uri + ADDRESS;
-
-        Messenger mng = new MessengerImpl();
-        Message sent_msg, received_msg;
-
-        mng.setTimeout(1000);
-        try {
-            mng.start();
-        } catch (Exception e) {
-            fail();
-        }
-
-        sent_msg = new MessageImpl();
-        sent_msg.setAddress(address);
-        sent_msg.setBody(new AmqpValue(PAYLOAD));
-        mng.put(sent_msg);
-        mng.send();
-
-        mng.subscribe(address);
-        mng.recv();
-        received_msg = mng.get();
-
-        assertEquals(sent_msg.getSubject(),
-          received_msg.getSubject());
-        assertEquals(sent_msg.getContentType(),
-          received_msg.getContentType());
-        assertEquals(sent_msg.getBody().toString(),
-          received_msg.getBody().toString());
-
-        mng.stop();
-    }
-}
diff --git a/rabbitmq-server/deps/rabbitmq_amqp1_0/test/unit_SUITE.erl b/rabbitmq-server/deps/rabbitmq_amqp1_0/test/unit_SUITE.erl
deleted file mode 100644 (file)
index 83ac8a9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--include("rabbit_amqp1_0.hrl").
-
--import(rabbit_amqp1_0_util, [serial_add/2, serial_diff/2, serial_compare/2]).
-
--compile(export_all).
-
-all() ->
-    [
-      serial_arithmetic
-    ].
-
--include_lib("eunit/include/eunit.hrl").
-
-serial_arithmetic(_Config) ->
-    ?assertEqual(1, serial_add(0, 1)),
-    ?assertEqual(16#7fffffff, serial_add(0, 16#7fffffff)),
-    ?assertEqual(0, serial_add(16#ffffffff, 1)),
-    %% Cannot add more than 2 ^ 31 - 1
-    ?assertExit({out_of_bound_serial_addition, _, _},
-                serial_add(200, 16#80000000)),
-    ?assertEqual(1, serial_diff(1, 0)),
-    ?assertEqual(2, serial_diff(1, 16#ffffffff)),
-    ?assertEqual(-2, serial_diff(16#ffffffff, 1)),
-    ?assertExit({indeterminate_serial_diff, _, _},
-                serial_diff(0, 16#80000000)),
-    ?assertExit({indeterminate_serial_diff, _, _},
-                serial_diff(16#ffffffff, 16#7fffffff)).
diff --git a/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/build.config b/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/erlang.mk b/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/rabbit_ldap_seed.erl b/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/rabbit_ldap_seed.erl
deleted file mode 100644 (file)
index 3907e34..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_ldap_seed).
-
--include_lib("eldap/include/eldap.hrl").
-
--export([seed/1,delete/1]).
-
-seed(Logon) ->
-    H = connect(Logon),
-    ok = add(H, rabbitmq_com()),
-    ok = add(H, ou("people")),
-    [ add(H, P) || P <- people() ],
-    ok = add(H, ou("vhosts")),
-    ok = add(H, test()),
-    ok = add(H, ou("groups")),
-    [ add(H, P) || P <- groups() ],
-    eldap:close(H),
-    ok.
-
-rabbitmq_com() ->
-    {"dc=rabbitmq,dc=com",
-      [{"objectClass", ["dcObject", "organization"]},
-       {"dc", ["rabbitmq"]},
-       {"o", ["Test"]}]}.
-
-
-delete(Logon) ->
-    H = connect(Logon),
-    eldap:delete(H, "ou=test,dc=rabbitmq,dc=com"),
-    eldap:delete(H, "ou=test,ou=vhosts,dc=rabbitmq,dc=com"),
-    eldap:delete(H, "ou=vhosts,dc=rabbitmq,dc=com"),
-    [ eldap:delete(H, P) || {P, _} <- groups() ],
-    [ eldap:delete(H, P) || {P, _} <- people() ],
-    eldap:delete(H, "ou=groups,dc=rabbitmq,dc=com"),
-    eldap:delete(H, "ou=people,dc=rabbitmq,dc=com"),
-    eldap:delete(H, "dc=rabbitmq,dc=com"),
-    eldap:close(H),
-    ok.
-
-people() ->
-    [ bob(),
-      dominic(),
-      charlie(),
-      edward(),
-      johndoe(),
-      alice(),
-      peter(),
-      carol()
-    ].
-
-groups() ->
-    [wheel_group(),
-     people_group(),
-     staff_group(),
-     bobs_group(),
-     bobs2_group(),
-     admins_group()
-    ].
-
-wheel_group() ->
-    {A, _} = alice(),
-    {C, _} = charlie(),
-    {D, _} = dominic(),
-    {P, _} = peter(),
-    {"cn=wheel,ou=groups,dc=rabbitmq,dc=com",
-     [{"objectClass", ["groupOfNames"]},
-      {"cn", ["wheel"]},
-      {"member", [A, C, D, P]}]}.
-
-people_group() ->
-    {C, _} = charlie(),
-    {D, _} = dominic(),
-    {P, _} = peter(),
-    {"cn=people,ou=groups,dc=rabbitmq,dc=com",
-     [{"objectClass", ["groupOfNames"]},
-      {"cn", ["people"]},
-      {"member", [C, D, P]}]}.
-
-staff_group() ->
-    {C, _} = charlie(),
-    {D, _} = dominic(),
-    {P, _} = peter(),
-    {"cn=staff,ou=groups,dc=rabbitmq,dc=com",
-     [{"objectClass", ["groupOfNames"]},
-      {"cn", ["people"]},
-      {"member", [C, D, P]}]}.
-
-bobs_group() ->
-    {B, _} = bob(),
-    {"cn=bobs,ou=groups,dc=rabbitmq,dc=com",
-     [{"objectClass", ["groupOfNames"]},
-      {"cn", ["bobs"]},
-      {"member", [B]}]}.
-
-bobs2_group() ->
-    {B, _} = bobs_group(),
-    {"cn=bobs2,ou=groups,dc=rabbitmq,dc=com",
-     [{"objectClass", ["groupOfNames"]},
-      {"cn", ["bobs2"]},
-      {"member", [B]}]}.
-
-admins_group() ->
-    {B, _} = bobs2_group(),
-    {W, _} = wheel_group(), 
-    {"cn=admins,ou=groups,dc=rabbitmq,dc=com",
-     [{"objectClass", ["groupOfNames"]},
-      {"cn", ["admins"]},
-      {"member", [B, W]}]}.
-
-person(Cn, Sn) ->
-    {"cn="++Cn++",ou=people,dc=rabbitmq,dc=com",
-     [{"objectClass", ["person"]},
-      {"cn", [Cn]},
-      {"sn", [Sn]},
-      {"userPassword", ["password"]}]}.
-
-bob() -> person("Bob", "Robert").
-dominic() -> person("Dominic", "Dom").
-charlie() -> person("Charlie", "Charlie Boy").
-edward() -> person("Edward", "Ed").
-johndoe() -> person("John Doe", "Doe").
-
-alice() ->
-    {"cn=Alice,ou=people,dc=rabbitmq,dc=com",
-     [{"objectClass", ["person"]},
-      {"cn", ["Alice"]},
-      {"sn", ["Ali"]},
-      {"userPassword", ["password"]},
-      {"description", ["can-declare-queues"]}]}.
-
-peter() ->
-    {"uid=peter,ou=people,dc=rabbitmq,dc=com",
-     [{"cn", ["Peter"]},
-      {"givenName", ["Peter"]},
-      {"sn", ["Jones"]},
-      {"uid", ["peter"]},
-      {"uidNumber", ["5000"]},
-      {"gidNumber", ["10000"]},
-      {"homeDirectory", ["/home/peter"]},
-      {"mail", ["peter.jones@rabbitmq.com"]},
-      {"objectClass", ["top",
-                       "posixAccount",
-                       "shadowAccount",
-                       "inetOrgPerson",
-                       "organizationalPerson",
-                       "person"]},
-      {"loginShell", ["/bin/bash"]},
-      {"userPassword", ["password"]},
-      {"memberOf", ["cn=wheel,ou=groups,dc=rabbitmq,dc=com",
-                    "cn=staff,ou=groups,dc=rabbitmq,dc=com",
-                    "cn=people,ou=groups,dc=rabbitmq,dc=com"]}]}.
-
-carol() ->
-    {"uid=carol,ou=people,dc=rabbitmq,dc=com",
-     [{"cn", ["Carol"]},
-      {"givenName", ["Carol"]},
-      {"sn", ["Meyers"]},
-      {"uid", ["peter"]},
-      {"uidNumber", ["655"]},
-      {"gidNumber", ["10000"]},
-      {"homeDirectory", ["/home/carol"]},
-      {"mail", ["carol.meyers@example.com"]},
-      {"objectClass", ["top",
-                       "posixAccount",
-                       "shadowAccount",
-                       "inetOrgPerson",
-                       "organizationalPerson",
-                       "person"]},
-      {"loginShell", ["/bin/bash"]},
-      {"userPassword", ["password"]}]}.
-
-add(H, {A, B}) ->
-    ok = eldap:add(H, A, B).
-
-connect({Host, Port}) ->
-    {ok, H} = eldap:open([Host], [{port, Port}]),
-    ok = eldap:simple_bind(H, "cn=admin,dc=rabbitmq,dc=com", "admin"),
-    H.
-
-ou(Name) ->
-    {"ou=" ++ Name ++ ",dc=rabbitmq,dc=com", [{"objectClass", ["organizationalUnit"]}, {"ou", [Name]}]}.
-
-test() ->
-    {"ou=test,ou=vhosts,dc=rabbitmq,dc=com", [{"objectClass", ["top", "organizationalUnit"]}, {"ou", ["test"]}]}.
-
diff --git a/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/system_SUITE.erl b/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/system_SUITE.erl
deleted file mode 100644 (file)
index 40f5e23..0000000
+++ /dev/null
@@ -1,632 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(system_SUITE).
--compile([export_all]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--define(ALICE_NAME, "Alice").
--define(BOB_NAME, "Bob").
--define(CAROL_NAME, "Carol").
--define(PETER_NAME, "Peter").
-
--define(VHOST, "test").
--define(DEFAULT_LDAP_PORT, "3890").
-
--define(ALICE, #amqp_params_network{username     = <<?ALICE_NAME>>,
-                                    password     = <<"password">>,
-                                    virtual_host = <<?VHOST>>}).
-
--define(BOB, #amqp_params_network{username       = <<?BOB_NAME>>,
-                                  password       = <<"password">>,
-                                  virtual_host   = <<?VHOST>>}).
-
--define(CAROL, #amqp_params_network{username     = <<?CAROL_NAME>>,
-                                    password     = <<"password">>,
-                                    virtual_host = <<?VHOST>>}).
-
--define(PETER, #amqp_params_network{username     = <<?PETER_NAME>>,
-                                    password     = <<"password">>,
-                                    virtual_host = <<?VHOST>>}).
-
--define(BASE_CONF_RABBIT, {rabbit, [{default_vhost, <<"test">>}]}).
-
-base_conf_ldap(LdapPort) ->
-                    {rabbitmq_auth_backend_ldap, [{servers, ["localhost"]},
-                                                  {user_dn_pattern,    "cn=${username},ou=People,dc=rabbitmq,dc=com"},
-                                                  {other_bind,         anon},
-                                                  {use_ssl,            false},
-                                                  {port,               LdapPort},
-                                                  {log,                true},
-                                                  {group_lookup_base,  "ou=groups,dc=rabbitmq,dc=com"},
-                                                  {vhost_access_query, {exists, "ou=${vhost},ou=vhosts,dc=rabbitmq,dc=com"}},
-                                                  {resource_access_query,
-                                                   {for, [{resource, exchange,
-                                                           {for, [{permission, configure,
-                                                                   {in_group, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"}
-                                                                  },
-                                                                  {permission, write, {constant, true}},
-                                                                  {permission, read,
-                                                                   {match, {string, "${name}"},
-                                                                           {string, "^xch-${username}-.*"}}
-                                                                  }
-                                                                 ]}},
-                                                          {resource, queue,
-                                                           {for, [{permission, configure,
-                                                                   {match, {attribute, "${user_dn}", "description"},
-                                                                           {string, "can-declare-queues"}}
-                                                                  },
-                                                                  {permission, write, {constant, true}},
-                                                                  {permission, read,
-                                                                   {'or',
-                                                                    [{'and',
-                                                                      [{equals, "${name}", "test1"},
-                                                                       {equals, "${username}", "Alice"}]},
-                                                                     {'and',
-                                                                      [{equals, "${name}", "test2"},
-                                                                       {'not', {equals, "${username}", "Bob"}}]}
-                                                                    ]}}
-                                                                 ]}}
-                                                          ]}},
-                                                  {tag_queries, [{monitor,       {constant, true}},
-                                                                 {administrator, {constant, false}},
-                                                                 {management,    {constant, false}}]}
-                                                ]}.
-
-%%--------------------------------------------------------------------
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                ldap_only,
-                                ldap_and_internal,
-                                internal_followed_ldap_and_internal,
-                                tag_attribution_ldap_only,
-                                tag_attribution_ldap_and_internal,
-                                tag_attribution_internal_followed_by_ldap_and_internal,
-                                invalid_or_clause_ldap_only,
-                                invalid_and_clause_ldap_only
-                               ]}
-    ].
-
-suite() ->
-    [{timetrap, {seconds, 60}}].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_extra_tcp_ports, [tcp_port_amqp_tls_extra]}
-      ]),
-    {LdapPort, _} = string:to_integer(os:getenv("LDAP_PORT", ?DEFAULT_LDAP_PORT)),
-    Config2 = rabbit_ct_helpers:merge_app_env(Config1, ?BASE_CONF_RABBIT),
-    Config3 = rabbit_ct_helpers:merge_app_env(Config2, base_conf_ldap(LdapPort)),
-    Logon = {"localhost", LdapPort},
-    rabbit_ldap_seed:delete(Logon),
-    rabbit_ldap_seed:seed(Logon),
-    Config4 = rabbit_ct_helpers:set_config(Config3, {ldap_port, LdapPort}),
-
-    rabbit_ct_helpers:run_setup_steps(Config4,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ldap_seed:delete({"localhost", ?config(ldap_port, Config)}),
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_internal(Config) ->
-    ok = control_action(Config, add_user, [?ALICE_NAME, ""]),
-    ok = control_action(Config, set_permissions, [?ALICE_NAME, "prefix-.*", "prefix-.*", "prefix-.*"]),
-    ok = control_action(Config, set_user_tags, [?ALICE_NAME, "management", "foo"]),
-    ok = control_action(Config, add_user, [?BOB_NAME, ""]),
-    ok = control_action(Config, set_permissions, [?BOB_NAME, "", "", ""]),
-    ok = control_action(Config, add_user, [?PETER_NAME, ""]),
-    ok = control_action(Config, set_permissions, [?PETER_NAME, "", "", ""]).
-
-end_internal(Config) ->
-    ok = control_action(Config, delete_user, [?ALICE_NAME]),
-    ok = control_action(Config, delete_user, [?BOB_NAME]),
-    ok = control_action(Config, delete_user, [?PETER_NAME]).
-
-init_per_testcase(Testcase, Config)
-    when Testcase == ldap_and_internal;
-         Testcase == internal_followed_ldap_and_internal ->
-    init_internal(Config),
-    rabbit_ct_helpers:testcase_started(Config, Testcase);
-init_per_testcase(Testcase, Config)
-    when Testcase == tag_attribution_ldap_and_internal;
-         Testcase == tag_attribution_internal_followed_by_ldap_and_internal ->
-    % back up tag queries
-    Cfg = case rabbit_ct_broker_helpers:rpc(Config, 0,
-                                            application,
-                                            get_env,
-                                            [rabbit_auth_backend_ldap, tag_queries]) of
-               undefined -> undefined;
-               {ok, X} -> X
-          end,
-    rabbit_ct_helpers:set_config(Config, {tag_queries_config, Cfg}),
-    internal_authorization_teardown(Config),
-    internal_authorization_setup(Config),
-    rabbit_ct_helpers:testcase_started(Config, Testcase);
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config)
-    when Testcase == ldap_and_internal;
-         Testcase == internal_followed_ldap_and_internal ->
-    end_internal(Config),
-    rabbit_ct_helpers:testcase_finished(Config, Testcase);
-end_per_testcase(Testcase, Config)
-    when Testcase == tag_attribution_ldap_and_internal;
-         Testcase == tag_attribution_internal_followed_by_ldap_and_internal ->
-    % restore tag queries
-    Cfg = rabbit_ct_helpers:get_config(Config, tag_queries_config),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-                                      application,
-                                      set_env,
-                                      [rabbit_auth_backend_ldap, tag_queries, Cfg]),
-    internal_authorization_teardown(Config),
-    rabbit_ct_helpers:testcase_finished(Config, Testcase);
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-
-%% -------------------------------------------------------------------
-%% Testsuite cases
-%% -------------------------------------------------------------------
-
-ldap_only(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends, [rabbit_auth_backend_ldap]]),
-    login(Config),
-    in_group(Config),
-    const(Config),
-    string_match(Config),
-    boolean_logic(Config),
-    tag_check(Config, [monitor]),
-    tag_check_subst(Config),
-    logging(Config),
-    ok.
-
-ldap_and_internal(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends,
-                                  [{rabbit_auth_backend_ldap, rabbit_auth_backend_internal}]]),
-    login(Config),
-    permission_match(Config),
-    tag_check(Config, [monitor, management, foo]),
-    ok.
-
-internal_followed_ldap_and_internal(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends,
-                                  [rabbit_auth_backend_internal, {rabbit_auth_backend_ldap, rabbit_auth_backend_internal}]]),
-    login(Config),
-    permission_match(Config),
-    tag_check(Config, [monitor, management, foo]),
-    ok.
-
-tag_attribution_ldap_only(Config) ->
-    set_env(Config, tag_query_configuration()),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends, [rabbit_auth_backend_ldap]]),
-    tag_check(Config, <<"Edward">>, <<"password">>, [monitor, normal]).
-
-tag_attribution_ldap_and_internal(Config) ->
-    set_env(Config, tag_query_configuration()),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends, [{rabbit_auth_backend_ldap,
-                                                           rabbit_auth_backend_internal}]]),
-    tag_check(Config, <<"Edward">>, <<"password">>,
-               [monitor, normal] ++ internal_authorization_tags()).
-
-tag_attribution_internal_followed_by_ldap_and_internal(Config) ->
-    set_env(Config, tag_query_configuration()),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends, [rabbit_auth_backend_internal,
-                                                          {rabbit_auth_backend_ldap,
-                                                           rabbit_auth_backend_internal}]]),
-    tag_check(Config, <<"Edward">>, <<"password">>,
-               [monitor, normal] ++ internal_authorization_tags()).
-
-invalid_or_clause_ldap_only(Config) ->
-    set_env(Config, vhost_access_query_or_in_group()),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends, [rabbit_auth_backend_ldap]]),
-    B = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    {ok, C} = amqp_connection:start(B?ALICE),
-    ok = amqp_connection:close(C).
-
-invalid_and_clause_ldap_only(Config) ->
-    set_env(Config, vhost_access_query_and_in_group()),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           application, set_env, [rabbit, auth_backends, [rabbit_auth_backend_ldap]]),
-    B = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    % NB: if the query crashes the ldap plugin it returns {error, access_refused}
-    % This may not be a reliable return value assertion
-    {error, not_allowed} = amqp_connection:start(B?ALICE).
-
-%%--------------------------------------------------------------------
-
-login(Config) ->
-    lists:flatten(
-      [test_login(Config, {N, Env}, L, FilterList, case {LGood, EnvGood} of
-                                               {good, good} -> fun succ/1;
-                                               _            -> fun fail/1
-                                           end) ||
-          {LGood, FilterList, L, _Tags}  <- logins(Config),
-          {N, {EnvGood, Env}}            <- login_envs()]).
-
-logins(Config) -> logins_network(Config) ++ logins_direct(Config).
-
-%% Format for login tests, {Outcome, FilterList, Login, Tags}.
-%% Tests skipped for each login_env reference in FilterList.
-logins_network(Config) ->
-    B = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    [{bad,  [5, 6], B#amqp_params_network{}, []},
-     {bad,  [5, 6], B#amqp_params_network{username     = <<?ALICE_NAME>>}, []},
-     {bad,  [5, 6], B#amqp_params_network{username     = <<?ALICE_NAME>>,
-                                          password     = <<"password">>}, []},
-     {bad,  [5, 6], B#amqp_params_network{username     = <<"Alice">>,
-                                          password     = <<"Alicja">>,
-                                          virtual_host = <<?VHOST>>}, []},
-     {bad,  [1, 2, 3, 4, 6, 7], B?CAROL, []},
-     {good, [5, 6], B?ALICE, []},
-     {good, [5, 6], B?BOB, []},
-     {good, [1, 2, 3, 4, 6, 7, 8], B?PETER, []}].
-
-logins_direct(Config) ->
-    N = #amqp_params_direct{node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename)},
-    [{bad,  [5], N#amqp_params_direct{}, []},
-     {bad,  [5], N#amqp_params_direct{username         = <<?ALICE_NAME>>}, []},
-     {bad,  [5], N#amqp_params_direct{username         = <<?ALICE_NAME>>,
-                                      password         = <<"password">>}, [management]},
-     {good, [5], N#amqp_params_direct{username         = <<?ALICE_NAME>>,
-                                      password         = <<"password">>,
-                                      virtual_host     = <<?VHOST>>}, [management]}].
-
-%% Format for login envs, {Reference, {Outcome, Env}}
-login_envs() ->
-    [{1, {good, base_login_env()}},
-     {2, {good, dn_lookup_pre_bind_env()}},
-     {3, {good, other_bind_admin_env()}},
-     {4, {good, other_bind_anon_env()}},
-     {5, {good, posix_vhost_access_multiattr_env()}},
-     {6, {good, tag_queries_subst_env()}},
-     {7, {bad,  other_bind_broken_env()}},
-     {8, {good, vhost_access_query_nested_groups_env()}}].
-
-base_login_env() ->
-    [{user_dn_pattern,     "cn=${username},ou=People,dc=rabbitmq,dc=com"},
-     {dn_lookup_attribute, none},
-     {dn_lookup_base,      none},
-     {dn_lookup_bind,      as_user},
-     {other_bind,          as_user},
-     {tag_queries,         [{monitor,       {constant, true}},
-                            {administrator, {constant, false}},
-                            {management,    {constant, false}}]},
-     {vhost_access_query,  {exists, "ou=${vhost},ou=vhosts,dc=rabbitmq,dc=com"}},
-     {log,                  true}].
-
-%% TODO configure OpenLDAP to allow a dn_lookup_post_bind_env()
-dn_lookup_pre_bind_env() ->
-    [{user_dn_pattern,     "${username}"},
-     {dn_lookup_attribute, "cn"},
-     {dn_lookup_base,      "OU=People,DC=rabbitmq,DC=com"},
-     {dn_lookup_bind,      {"cn=admin,dc=rabbitmq,dc=com", "admin"}}].
-
-other_bind_admin_env() ->
-    [{other_bind, {"cn=admin,dc=rabbitmq,dc=com", "admin"}}].
-
-other_bind_anon_env() ->
-    [{other_bind, anon}].
-
-other_bind_broken_env() ->
-    [{other_bind, {"cn=admin,dc=rabbitmq,dc=com", "admi"}}].
-
-tag_queries_subst_env() ->
-    [{tag_queries, [{administrator, {constant, false}},
-                    {management,
-                     {exists, "ou=${vhost},ou=vhosts,dc=rabbitmq,dc=com"}}]}].
-
-posix_vhost_access_multiattr_env() ->
-    [{user_dn_pattern, "uid=${username},ou=People,dc=rabbitmq,dc=com"},
-     {vhost_access_query,
-      {'and', [{exists, "ou=${vhost},ou=vhosts,dc=rabbitmq,dc=com"},
-               {equals,
-                {attribute, "${user_dn}","memberOf"},
-                {string, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"}},
-               {equals,
-                {attribute, "${user_dn}","memberOf"},
-                {string, "cn=people,ou=groups,dc=rabbitmq,dc=com"}},
-               {equals,
-                {string, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"},
-                {attribute,"${user_dn}","memberOf"}},
-               {equals,
-                {string, "cn=people,ou=groups,dc=rabbitmq,dc=com"},
-                {attribute, "${user_dn}","memberOf"}},
-               {match,
-                {attribute, "${user_dn}","memberOf"},
-                {string, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"}},
-               {match,
-                {attribute, "${user_dn}","memberOf"},
-                {string, "cn=people,ou=groups,dc=rabbitmq,dc=com"}},
-               {match,
-                {string, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"},
-                {attribute, "${user_dn}","memberOf"}},
-               {match,
-                {string, "cn=people,ou=groups,dc=rabbitmq,dc=com"},
-                {attribute, "${user_dn}","memberOf"}}
-              ]}}].
-
-vhost_access_query_or_in_group() ->
-    [{vhost_access_query,
-      {'or', [
-            {in_group, "cn=bananas,ou=groups,dc=rabbitmq,dc=com"},
-            {in_group, "cn=apples,ou=groups,dc=rabbitmq,dc=com"},
-            {in_group, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"}
-             ]}}].
-
-vhost_access_query_and_in_group() ->
-    [{vhost_access_query,
-      {'and', [
-            {in_group, "cn=bananas,ou=groups,dc=rabbitmq,dc=com"},
-            {in_group, "cn=wheel,ou=groups,dc=rabbitmq,dc=com"}
-             ]}}].
-
-vhost_access_query_nested_groups_env() ->
-    [{vhost_access_query, {in_group_nested, "cn=admins,ou=groups,dc=rabbitmq,dc=com"}}].
-
-test_login(Config, {N, Env}, Login, FilterList, ResultFun) ->
-    case lists:member(N, FilterList) of
-        true -> [];
-        _ ->
-            try
-               set_env(Config, Env),
-               ResultFun(Login)
-            after
-               set_env(Config, base_login_env())
-            end
-    end.
-
-rpc_set_env(Config, Args) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, Args).
-
-set_env(Config, Env) ->
-    [rpc_set_env(Config, [rabbitmq_auth_backend_ldap, K, V]) || {K, V} <- Env].
-
-succ(Login) ->
-    {ok, Pid} = amqp_connection:start(Login),
-    amqp_connection:close(Pid).
-fail(Login) -> ?assertMatch({error, _}, amqp_connection:start(Login)).
-
-%%--------------------------------------------------------------------
-
-in_group(Config) ->
-    X = [#'exchange.declare'{exchange = <<"test">>}],
-    B = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    test_resources([{B?ALICE, X, ok},
-                        {B?BOB, X, fail}]).
-
-const(Config) ->
-    Q = [#'queue.declare'{queue = <<"test">>}],
-    B = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    test_resources([{B?ALICE, Q, ok},
-                        {B?BOB, Q, fail}]).
-
-string_match(Config) ->
-    B = fun(N) ->
-                [#'exchange.declare'{exchange = N},
-                 #'queue.declare'{queue = <<"test">>},
-                 #'queue.bind'{exchange = N, queue = <<"test">>}]
-        end,
-    P = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    test_resources([{P?ALICE, B(<<"xch-Alice-abc123">>), ok},
-                        {P?ALICE, B(<<"abc123">>),                     fail},
-                        {P?ALICE, B(<<"xch-Someone Else-abc123">>),    fail}]).
-
-boolean_logic(Config) ->
-    Q1 = [#'queue.declare'{queue = <<"test1">>},
-          #'basic.consume'{queue = <<"test1">>}],
-    Q2 = [#'queue.declare'{queue = <<"test2">>},
-          #'basic.consume'{queue = <<"test2">>}],
-    P = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    [test_resource(PTR) || PTR <- [{P?ALICE, Q1, ok},
-                                       {P?ALICE, Q2, ok},
-                                       {P?BOB, Q1, fail},
-                                       {P?BOB, Q2, fail}]].
-
-permission_match(Config) ->
-    B = fun(N) ->
-                [#'exchange.declare'{exchange = N},
-                 #'queue.declare'{queue = <<"prefix-test">>},
-                 #'queue.bind'{exchange = N, queue = <<"prefix-test">>}]
-        end,
-    P = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    test_resources([{P?ALICE, B(<<"prefix-abc123">>),    ok},
-                        {P?ALICE, B(<<"abc123">>),           fail},
-                        {P?ALICE, B(<<"xch-Alice-abc123">>), fail}]).
-
-%% Tag check tests, with substitution
-tag_check_subst(Config) ->
-    lists:flatten(
-      [test_tag_check(Config, tag_queries_subst_env(),
-                      fun () -> tag_check(Config, Username, Password, VHost, Outcome, Tags) end) ||
-          {Outcome, _FilterList, #amqp_params_direct{username     = Username,
-                                                     password     = Password,
-                                                     virtual_host = VHost},
-           Tags} <- logins_direct(Config)]).
-
-%% Tag check
-tag_check(Config, Tags) ->
-    tag_check(Config, <<?ALICE_NAME>>, <<"password">>, Tags).
-
-tag_check(Config, Username, Password, Tags) ->
-    tag_check(Config, Username, Password, <<>>, good, Tags).
-
-tag_check(Config, Username, Password, VHost, Outcome, Tags)
-  when is_binary(Username), is_binary(Password), is_binary(VHost), is_list(Tags) ->
-    {ok, User} = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_access_control, check_user_login, [Username, [{password, Password}, {vhost, VHost}]]),
-    tag_check_outcome(Outcome, Tags, User);
-tag_check(_, _, _, _, _, _) -> fun() -> [] end.
-
-tag_check_outcome(good, Tags, User) -> ?assertEqual(Tags, User#user.tags);
-tag_check_outcome(bad, Tags, User)  -> ?assertNotEqual(Tags, User#user.tags).
-
-test_tag_check(Config, Env, TagCheckFun) ->
-    try
-       set_env(Config, Env),
-       TagCheckFun()
-    after
-       set_env(Config, base_login_env())
-    end.
-
-tag_query_configuration() ->
-    [{tag_queries,
-      [{administrator, {constant, false}},
-       %% Query result for tag `management` is FALSE
-       %% because this object does NOT exist.
-       {management,
-        {exists, "cn=${username},ou=Faculty,dc=Computer Science,dc=Engineering"}},
-       {monitor, {constant, true}},
-       %% Query result for tag `normal` is TRUE because
-       %% this object exists.
-       {normal,
-        {exists, "cn=${username},ou=people,dc=rabbitmq,dc=com"}}]}].
-
-internal_authorization_setup(Config) ->
-    ok = control_action(Config, add_user, ["Edward", ""]),
-    ok = control_action(Config, set_user_tags, ["Edward"] ++
-        [ atom_to_list(T) || T <- internal_authorization_tags() ]).
-
-internal_authorization_teardown(Config) ->
-    control_action(Config, delete_user, ["Edward"]).
-
-internal_authorization_tags() ->
-    [foo, bar].
-
-%% Logging tests, triggered within 'test_login/4'
-logging(Config) ->
-    lists:flatten(
-      [test_login(Config, {N, Env}, L, FilterList, case {LGood, EnvGood} of
-                                               {good, good} -> fun succ/1;
-                                               _            -> fun fail/1
-                                           end) ||
-          {LGood, FilterList, L}  <- logging_test_users(Config),
-          {N, {EnvGood, Env}}     <- logging_envs()]).
-
-%% Format for logging tests, {Outcome, FilterList, Login}.
-logging_test_users(Config) ->
-    P = #amqp_params_network{port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp)},
-    [{bad,  [], P#amqp_params_network{username = <<?ALICE_NAME>>}},
-     {good, [], P?ALICE}].
-
-logging_envs() ->
-    [{1, {good, scrub_bind_creds_env()}},
-     {2, {good, display_bind_creds_env()}},
-     {3, {bad,  scrub_bind_single_cred_env()}},
-     {4, {bad,  scrub_bind_creds_no_equals_env()}},
-     {5, {bad,  scrub_bind_creds_no_seperator_env()}}].
-
-scrub_bind_creds_env() ->
-    [{log,         network},
-     {other_bind,  {"cn=admin,dc=rabbitmq,dc=com", "admin"}}].
-
-display_bind_creds_env() ->
-    [{log,         network_unsafe},
-     {other_bind,  {"cn=admin,dc=rabbitmq,dc=com", "admin"}}].
-
-scrub_bind_single_cred_env() ->
-    [{log,         network},
-     {other_bind,  {"dc=com", "admin"}}].
-
-scrub_bind_creds_no_equals_env() ->
-    [{log,         network},
-     {other_bind,  {"cn*admin,dc>rabbitmq,dc&com", "admin"}}].
-
-scrub_bind_creds_no_seperator_env() ->
-    [{log,         network},
-     {other_bind,  {"cn=admindc=rabbitmqdc&com", "admin"}}].
-
-%%--------------------------------------------------------------------
-
-test_resources(PTRs) -> [test_resource(PTR) || PTR <- PTRs].
-
-test_resource({Person, Things, Result}) ->
-    {ok, Conn} = amqp_connection:start(Person),
-    {ok, Ch} = amqp_connection:open_channel(Conn),
-    ?assertEqual(Result,
-                 try
-                     [amqp_channel:call(Ch, T) || T <- Things],
-                     ok
-                 catch exit:_ -> fail
-                 after
-                     amqp_connection:close(Conn)
-                 end).
-
-control_action(Config, Command, Args) ->
-    Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    control_action(Config, Command, Node, Args, default_options()).
-
-control_action(Config, Command, Args, NewOpts) ->
-    Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    control_action(Config, Command, Node, Args,
-                   expand_options(default_options(), NewOpts)).
-
-control_action(_Config, Command, Node, Args, Opts) ->
-    case catch rabbit_control_main:action(
-                 Command, Node, Args, Opts,
-                 fun (Format, Args1) ->
-                         io:format(Format ++ " ...~n", Args1)
-                 end) of
-        ok ->
-            io:format("done.~n"),
-            ok;
-        Other ->
-            io:format("failed.~n"),
-            Other
-    end.
-
-default_options() -> [{"-p", ?VHOST}, {"-q", "false"}].
-
-expand_options(As, Bs) ->
-    lists:foldl(fun({K, _}=A, R) ->
-                        case proplists:is_defined(K, R) of
-                            true  -> R;
-                            false -> [A | R]
-                        end
-                end, Bs, As).
-
diff --git a/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/unit_SUITE.erl b/rabbitmq-server/deps/rabbitmq_auth_backend_ldap/test/unit_SUITE.erl
deleted file mode 100644 (file)
index b4a2b10..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--compile([export_all]).
-
-all() ->
-    [
-     fill
-    ].
-
-fill(_Config) ->
-    F = fun(Fmt, Args, Res) ->
-                ?assertEqual(Res, rabbit_auth_backend_ldap_util:fill(Fmt, Args))
-        end,
-    F("x${username}x", [{username,  "ab"}],     "xabx"),
-    F("x${username}x", [{username,  ab}],       "xabx"),
-    F("x${username}x", [{username,  <<"ab">>}], "xabx"),
-    F("x${username}x", [{username,  ""}],       "xx"),
-    F("x${username}x", [{fusername, "ab"}],     "x${username}x"),
-    F("x${usernamex",  [{username,  "ab"}],     "x${usernamex"),
-    F("x${username}x", [{username,  "a\\b"}],   "xa\\bx"),
-    F("x${username}x", [{username,  "a&b"}],    "xa&bx"),
-    ok.
diff --git a/rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/erlang.mk b/rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/erlang.mk
deleted file mode 100644 (file)
index 1688ee8..0000000
+++ /dev/null
@@ -1,6640 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_auth_mechanism_ssl/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/Makefile b/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/Makefile
deleted file mode 100644 (file)
index df05a55..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-PROJECT = rabbitmq_consistent_hash_exchange
-
-DEPS = amqp_client
-TEST_DEPS += rabbit
-
-DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
-
-# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
-# reviewed and merged.
-
-ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
-ERLANG_MK_COMMIT = rabbitmq-tmp
-
-include rabbitmq-components.mk
-
-# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now.
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
-include erlang.mk
diff --git a/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/erlang.mk b/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/erlang.mk
deleted file mode 100644 (file)
index 1688ee8..0000000
+++ /dev/null
@@ -1,6640 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/test/rabbit_exchange_type_consistent_hash_SUITE.erl b/rabbitmq-server/deps/rabbitmq_consistent_hash_exchange/test/rabbit_exchange_type_consistent_hash_SUITE.erl
deleted file mode 100644 (file)
index d13b94a..0000000
+++ /dev/null
@@ -1,254 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Consistent Hash Exchange.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_exchange_type_consistent_hash_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                routing_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Test cases
-%% -------------------------------------------------------------------
-
-routing_test(Config) ->
-    %% Run the test twice to test we clean up correctly
-    routing_test0(Config, [<<"q0">>, <<"q1">>, <<"q2">>, <<"q3">>]),
-    routing_test0(Config, [<<"q4">>, <<"q5">>, <<"q6">>, <<"q7">>]),
-
-    passed.
-
-routing_test0(Config, Qs) ->
-    ok = test_with_rk(Config, Qs),
-    ok = test_with_header(Config, Qs),
-    ok = test_binding_with_negative_routing_key(Config),
-    ok = test_binding_with_non_numeric_routing_key(Config),
-    ok = test_with_correlation_id(Config, Qs),
-    ok = test_with_message_id(Config, Qs),
-    ok = test_with_timestamp(Config, Qs),
-    ok = test_non_supported_property(Config),
-    ok = test_mutually_exclusive_arguments(Config),
-    ok.
-
-%% -------------------------------------------------------------------
-%% Implementation
-%% -------------------------------------------------------------------
-
-test_with_rk(Config, Qs) ->
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = <<"e">>, routing_key = rnd()}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{}, payload = <<>>}
-          end, [], Qs).
-
-test_with_header(Config, Qs) ->
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = <<"e">>}
-          end,
-          fun() ->
-                  H = [{<<"hashme">>, longstr, rnd()}],
-                  #amqp_msg{props = #'P_basic'{headers = H}, payload = <<>>}
-          end, [{<<"hash-header">>, longstr, <<"hashme">>}], Qs).
-
-
-test_with_correlation_id(Config, Qs) ->
-    test0(Config, fun() ->
-                  #'basic.publish'{exchange = <<"e">>}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{correlation_id = rnd()}, payload = <<>>}
-          end, [{<<"hash-property">>, longstr, <<"correlation_id">>}], Qs).
-
-test_with_message_id(Config, Qs) ->
-    test0(Config, fun() ->
-                  #'basic.publish'{exchange = <<"e">>}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{message_id = rnd()}, payload = <<>>}
-          end, [{<<"hash-property">>, longstr, <<"message_id">>}], Qs).
-
-test_with_timestamp(Config, Qs) ->
-    test0(Config, fun() ->
-                  #'basic.publish'{exchange = <<"e">>}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{timestamp = rndint()}, payload = <<>>}
-          end, [{<<"hash-property">>, longstr, <<"timestamp">>}], Qs).
-
-test_mutually_exclusive_arguments(Config) ->
-    Chan = rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    process_flag(trap_exit, true),
-    Cmd = #'exchange.declare'{
-             exchange  = <<"fail">>,
-             type      = <<"x-consistent-hash">>,
-             arguments = [{<<"hash-header">>, longstr, <<"foo">>},
-                          {<<"hash-property">>, longstr, <<"bar">>}]
-            },
-    ?assertExit(_, amqp_channel:call(Chan, Cmd)),
-
-    rabbit_ct_client_helpers:close_channel(Chan),
-    ok.
-
-test_non_supported_property(Config) ->
-    Chan = rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    process_flag(trap_exit, true),
-    Cmd = #'exchange.declare'{
-             exchange  = <<"fail">>,
-             type      = <<"x-consistent-hash">>,
-             arguments = [{<<"hash-property">>, longstr, <<"app_id">>}]
-            },
-    ?assertExit(_, amqp_channel:call(Chan, Cmd)),
-
-    rabbit_ct_client_helpers:close_channel(Chan),
-    ok.
-
-rnd() ->
-    list_to_binary(integer_to_list(rndint())).
-
-rndint() ->
-    rand_compat:uniform(1000000).
-
-test0(Config, MakeMethod, MakeMsg, DeclareArgs, [Q1, Q2, Q3, Q4] = Queues) ->
-    Count = 10000,
-    Chan = rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = <<"e">>,
-                            type = <<"x-consistent-hash">>,
-                            auto_delete = true,
-                            arguments = DeclareArgs
-                          }),
-    [#'queue.declare_ok'{} =
-         amqp_channel:call(Chan, #'queue.declare' {
-                             queue = Q, exclusive = true }) || Q <- Queues],
-    [#'queue.bind_ok'{} =
-         amqp_channel:call(Chan, #'queue.bind' {queue = Q,
-                                                exchange = <<"e">>,
-                                                routing_key = <<"10">>})
-     || Q <- [Q1, Q2]],
-    [#'queue.bind_ok'{} =
-         amqp_channel:call(Chan, #'queue.bind' {queue = Q,
-                                                exchange = <<"e">>,
-                                                routing_key = <<"20">>})
-     || Q <- [Q3, Q4]],
-    #'tx.select_ok'{} = amqp_channel:call(Chan, #'tx.select'{}),
-    [amqp_channel:call(Chan,
-                       MakeMethod(),
-                       MakeMsg()) || _ <- lists:duplicate(Count, const)],
-    amqp_channel:call(Chan, #'tx.commit'{}),
-    Counts =
-        [begin
-             #'queue.declare_ok'{message_count = M} =
-                 amqp_channel:call(Chan, #'queue.declare' {queue     = Q,
-                                                           exclusive = true}),
-             M
-         end || Q <- Queues],
-    Count = lists:sum(Counts), %% All messages got routed
-    [true = C > 0.01 * Count || C <- Counts], %% We are not *grossly* unfair
-    amqp_channel:call(Chan, #'exchange.delete' {exchange = <<"e">>}),
-    [amqp_channel:call(Chan, #'queue.delete' {queue = Q}) || Q <- Queues],
-
-    rabbit_ct_client_helpers:close_channel(Chan),
-    ok.
-
-test_binding_with_negative_routing_key(Config) ->
-    Chan = rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    Declare1 = #'exchange.declare'{exchange = <<"bind-fail">>,
-                                   type = <<"x-consistent-hash">>},
-    #'exchange.declare_ok'{} = amqp_channel:call(Chan, Declare1),
-    Q = <<"test-queue">>,
-    Declare2 = #'queue.declare'{queue = Q},
-    #'queue.declare_ok'{} = amqp_channel:call(Chan, Declare2),
-    process_flag(trap_exit, true),
-    Cmd = #'queue.bind'{exchange = <<"bind-fail">>,
-                        routing_key = <<"-1">>},
-    ?assertExit(_, amqp_channel:call(Chan, Cmd)),
-    Ch2 = rabbit_ct_client_helpers:open_channel(Config, 0),
-    amqp_channel:call(Ch2, #'queue.delete'{queue = Q}),
-
-    rabbit_ct_client_helpers:close_channel(Chan),
-    rabbit_ct_client_helpers:close_channel(Ch2),
-    ok.
-
-test_binding_with_non_numeric_routing_key(Config) ->
-    Chan = rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    Declare1 = #'exchange.declare'{exchange = <<"bind-fail">>,
-                                   type = <<"x-consistent-hash">>},
-    #'exchange.declare_ok'{} = amqp_channel:call(Chan, Declare1),
-    Q = <<"test-queue">>,
-    Declare2 = #'queue.declare'{queue = Q},
-    #'queue.declare_ok'{} = amqp_channel:call(Chan, Declare2),
-    process_flag(trap_exit, true),
-    Cmd = #'queue.bind'{exchange = <<"bind-fail">>,
-                        routing_key = <<"not-a-number">>},
-    ?assertExit(_, amqp_channel:call(Chan, Cmd)),
-
-    Ch2 = rabbit_ct_client_helpers:open_channel(Config, 0),
-    amqp_channel:call(Ch2, #'queue.delete'{queue = Q}),
-
-    rabbit_ct_client_helpers:close_channel(Chan),
-    ok.
diff --git a/rabbitmq-server/deps/rabbitmq_event_exchange/Makefile b/rabbitmq-server/deps/rabbitmq_event_exchange/Makefile
deleted file mode 100644 (file)
index a12edbc..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-PROJECT = rabbitmq_event_exchange
-
-TEST_DEPS += amqp_client
-TEST_DEPS += rabbit 
-
-DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
-
-# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
-# reviewed and merged.
-ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
-ERLANG_MK_COMMIT = rabbitmq-tmp
-
-include rabbitmq-components.mk
-
-# --------------------------------------------------------------------
-# Testing.
-# --------------------------------------------------------------------
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
-include erlang.mk
diff --git a/rabbitmq-server/deps/rabbitmq_event_exchange/build.config b/rabbitmq-server/deps/rabbitmq_event_exchange/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_event_exchange/erlang.mk b/rabbitmq-server/deps/rabbitmq_event_exchange/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_event_exchange/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_event_exchange/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_event_exchange/test/system_SUITE.erl b/rabbitmq-server/deps/rabbitmq_event_exchange/test/system_SUITE.erl
deleted file mode 100644 (file)
index 740d156..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Consistent Hash Exchange.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(system_SUITE).
--include_lib("common_test/include/ct.hrl").
-
--include_lib("amqp_client/include/amqp_client.hrl").
--compile(export_all).
-
-all() ->
-    [
-     queue_created,
-     authentication
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    Config2 = rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()),
-    Config2.
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).   
-
-
-%% -------------------------------------------------------------------
-%% Testsuite cases 
-%% -------------------------------------------------------------------
-
-%% Only really tests that we're not completely broken.
-queue_created(Config) ->
-    Now = time_compat:os_system_time(seconds),
-
-    Ch =  rabbit_ct_client_helpers:open_channel(Config, 0),
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Ch, #'queue.declare'{exclusive = true}),
-    amqp_channel:call(Ch, #'queue.bind'{queue       = Q,
-                                        exchange    = <<"amq.rabbitmq.event">>,
-                                        routing_key = <<"queue.*">>}),
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue = Q, no_ack = true},
-                           self()),
-    receive
-        #'basic.consume_ok'{} -> ok
-    end,
-
-    #'queue.declare_ok'{queue = Q2} =
-        amqp_channel:call(Ch, #'queue.declare'{exclusive = true}),
-
-    receive
-        {#'basic.deliver'{routing_key = Key},
-         #amqp_msg{props = #'P_basic'{headers = Headers, timestamp = TS}}} ->
-            %% timestamp is within the last 5 seconds
-            true = ((TS - Now) =< 5),
-            <<"queue.created">> = Key,
-            {longstr, Q2} = rabbit_misc:table_lookup(Headers, <<"name">>)
-    end,
-
-    rabbit_ct_client_helpers:close_channel(Ch),
-    ok.
-
-
-authentication(Config) ->
-    Ch =  rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Ch, #'queue.declare'{exclusive = true}),
-    amqp_channel:call(Ch, #'queue.bind'{queue       = Q,
-                                        exchange    = <<"amq.rabbitmq.event">>,
-                                        routing_key = <<"user.#">>}),
-    Conn2 = rabbit_ct_client_helpers:open_unmanaged_connection(Config, 0),
-
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue = Q, no_ack = true},
-                           self()),
-    receive
-        #'basic.consume_ok'{} -> ok
-    end,
-
-    receive
-        {#'basic.deliver'{routing_key = Key},
-         #amqp_msg{props = #'P_basic'{headers = Headers}}} ->
-            <<"user.authentication.success">> = Key,
-            undefined = rabbit_misc:table_lookup(Headers, <<"vhost">>),
-            {longstr, _PeerHost} = rabbit_misc:table_lookup(Headers, <<"peer_host">>),
-            {bool, false} = rabbit_misc:table_lookup(Headers, <<"ssl">>)
-    end,
-
-    amqp_connection:close(Conn2),
-    ok.
diff --git a/rabbitmq-server/deps/rabbitmq_event_exchange/test/unit_SUITE.erl b/rabbitmq-server/deps/rabbitmq_event_exchange/test/unit_SUITE.erl
deleted file mode 100644 (file)
index 18d691b..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Consistent Hash Exchange.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
-
--compile(export_all).
-
-all() -> [ encoding ].
-
-encoding(_) ->
-    T = fun (In, Exp) -> 
-                true = (rabbit_exchange_type_event:fmt_proplist(In) == Exp) end,
-    T([{name, <<"test">>}],
-      [{<<"name">>, longstr, <<"test">>}]),
-    T([{name, rabbit_misc:r(<<"/">>, exchange, <<"test">>)}],
-      [{<<"name">>, longstr, <<"test">>},
-       {<<"vhost">>, longstr, <<"/">>}]),
-    T([{name,     <<"test">>},
-       {number,   1},
-       {real,     1.0},
-       {bool,     true},
-       {atom,     hydrogen},
-       {weird,    {1,2,3,[a|1],"a"}},
-       {list,     [1,2,[a,b]]},
-       {proplist, [{foo, a},
-                   {bar, [{baz,  b},
-                          {bash, c}]}]}
-      ],
-      [{<<"name">>,     longstr, <<"test">>},
-       {<<"number">>,   long,    1},
-       {<<"real">>,     float,   1.0},
-       {<<"bool">>,     bool,    true},
-       {<<"atom">>,     longstr, <<"hydrogen">>},
-       {<<"weird">>,    longstr, <<"{1,2,3,[a|1],\"a\"}">>},
-       {<<"list">>,     array,   [{long,  1},
-                                  {long,  2},
-                                  {array, [{longstr, <<"a">>},
-                                           {longstr, <<"b">>}]}]},
-       {<<"proplist">>, table,
-        [{<<"foo">>, longstr, <<"a">>},
-         {<<"bar">>, table,   [{<<"baz">>,  longstr, <<"b">>},
-                               {<<"bash">>, longstr, <<"c">>}]}]}       
-      ]),
-    ok.
diff --git a/rabbitmq-server/deps/rabbitmq_federation/Makefile b/rabbitmq-server/deps/rabbitmq_federation/Makefile
deleted file mode 100644 (file)
index 7a28a0e..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-PROJECT = rabbitmq_federation
-
-DEPS = amqp_client
-TEST_DEPS += rabbit
-
-DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
-
-# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
-# reviewed and merged.
-
-ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
-ERLANG_MK_COMMIT = rabbitmq-tmp
-
-include rabbitmq-components.mk
-
-# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now.
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
-include erlang.mk
diff --git a/rabbitmq-server/deps/rabbitmq_federation/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_federation/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_federation/test/exchange_SUITE.erl b/rabbitmq-server/deps/rabbitmq_federation/test/exchange_SUITE.erl
deleted file mode 100644 (file)
index 16fe2c9..0000000
+++ /dev/null
@@ -1,885 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Federation.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(exchange_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--include("rabbit_federation.hrl").
-
--compile(export_all).
-
--import(rabbit_federation_test_util,
-        [expect/3, expect_empty/2,
-         set_upstream/4, clear_upstream/3, set_upstream_set/4,
-         set_policy/5, clear_policy/3,
-         set_policy_upstream/5, set_policy_upstreams/4,
-         no_plugins/1]).
-
--define(UPSTREAM_DOWNSTREAM, [x(<<"upstream">>),
-                              x(<<"fed.downstream">>)]).
-
-all() ->
-    [
-      {group, without_disambiguate},
-      {group, with_disambiguate}
-    ].
-
-groups() ->
-    [
-      {without_disambiguate, [], [
-          {cluster_size_1, [], [
-              simple,
-              multiple_upstreams,
-              multiple_uris,
-              multiple_downstreams,
-              e2e,
-              unbind_on_delete,
-              unbind_on_unbind,
-              unbind_gets_transmitted,
-              no_loop,
-              dynamic_reconfiguration,
-              dynamic_reconfiguration_integrity,
-              federate_unfederate,
-              dynamic_plugin_stop_start
-            ]}
-        ]},
-      {with_disambiguate, [], [
-          {cluster_size_1, [], [
-              binding_recovery
-            ]},
-          {cluster_size_2, [], [
-              user_id,
-              restart_upstream,
-              cycle_detection
-            ]},
-          {cluster_size_3, [], [
-              max_hops,
-              binding_propagation
-            ]},
-
-          {without_plugins, [], [
-              {cluster_size_2, [], [
-                  upstream_has_no_federation
-                ]}
-            ]}
-        ]}
-    ].
-
-suite() ->
-    [{timetrap, {minutes, 5}}].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(without_disambiguate, Config) ->
-    rabbit_ct_helpers:set_config(Config,
-      {disambiguate_step, []});
-init_per_group(with_disambiguate, Config) ->
-    rabbit_ct_helpers:set_config(Config,
-      {disambiguate_step, [fun rabbit_federation_test_util:disambiguate/1]});
-init_per_group(without_plugins, Config) ->
-    rabbit_ct_helpers:set_config(Config,
-      {broker_with_plugins, [true, false]});
-init_per_group(cluster_size_1 = Group, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 1}
-      ]),
-    init_per_group1(Group, Config1);
-init_per_group(cluster_size_2 = Group, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 2}
-      ]),
-    init_per_group1(Group, Config1);
-init_per_group(cluster_size_3 = Group, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 3}
-      ]),
-    init_per_group1(Group, Config1).
-
-init_per_group1(Group, Config) ->
-    SetupFederation = case Group of
-        cluster_size_1 -> [fun rabbit_federation_test_util:setup_federation/1];
-        cluster_size_2 -> [];
-        cluster_size_3 -> []
-    end,
-    Disambiguate = ?config(disambiguate_step, Config),
-    Suffix = rabbit_ct_helpers:testcase_absname(Config, "", "-"),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, Suffix},
-        {rmq_nodes_clustered, false}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++
-      SetupFederation ++ Disambiguate).
-
-end_per_group(without_disambiguate, Config) ->
-    Config;
-end_per_group(with_disambiguate, Config) ->
-    Config;
-end_per_group(without_plugins, Config) ->
-    Config;
-end_per_group(_, Config) ->
-    rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-simple(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q = bind_queue(Ch, <<"fed.downstream">>, <<"key">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key">>),
-              publish_expect(Ch, <<"upstream">>, <<"key">>, Q, <<"HELLO">>)
-      end, ?UPSTREAM_DOWNSTREAM).
-
-multiple_upstreams(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q = bind_queue(Ch, <<"fed12.downstream">>, <<"key">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key">>),
-              await_binding(Config, 0, <<"upstream2">>, <<"key">>),
-              publish_expect(Ch, <<"upstream">>, <<"key">>, Q, <<"HELLO1">>),
-              publish_expect(Ch, <<"upstream2">>, <<"key">>, Q, <<"HELLO2">>)
-      end, [x(<<"upstream">>),
-            x(<<"upstream2">>),
-            x(<<"fed12.downstream">>)]).
-
-multiple_uris(Config) ->
-    %% We can't use a direct connection for Kill() to work.
-    URIs = [
-      rabbit_ct_broker_helpers:node_uri(Config, 0),
-      rabbit_ct_broker_helpers:node_uri(Config, 0, [use_ipaddr])
-    ],
-    set_upstream(Config, 0, <<"localhost">>, URIs),
-    WithCh = fun(F) ->
-                     Ch = rabbit_ct_client_helpers:open_channel(Config, 0),
-                     F(Ch),
-                     rabbit_ct_client_helpers:close_channels_and_connection(
-                       Config, 0)
-             end,
-    WithCh(fun (Ch) -> declare_all(Ch, ?UPSTREAM_DOWNSTREAM) end),
-    expect_uris(Config, 0, URIs),
-    WithCh(fun (Ch) -> delete_all(Ch, ?UPSTREAM_DOWNSTREAM) end),
-    %% Put back how it was
-    rabbit_federation_test_util:setup_federation(Config),
-    ok.
-
-expect_uris(_, _, []) ->
-    ok;
-expect_uris(Config, Node, URIs) ->
-    [Link] = rabbit_ct_broker_helpers:rpc(Config, Node,
-      rabbit_federation_status, status, []),
-    URI = rabbit_misc:pget(uri, Link),
-    kill_only_connection(Config, Node),
-    expect_uris(Config, Node, URIs -- [URI]).
-
-kill_only_connection(Config, Node) ->
-    case connection_pids(Config, Node) of
-        [Pid] -> catch rabbit_ct_broker_helpers:rpc(Config, Node,
-                   rabbit_networking, close_connection, [Pid, "boom"]), %% [1]
-                 wait_for_pid_to_die(Config, Node, Pid);
-        _     -> timer:sleep(100),
-                 kill_only_connection(Config, Node)
-    end.
-
-%% [1] the catch is because we could still see a connection from a
-%% previous time round. If so that's fine (we'll just loop around
-%% again) but we don't want the test to fail because a connection
-%% closed as we were trying to close it.
-
-wait_for_pid_to_die(Config, Node, Pid) ->
-    case connection_pids(Config, Node) of
-        [Pid] -> timer:sleep(100),
-                 wait_for_pid_to_die(Config, Node, Pid);
-        _     -> ok
-    end.
-
-
-multiple_downstreams(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q1 = bind_queue(Ch, <<"fed.downstream">>, <<"key">>),
-              Q12 = bind_queue(Ch, <<"fed12.downstream2">>, <<"key">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key">>, 2),
-              await_binding(Config, 0, <<"upstream2">>, <<"key">>),
-              publish(Ch, <<"upstream">>, <<"key">>, <<"HELLO1">>),
-              publish(Ch, <<"upstream2">>, <<"key">>, <<"HELLO2">>),
-              expect(Ch, Q1, [<<"HELLO1">>]),
-              expect(Ch, Q12, [<<"HELLO1">>, <<"HELLO2">>])
-      end, ?UPSTREAM_DOWNSTREAM ++
-          [x(<<"upstream2">>),
-           x(<<"fed12.downstream2">>)]).
-
-e2e(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              bind_exchange(Ch, <<"downstream2">>, <<"fed.downstream">>,
-                            <<"key">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key">>),
-              Q = bind_queue(Ch, <<"downstream2">>, <<"key">>),
-              publish_expect(Ch, <<"upstream">>, <<"key">>, Q, <<"HELLO1">>)
-      end, ?UPSTREAM_DOWNSTREAM ++ [x(<<"downstream2">>)]).
-
-unbind_on_delete(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q1 = bind_queue(Ch, <<"fed.downstream">>, <<"key">>),
-              Q2 = bind_queue(Ch, <<"fed.downstream">>, <<"key">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key">>),
-              delete_queue(Ch, Q2),
-              publish_expect(Ch, <<"upstream">>, <<"key">>, Q1, <<"HELLO">>)
-      end, ?UPSTREAM_DOWNSTREAM).
-
-unbind_on_unbind(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q1 = bind_queue(Ch, <<"fed.downstream">>, <<"key">>),
-              Q2 = bind_queue(Ch, <<"fed.downstream">>, <<"key">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key">>),
-              unbind_queue(Ch, Q2, <<"fed.downstream">>, <<"key">>),
-              publish_expect(Ch, <<"upstream">>, <<"key">>, Q1, <<"HELLO">>),
-              delete_queue(Ch, Q2)
-      end, ?UPSTREAM_DOWNSTREAM).
-
-user_id(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_policy_upstream(Config, Rabbit, <<"^test$">>,
-      rabbit_ct_broker_helpers:node_uri(Config, 1), []),
-    Perm = fun (F, A) ->
-                  ok = rpc:call(Hare,
-                                rabbit_auth_backend_internal, F, A)
-           end,
-    Perm(add_user, [<<"hare-user">>, <<"hare-user">>]),
-    Perm(set_permissions, [<<"hare-user">>,
-                           <<"/">>, <<".*">>, <<".*">>, <<".*">>]),
-
-    Ch = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    {ok, Conn2} = amqp_connection:start(
-      #amqp_params_network{
-        username = <<"hare-user">>,
-        password = <<"hare-user">>,
-        port     = rabbit_ct_broker_helpers:get_node_config(Config, Hare,
-          tcp_port_amqp)}),
-    {ok, Ch2} = amqp_connection:open_channel(Conn2),
-
-    declare_exchange(Ch2, x(<<"test">>)),
-    declare_exchange(Ch, x(<<"test">>)),
-    Q = bind_queue(Ch, <<"test">>, <<"key">>),
-    await_binding(Config, Hare, <<"test">>, <<"key">>),
-
-    Msg = #amqp_msg{props   = #'P_basic'{user_id = <<"hare-user">>},
-                    payload = <<"HELLO">>},
-
-    SafeUri = fun (H) ->
-                      {array, [{table, Recv}]} =
-                          rabbit_misc:table_lookup(
-                            H, <<"x-received-from">>),
-                      URI = rabbit_ct_broker_helpers:node_uri(Config, 1),
-                      {longstr, URI} =
-                         rabbit_misc:table_lookup(Recv, <<"uri">>)
-              end,
-    ExpectUser =
-        fun (ExpUser) ->
-                fun () ->
-                        receive
-                            {#'basic.deliver'{},
-                             #amqp_msg{props   = Props,
-                                       payload = Payload}} ->
-                                #'P_basic'{user_id = ActUser,
-                                           headers = Headers} = Props,
-                                SafeUri(Headers),
-                                <<"HELLO">> = Payload,
-                                ExpUser = ActUser
-                        end
-                end
-        end,
-
-    publish(Ch2, <<"test">>, <<"key">>, Msg),
-    expect(Ch, Q, ExpectUser(undefined)),
-
-    set_policy_upstream(Config, Rabbit, <<"^test$">>,
-      rabbit_ct_broker_helpers:node_uri(Config, 1),
-      [{<<"trust-user-id">>, true}]),
-
-    publish(Ch2, <<"test">>, <<"key">>, Msg),
-    expect(Ch, Q, ExpectUser(<<"hare-user">>)),
-
-    amqp_channel:close(Ch2),
-    amqp_connection:close(Conn2),
-
-    ok.
-
-%% In order to test that unbinds get sent we deliberately set up a
-%% broken config - with topic upstream and fanout downstream. You
-%% shouldn't really do this, but it lets us see "extra" messages that
-%% get sent.
-unbind_gets_transmitted(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q11 = bind_queue(Ch, <<"fed.downstream">>, <<"key1">>),
-              Q12 = bind_queue(Ch, <<"fed.downstream">>, <<"key1">>),
-              Q21 = bind_queue(Ch, <<"fed.downstream">>, <<"key2">>),
-              Q22 = bind_queue(Ch, <<"fed.downstream">>, <<"key2">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key1">>),
-              await_binding(Config, 0, <<"upstream">>, <<"key2">>),
-              [delete_queue(Ch, Q) || Q <- [Q12, Q21, Q22]],
-              publish(Ch, <<"upstream">>, <<"key1">>, <<"YES">>),
-              publish(Ch, <<"upstream">>, <<"key2">>, <<"NO">>),
-              expect(Ch, Q11, [<<"YES">>]),
-              expect_empty(Ch, Q11)
-      end, [x(<<"upstream">>),
-            x(<<"fed.downstream">>)]).
-
-no_loop(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Q1 = bind_queue(Ch, <<"one">>, <<"key">>),
-              Q2 = bind_queue(Ch, <<"two">>, <<"key">>),
-              await_binding(Config, 0, <<"one">>, <<"key">>, 2),
-              await_binding(Config, 0, <<"two">>, <<"key">>, 2),
-              publish(Ch, <<"one">>, <<"key">>, <<"Hello from one">>),
-              publish(Ch, <<"two">>, <<"key">>, <<"Hello from two">>),
-              expect(Ch, Q1, [<<"Hello from one">>, <<"Hello from two">>]),
-              expect(Ch, Q2, [<<"Hello from one">>, <<"Hello from two">>]),
-              expect_empty(Ch, Q1),
-              expect_empty(Ch, Q2)
-      end, [x(<<"one">>),
-            x(<<"two">>)]).
-
-binding_recovery(Config) ->
-    [Rabbit] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    Q = <<"durable-Q">>,
-    Ch = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-
-    rabbit_federation_test_util:set_upstream(Config,
-      Rabbit, <<"rabbit">>,
-      rabbit_ct_broker_helpers:node_uri(Config, Rabbit)),
-    rabbit_federation_test_util:set_upstream_set(Config,
-      Rabbit, <<"upstream">>,
-      [{<<"rabbit">>, [{<<"exchange">>, <<"upstream">>}]},
-       {<<"rabbit">>, [{<<"exchange">>, <<"upstream2">>}]}]),
-    rabbit_federation_test_util:set_policy(Config,
-      Rabbit, <<"fed">>, <<"^fed\\.">>, <<"upstream">>),
-
-    declare_all(Ch, [x(<<"upstream2">>) | ?UPSTREAM_DOWNSTREAM]),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Ch, #'queue.declare'{queue   = Q,
-                                               durable = true}),
-    bind_queue(Ch, Q, <<"fed.downstream">>, <<"key">>),
-    timer:sleep(100), %% To get the suffix written
-
-    %% i.e. don't clean up
-    rabbit_ct_client_helpers:close_channels_and_connection(Config, Rabbit),
-    rabbit_ct_broker_helpers:restart_node(Config, Rabbit),
-
-    true = (none =/= suffix(Config, Rabbit, <<"rabbit">>, "upstream")),
-    true = (none =/= suffix(Config, Rabbit, <<"rabbit">>, "upstream2")),
-
-    %% again don't clean up
-    rabbit_ct_broker_helpers:restart_node(Config, Rabbit),
-    Ch3 = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-
-    rabbit_ct_broker_helpers:set_parameter(Config,
-      Rabbit, <<"federation-upstream-set">>, <<"upstream">>,
-      [[{<<"upstream">>, <<"rabbit">>}, {<<"exchange">>, <<"upstream">>}]]),
-
-    publish_expect(Ch3, <<"upstream">>, <<"key">>, Q, <<"HELLO">>),
-    true = (none =/= suffix(Config, Rabbit, <<"rabbit">>, "upstream")),
-    none = suffix(Config, Rabbit, <<"rabbit">>, "upstream2"),
-    delete_all(Ch3, [x(<<"upstream2">>) | ?UPSTREAM_DOWNSTREAM]),
-    delete_queue(Ch3, Q),
-    ok.
-
-suffix(Config, Node, Name, XName) ->
-    rabbit_ct_broker_helpers:rpc(Config, Node,
-      rabbit_federation_db, get_active_suffix,
-             [r(<<"fed.downstream">>),
-              #upstream{name          = Name,
-                        exchange_name = list_to_binary(XName)}, none]).
-
-restart_upstream(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    Downstream = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    Upstream   = rabbit_ct_client_helpers:open_channel(Config, Hare),
-
-    rabbit_federation_test_util:set_upstream(Config,
-      Rabbit, <<"hare">>, rabbit_ct_broker_helpers:node_uri(Config, 1)),
-    rabbit_federation_test_util:set_upstream_set(Config,
-      Rabbit, <<"upstream">>,
-      [{<<"hare">>, [{<<"exchange">>, <<"upstream">>}]}]),
-    rabbit_federation_test_util:set_policy(Config,
-      Rabbit, <<"hare">>, <<"^hare\\.">>, <<"upstream">>),
-
-    declare_exchange(Upstream, x(<<"upstream">>)),
-    declare_exchange(Downstream, x(<<"hare.downstream">>)),
-
-    Qstays = bind_queue(Downstream, <<"hare.downstream">>, <<"stays">>),
-    Qgoes = bind_queue(Downstream, <<"hare.downstream">>, <<"goes">>),
-
-    rabbit_ct_client_helpers:close_channels_and_connection(Config, Hare),
-    rabbit_ct_broker_helpers:stop_node(Config, Hare),
-
-    Qcomes = bind_queue(Downstream, <<"hare.downstream">>, <<"comes">>),
-    unbind_queue(Downstream, Qgoes, <<"hare.downstream">>, <<"goes">>),
-
-    rabbit_ct_broker_helpers:start_node(Config, Hare),
-    Upstream1 = rabbit_ct_client_helpers:open_channel(Config, Hare),
-
-    %% Wait for the link to come up and for these bindings
-    %% to be transferred
-    await_binding(Config, Hare, <<"upstream">>, <<"comes">>, 1),
-    await_binding_absent(Config, Hare, <<"upstream">>, <<"goes">>),
-    await_binding(Config, Hare, <<"upstream">>, <<"stays">>, 1),
-
-    publish(Upstream1, <<"upstream">>, <<"goes">>, <<"GOES">>),
-    publish(Upstream1, <<"upstream">>, <<"stays">>, <<"STAYS">>),
-    publish(Upstream1, <<"upstream">>, <<"comes">>, <<"COMES">>),
-
-    expect(Downstream, Qstays, [<<"STAYS">>]),
-    expect(Downstream, Qcomes, [<<"COMES">>]),
-    expect_empty(Downstream, Qgoes),
-
-    delete_exchange(Downstream, <<"hare.downstream">>),
-    delete_exchange(Upstream1, <<"upstream">>),
-    ok.
-
-%% flopsy, mopsy and cottontail, connected in a ring with max_hops = 2
-%% for each connection. We should not see any duplicates.
-
-max_hops(Config) ->
-    [Flopsy, Mopsy, Cottontail] = rabbit_ct_broker_helpers:get_node_configs(
-      Config, nodename),
-    [set_policy_upstream(Config, Downstream,
-       <<"^ring$">>,
-       rabbit_ct_broker_helpers:node_uri(Config, Upstream),
-       [{<<"max-hops">>, 2}])
-     || {Downstream, Upstream} <- [{Flopsy, Cottontail},
-                                    {Mopsy, Flopsy},
-                                    {Cottontail, Mopsy}]],
-
-    FlopsyCh     = rabbit_ct_client_helpers:open_channel(Config, Flopsy),
-    MopsyCh      = rabbit_ct_client_helpers:open_channel(Config, Mopsy),
-    CottontailCh = rabbit_ct_client_helpers:open_channel(Config, Cottontail),
-
-    declare_exchange(FlopsyCh,     x(<<"ring">>)),
-    declare_exchange(MopsyCh,      x(<<"ring">>)),
-    declare_exchange(CottontailCh, x(<<"ring">>)),
-
-    Q1 = bind_queue(FlopsyCh,     <<"ring">>, <<"key">>),
-    Q2 = bind_queue(MopsyCh,      <<"ring">>, <<"key">>),
-    Q3 = bind_queue(CottontailCh, <<"ring">>, <<"key">>),
-
-    await_binding(Config, Flopsy,     <<"ring">>, <<"key">>, 3),
-    await_binding(Config, Mopsy,      <<"ring">>, <<"key">>, 3),
-    await_binding(Config, Cottontail, <<"ring">>, <<"key">>, 3),
-
-    publish(FlopsyCh,     <<"ring">>, <<"key">>, <<"HELLO flopsy">>),
-    publish(MopsyCh,      <<"ring">>, <<"key">>, <<"HELLO mopsy">>),
-    publish(CottontailCh, <<"ring">>, <<"key">>, <<"HELLO cottontail">>),
-
-    Msgs = [<<"HELLO flopsy">>, <<"HELLO mopsy">>, <<"HELLO cottontail">>],
-    expect(FlopsyCh,     Q1, Msgs),
-    expect(MopsyCh,      Q2, Msgs),
-    expect(CottontailCh, Q3, Msgs),
-    expect_empty(FlopsyCh,     Q1),
-    expect_empty(MopsyCh,      Q2),
-    expect_empty(CottontailCh, Q3),
-    ok.
-
-%% Two nodes, both federated with each other, and max_hops set to a
-%% high value. Things should not get out of hand.
-cycle_detection(Config) ->
-    [Cycle1, Cycle2] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    [set_policy_upstream(Config, Downstream,
-       <<"^cycle$">>,
-       rabbit_ct_broker_helpers:node_uri(Config, Upstream),
-       [{<<"max-hops">>, 10}])
-     || {Downstream, Upstream} <- [{Cycle1, Cycle2}, {Cycle2, Cycle1}]],
-
-    Cycle1Ch = rabbit_ct_client_helpers:open_channel(Config, Cycle1),
-    Cycle2Ch = rabbit_ct_client_helpers:open_channel(Config, Cycle2),
-
-    declare_exchange(Cycle1Ch, x(<<"cycle">>)),
-    declare_exchange(Cycle2Ch, x(<<"cycle">>)),
-
-    Q1 = bind_queue(Cycle1Ch, <<"cycle">>, <<"key">>),
-    Q2 = bind_queue(Cycle2Ch, <<"cycle">>, <<"key">>),
-
-    %% "key" present twice because once for the local queue and once
-    %% for federation in each case
-    await_binding(Config, Cycle1, <<"cycle">>, <<"key">>, 2),
-    await_binding(Config, Cycle2, <<"cycle">>, <<"key">>, 2),
-
-    publish(Cycle1Ch, <<"cycle">>, <<"key">>, <<"HELLO1">>),
-    publish(Cycle2Ch, <<"cycle">>, <<"key">>, <<"HELLO2">>),
-
-    Msgs = [<<"HELLO1">>, <<"HELLO2">>],
-    expect(Cycle1Ch, Q1, Msgs),
-    expect(Cycle2Ch, Q2, Msgs),
-    expect_empty(Cycle1Ch, Q1),
-    expect_empty(Cycle2Ch, Q2),
-
-    ok.
-
-%% Arrows indicate message flow. Numbers indicate max_hops.
-%%
-%% Dylan ---1--> Bugs ---2--> Jessica
-%% |^                              |^
-%% |\--------------1---------------/|
-%% \---------------1----------------/
-%%
-%%
-%% We want to demonstrate that if we bind a queue locally at each
-%% broker, (exactly) the following bindings propagate:
-%%
-%% Bugs binds to Dylan
-%% Jessica binds to Bugs, which then propagates on to Dylan
-%% Jessica binds to Dylan directly
-%% Dylan binds to Jessica.
-%%
-%% i.e. Dylan has two bindings from Jessica and one from Bugs
-%%      Bugs has one binding from Jessica
-%%      Jessica has one binding from Dylan
-%%
-%% So we tag each binding with its original broker and see how far it gets
-%%
-%% Also we check that when we tear down the original bindings
-%% that we get rid of everything again.
-
-binding_propagation(Config) ->
-    [Dylan, Bugs, Jessica] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    set_policy_upstream(Config, Dylan, <<"^x$">>,
-      rabbit_ct_broker_helpers:node_uri(Config, Jessica), []),
-    set_policy_upstream(Config, Bugs, <<"^x$">>,
-      rabbit_ct_broker_helpers:node_uri(Config, Dylan), []),
-    set_policy_upstreams(Config, Jessica, <<"^x$">>, [
-        {rabbit_ct_broker_helpers:node_uri(Config, Dylan), []},
-        {rabbit_ct_broker_helpers:node_uri(Config, Bugs),
-          [{<<"max-hops">>, 2}]}
-      ]),
-    DylanCh   = rabbit_ct_client_helpers:open_channel(Config, Dylan),
-    BugsCh    = rabbit_ct_client_helpers:open_channel(Config, Bugs),
-    JessicaCh = rabbit_ct_client_helpers:open_channel(Config, Jessica),
-
-    declare_exchange(DylanCh,   x(<<"x">>)),
-    declare_exchange(BugsCh,    x(<<"x">>)),
-    declare_exchange(JessicaCh, x(<<"x">>)),
-
-    Q1 = bind_queue(DylanCh,   <<"x">>, <<"dylan">>),
-    Q2 = bind_queue(BugsCh,    <<"x">>, <<"bugs">>),
-    Q3 = bind_queue(JessicaCh, <<"x">>, <<"jessica">>),
-
-    await_binding(Config,  Dylan,   <<"x">>, <<"jessica">>, 2),
-    await_bindings(Config, Dylan,   <<"x">>, [<<"bugs">>, <<"dylan">>]),
-    await_bindings(Config, Bugs,    <<"x">>, [<<"jessica">>, <<"bugs">>]),
-    await_bindings(Config, Jessica, <<"x">>, [<<"dylan">>, <<"jessica">>]),
-
-    delete_queue(DylanCh,   Q1),
-    delete_queue(BugsCh,    Q2),
-    delete_queue(JessicaCh, Q3),
-
-    await_bindings(Config, Dylan,   <<"x">>, []),
-    await_bindings(Config, Bugs,    <<"x">>, []),
-    await_bindings(Config, Jessica, <<"x">>, []),
-
-    ok.
-
-upstream_has_no_federation(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_policy_upstream(Config, Rabbit, <<"^test$">>,
-      rabbit_ct_broker_helpers:node_uri(Config, Hare), []),
-    Downstream = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    Upstream   = rabbit_ct_client_helpers:open_channel(Config, Hare),
-    declare_exchange(Upstream, x(<<"test">>)),
-    declare_exchange(Downstream, x(<<"test">>)),
-    Q = bind_queue(Downstream, <<"test">>, <<"routing">>),
-    await_binding(Config, Hare, <<"test">>, <<"routing">>),
-    publish(Upstream, <<"test">>, <<"routing">>, <<"HELLO">>),
-    expect(Downstream, Q, [<<"HELLO">>]),
-    ok.
-
-dynamic_reconfiguration(Config) ->
-    with_ch(Config,
-      fun (_Ch) ->
-              Xs = [<<"all.fed1">>, <<"all.fed2">>],
-              %% Left from the conf we set up for previous tests
-              assert_connections(Config, 0, Xs, [<<"localhost">>, <<"local5673">>]),
-
-              %% Test that clearing connections works
-              clear_upstream(Config, 0, <<"localhost">>),
-              clear_upstream(Config, 0, <<"local5673">>),
-              assert_connections(Config, 0, Xs, []),
-
-              %% Test that readding them and changing them works
-              set_upstream(Config, 0,
-                <<"localhost">>, rabbit_ct_broker_helpers:node_uri(Config, 0)),
-              %% Do it twice so we at least hit the no-restart optimisation
-              URI = rabbit_ct_broker_helpers:node_uri(Config, 0, [use_ipaddr]),
-              set_upstream(Config, 0, <<"localhost">>, URI),
-              set_upstream(Config, 0, <<"localhost">>, URI),
-              assert_connections(Config, 0, Xs, [<<"localhost">>]),
-
-              %% And re-add the last - for next test
-              rabbit_federation_test_util:setup_federation(Config)
-      end, [x(<<"all.fed1">>), x(<<"all.fed2">>)]).
-
-dynamic_reconfiguration_integrity(Config) ->
-    with_ch(Config,
-      fun (_Ch) ->
-              Xs = [<<"new.fed1">>, <<"new.fed2">>],
-
-              %% Declared exchanges with nonexistent set - no links
-              assert_connections(Config, 0, Xs, []),
-
-              %% Create the set - links appear
-              set_upstream_set(Config, 0, <<"new-set">>, [{<<"localhost">>, []}]),
-              assert_connections(Config, 0, Xs, [<<"localhost">>]),
-
-              %% Add nonexistent connections to set - nothing breaks
-              set_upstream_set(Config, 0,
-                <<"new-set">>, [{<<"localhost">>, []},
-                                {<<"does-not-exist">>, []}]),
-              assert_connections(Config, 0, Xs, [<<"localhost">>]),
-
-              %% Change connection in set - links change
-              set_upstream_set(Config, 0, <<"new-set">>, [{<<"local5673">>, []}]),
-              assert_connections(Config, 0, Xs, [<<"local5673">>])
-      end, [x(<<"new.fed1">>), x(<<"new.fed2">>)]).
-
-federate_unfederate(Config) ->
-    with_ch(Config,
-      fun (_Ch) ->
-              Xs = [<<"dyn.exch1">>, <<"dyn.exch2">>],
-
-              %% Declared non-federated exchanges - no links
-              assert_connections(Config, 0, Xs, []),
-
-              %% Federate them - links appear
-              set_policy(Config, 0, <<"dyn">>, <<"^dyn\\.">>, <<"all">>),
-              assert_connections(Config, 0, Xs, [<<"localhost">>, <<"local5673">>]),
-
-              %% Change policy - links change
-              set_policy(Config, 0, <<"dyn">>, <<"^dyn\\.">>, <<"localhost">>),
-              assert_connections(Config, 0, Xs, [<<"localhost">>]),
-
-              %% Unfederate them - links disappear
-              clear_policy(Config, 0, <<"dyn">>),
-              assert_connections(Config, 0, Xs, [])
-      end, [x(<<"dyn.exch1">>), x(<<"dyn.exch2">>)]).
-
-dynamic_plugin_stop_start(Config) ->
-    X1 = <<"dyn.exch1">>,
-    X2 = <<"dyn.exch2">>,
-    with_ch(Config,
-      fun (Ch) ->
-              set_policy(Config, 0, <<"dyn">>, <<"^dyn\\.">>, <<"localhost">>),
-
-              %% Declare federated exchange - get link
-              assert_connections(Config, 0, [X1], [<<"localhost">>]),
-
-              %% Disable plugin, link goes
-              ok = rabbit_ct_broker_helpers:disable_plugin(Config, 0,
-                "rabbitmq_federation"),
-              %% We can't check with status for obvious reasons...
-              undefined = rabbit_ct_broker_helpers:rpc(Config, 0,
-                erlang, whereis, [rabbit_federation_sup]),
-              {error, not_found} = rabbit_ct_broker_helpers:rpc(Config, 0,
-                rabbit_registry, lookup_module,
-                [exchange, 'x-federation-upstream']),
-
-              %% Create exchange then re-enable plugin, links appear
-              declare_exchange(Ch, x(X2)),
-              ok = rabbit_ct_broker_helpers:enable_plugin(Config, 0,
-                "rabbitmq_federation"),
-              assert_connections(Config, 0, [X1, X2], [<<"localhost">>]),
-              {ok, _} = rabbit_ct_broker_helpers:rpc(Config, 0,
-                rabbit_registry, lookup_module,
-                [exchange, 'x-federation-upstream']),
-
-              %% Test both exchanges work. They are just federated to
-              %% themselves so should duplicate messages.
-              [begin
-                   Q = bind_queue(Ch, X, <<"key">>),
-                   await_binding(Config, 0, X, <<"key">>, 2),
-                   publish(Ch, X, <<"key">>, <<"HELLO">>),
-                   expect(Ch, Q, [<<"HELLO">>, <<"HELLO">>]),
-                   delete_queue(Ch, Q)
-               end || X <- [X1, X2]],
-
-              clear_policy(Config, 0, <<"dyn">>),
-              assert_connections(Config, 0, [X1, X2], [])
-      end, [x(X1)]).
-
-%%----------------------------------------------------------------------------
-
-with_ch(Config, Fun, Xs) ->
-    Ch = rabbit_ct_client_helpers:open_channel(Config, 0),
-    declare_all(Ch, Xs),
-    rabbit_federation_test_util:assert_status(Config, 0,
-      Xs, {exchange, upstream_exchange}),
-    Fun(Ch),
-    delete_all(Ch, Xs),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    cleanup(Config, 0),
-    ok.
-
-cleanup(Config, Node) ->
-    [rabbit_ct_broker_helpers:rpc(Config, Node,
-        rabbit_amqqueue, delete, [Q, false, false]) ||
-      Q <- queues(Config, Node)].
-
-queues(Config, Node) ->
-    Ret = rabbit_ct_broker_helpers:rpc(Config, Node,
-      rabbit_amqqueue, list, [<<"/">>]),
-    case Ret of
-        {badrpc, _} -> [];
-        Qs          -> Qs
-    end.
-
-stop_other_node(Config, Node) ->
-    cleanup(Config, Node),
-    rabbit_federation_test_util:stop_other_node(Config, Node).
-
-declare_all(Ch, Xs) -> [declare_exchange(Ch, X) || X <- Xs].
-delete_all(Ch, Xs) ->
-    [delete_exchange(Ch, X) || #'exchange.declare'{exchange = X} <- Xs].
-
-declare_exchange(Ch, X) ->
-    amqp_channel:call(Ch, X).
-
-x(Name) -> x(Name, <<"topic">>).
-
-x(Name, Type) ->
-    #'exchange.declare'{exchange = Name,
-                        type     = Type,
-                        durable  = true}.
-
-r(Name) -> rabbit_misc:r(<<"/">>, exchange, Name).
-
-declare_queue(Ch) ->
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Ch, #'queue.declare'{exclusive = true}),
-    Q.
-
-bind_queue(Ch, Q, X, Key) ->
-    amqp_channel:call(Ch, #'queue.bind'{queue       = Q,
-                                        exchange    = X,
-                                        routing_key = Key}).
-
-unbind_queue(Ch, Q, X, Key) ->
-    amqp_channel:call(Ch, #'queue.unbind'{queue       = Q,
-                                          exchange    = X,
-                                          routing_key = Key}).
-
-bind_exchange(Ch, D, S, Key) ->
-    amqp_channel:call(Ch, #'exchange.bind'{destination = D,
-                                           source      = S,
-                                           routing_key = Key}).
-
-bind_queue(Ch, X, Key) ->
-    Q = declare_queue(Ch),
-    bind_queue(Ch, Q, X, Key),
-    Q.
-
-delete_exchange(Ch, X) ->
-    amqp_channel:call(Ch, #'exchange.delete'{exchange = X}).
-
-delete_queue(Ch, Q) ->
-    amqp_channel:call(Ch, #'queue.delete'{queue = Q}).
-
-await_binding(Config, Node, X, Key) ->
-    await_binding(Config, Node, X, Key, 1).
-
-await_binding(Config, Node, X, Key, Count) ->
-    case bound_keys_from(Config, Node, X, Key) of
-        L when length(L) <   Count -> timer:sleep(100),
-                                      await_binding(Config, Node, X, Key, Count);
-        L when length(L) =:= Count -> ok;
-        L                          -> exit({too_many_bindings,
-                                            X, Key, Count, L})
-    end.
-
-await_bindings(Config, Node, X, Keys) ->
-    [await_binding(Config, Node, X, Key) || Key <- Keys].
-
-await_binding_absent(Config, Node, X, Key) ->
-    case bound_keys_from(Config, Node, X, Key) of
-        [] -> ok;
-        _  -> timer:sleep(100),
-              await_binding_absent(Config, Node, X, Key)
-    end.
-
-bound_keys_from(Config, Node, X, Key) ->
-    List = rabbit_ct_broker_helpers:rpc(Config, Node,
-      rabbit_binding, list_for_source, [r(X)]),
-    [K || #binding{key = K} <- List, K =:= Key].
-
-publish(Ch, X, Key, Payload) when is_binary(Payload) ->
-    publish(Ch, X, Key, #amqp_msg{payload = Payload});
-
-publish(Ch, X, Key, Msg = #amqp_msg{}) ->
-    amqp_channel:call(Ch, #'basic.publish'{exchange    = X,
-                                           routing_key = Key}, Msg).
-
-publish_expect(Ch, X, Key, Q, Payload) ->
-    publish(Ch, X, Key, Payload),
-    expect(Ch, Q, [Payload]).
-
-%%----------------------------------------------------------------------------
-
-assert_connections(Config, Node, Xs, Conns) ->
-    rabbit_ct_broker_helpers:rpc(Config, Node,
-      ?MODULE, assert_connections1, [Xs, Conns]).
-
-assert_connections1(Xs, Conns) ->
-    Links = [{X, C, X} ||
-                X <- Xs,
-                C <- Conns],
-    Remaining = lists:foldl(
-                  fun (Link, Status) ->
-                          rabbit_federation_test_util:assert_link_status(
-                            Link, Status, {exchange, upstream_exchange})
-                  end, rabbit_federation_status:status(), Links),
-    [] = Remaining,
-    ok.
-
-connection_pids(Config, Node) ->
-    [P || [{pid, P}] <-
-              rabbit_ct_broker_helpers:rpc(Config, Node,
-                rabbit_networking, connection_info_all, [[pid]])].
diff --git a/rabbitmq-server/deps/rabbitmq_federation/test/queue_SUITE.erl b/rabbitmq-server/deps/rabbitmq_federation/test/queue_SUITE.erl
deleted file mode 100644 (file)
index 761e541..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Federation.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(queue_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--import(rabbit_federation_test_util,
-        [expect/3,
-         set_upstream/4, clear_upstream/3, set_policy/5, clear_policy/3,
-         set_policy_upstream/5, set_policy_upstreams/4]).
-
--define(UPSTREAM_DOWNSTREAM, [q(<<"upstream">>),
-                              q(<<"fed.downstream">>)]).
-
-all() ->
-    [
-      {group, without_disambiguate},
-      {group, with_disambiguate}
-    ].
-
-groups() ->
-    [
-      {without_disambiguate, [], [
-          {cluster_size_1, [], [
-              simple,
-              multiple_upstreams,
-              multiple_downstreams,
-              bidirectional,
-              dynamic_reconfiguration,
-              federate_unfederate,
-              dynamic_plugin_stop_start
-            ]}
-        ]},
-      {with_disambiguate, [], [
-          {cluster_size_2, [], [
-              restart_upstream
-            ]}
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(without_disambiguate, Config) ->
-    rabbit_ct_helpers:set_config(Config,
-      {disambiguate_step, []});
-init_per_group(with_disambiguate, Config) ->
-    rabbit_ct_helpers:set_config(Config,
-      {disambiguate_step, [fun rabbit_federation_test_util:disambiguate/1]});
-init_per_group(cluster_size_1 = Group, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 1}
-      ]),
-    init_per_group1(Group, Config1);
-init_per_group(cluster_size_2 = Group, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 2}
-      ]),
-    init_per_group1(Group, Config1).
-
-init_per_group1(Group, Config) ->
-    SetupFederation = case Group of
-        cluster_size_1 -> [fun rabbit_federation_test_util:setup_federation/1];
-        cluster_size_2 -> []
-    end,
-    Disambiguate = ?config(disambiguate_step, Config),
-    Suffix = rabbit_ct_helpers:testcase_absname(Config, "", "-"),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, Suffix},
-        {rmq_nodes_clustered, false}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++
-      SetupFederation ++ Disambiguate).
-
-end_per_group(without_disambiguate, Config) ->
-    Config;
-end_per_group(with_disambiguate, Config) ->
-    Config;
-end_per_group(_, Config) ->
-    rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-simple(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              expect_federation(Ch, <<"upstream">>, <<"fed.downstream">>)
-      end, [q(<<"upstream">>),
-            q(<<"fed.downstream">>)]).
-
-multiple_upstreams(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              expect_federation(Ch, <<"upstream">>, <<"fed12.downstream">>),
-              expect_federation(Ch, <<"upstream2">>, <<"fed12.downstream">>)
-      end, [q(<<"upstream">>),
-            q(<<"upstream2">>),
-            q(<<"fed12.downstream">>)]).
-
-multiple_downstreams(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              expect_federation(Ch, <<"upstream">>, <<"fed.downstream">>),
-              expect_federation(Ch, <<"upstream">>, <<"fed.downstream2">>)
-      end, [q(<<"upstream">>),
-            q(<<"fed.downstream">>),
-            q(<<"fed.downstream2">>)]).
-
-bidirectional(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              publish_expect(Ch, <<>>, <<"one">>, <<"one">>, <<"first one">>),
-              publish_expect(Ch, <<>>, <<"two">>, <<"two">>, <<"first two">>),
-              Seq = lists:seq(1, 100),
-              [publish(Ch, <<>>, <<"one">>, <<"bulk">>) || _ <- Seq],
-              [publish(Ch, <<>>, <<"two">>, <<"bulk">>) || _ <- Seq],
-              expect(Ch, <<"one">>, repeat(150, <<"bulk">>)),
-              expect(Ch, <<"two">>, repeat(50, <<"bulk">>)),
-              expect_empty(Ch, <<"one">>),
-              expect_empty(Ch, <<"two">>)
-      end, [q(<<"one">>),
-            q(<<"two">>)]).
-
-dynamic_reconfiguration(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              expect_federation(Ch, <<"upstream">>, <<"fed.downstream">>),
-
-              %% Test that clearing connections works
-              clear_upstream(Config, 0, <<"localhost">>),
-              expect_no_federation(Ch, <<"upstream">>, <<"fed.downstream">>),
-
-              %% Test that readding them and changing them works
-              set_upstream(Config, 0,
-                <<"localhost">>, rabbit_ct_broker_helpers:node_uri(Config, 0)),
-              %% Do it twice so we at least hit the no-restart optimisation
-              URI = rabbit_ct_broker_helpers:node_uri(Config, 0, [use_ipaddr]),
-              set_upstream(Config, 0, <<"localhost">>, URI),
-              set_upstream(Config, 0, <<"localhost">>, URI),
-              expect_federation(Ch, <<"upstream">>, <<"fed.downstream">>)
-      end, [q(<<"upstream">>),
-            q(<<"fed.downstream">>)]).
-
-federate_unfederate(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              expect_no_federation(Ch, <<"upstream">>, <<"downstream">>),
-              expect_no_federation(Ch, <<"upstream2">>, <<"downstream">>),
-
-              %% Federate it
-              set_policy(Config, 0, <<"dyn">>,
-                <<"^downstream\$">>, <<"upstream">>),
-              expect_federation(Ch, <<"upstream">>, <<"downstream">>),
-              expect_no_federation(Ch, <<"upstream2">>, <<"downstream">>),
-
-              %% Change policy - upstream changes
-              set_policy(Config, 0, <<"dyn">>,
-                <<"^downstream\$">>, <<"upstream2">>),
-              expect_no_federation(Ch, <<"upstream">>, <<"downstream">>),
-              expect_federation(Ch, <<"upstream2">>, <<"downstream">>),
-
-              %% Unfederate it - no federation
-              clear_policy(Config, 0, <<"dyn">>),
-              expect_no_federation(Ch, <<"upstream2">>, <<"downstream">>)
-      end, [q(<<"upstream">>),
-            q(<<"upstream2">>),
-            q(<<"downstream">>)]).
-
-dynamic_plugin_stop_start(Config) ->
-    Q1 = <<"dyn.q1">>,
-    Q2 = <<"dyn.q2">>,
-    U = <<"upstream">>,
-    with_ch(Config,
-      fun (Ch) ->
-              set_policy(Config, 0, <<"dyn">>, <<"^dyn\\.">>, U),
-              %% Declare federated queue - get link
-              expect_federation(Ch, U, Q1),
-
-              %% Disable plugin, link goes
-              ok = rabbit_ct_broker_helpers:disable_plugin(Config, 0,
-                "rabbitmq_federation"),
-              expect_no_federation(Ch, U, Q1),
-
-              %% Create exchange then re-enable plugin, links appear
-              declare_queue(Ch, q(Q2)),
-              ok = rabbit_ct_broker_helpers:enable_plugin(Config, 0,
-                "rabbitmq_federation"),
-              expect_federation(Ch, U, Q1),
-              expect_federation(Ch, U, Q2),
-
-              clear_policy(Config, 0, <<"dyn">>),
-              expect_no_federation(Ch, U, Q1),
-              expect_no_federation(Ch, U, Q2),
-              delete_queue(Ch, Q2)
-      end, [q(Q1), q(U)]).
-
-restart_upstream(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    set_policy_upstream(Config, Rabbit, <<"^test$">>,
-      rabbit_ct_broker_helpers:node_uri(Config, Hare), []),
-
-    Downstream = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    Upstream   = rabbit_ct_client_helpers:open_channel(Config, Hare),
-
-    declare_queue(Upstream, q(<<"test">>)),
-    declare_queue(Downstream, q(<<"test">>)),
-    Seq = lists:seq(1, 100),
-    [publish(Upstream, <<>>, <<"test">>, <<"bulk">>) || _ <- Seq],
-    expect(Upstream, <<"test">>, repeat(25, <<"bulk">>)),
-    expect(Downstream, <<"test">>, repeat(25, <<"bulk">>)),
-
-    rabbit_ct_client_helpers:close_channels_and_connection(Config, Hare),
-    ok = rabbit_ct_broker_helpers:restart_node(Config, Hare),
-    Upstream2 = rabbit_ct_client_helpers:open_channel(Config, Hare),
-
-    expect(Upstream2, <<"test">>, repeat(25, <<"bulk">>)),
-    expect(Downstream, <<"test">>, repeat(25, <<"bulk">>)),
-    expect_empty(Upstream2, <<"test">>),
-    expect_empty(Downstream, <<"test">>),
-
-    ok.
-
-%upstream_has_no_federation(Config) ->
-%    %% TODO
-%    ok.
-
-%%----------------------------------------------------------------------------
-
-with_ch(Config, Fun, Qs) ->
-    Ch = rabbit_ct_client_helpers:open_channel(Config, 0),
-    declare_all(Ch, Qs),
-    timer:sleep(1000), %% Time for statuses to get updated
-    rabbit_federation_test_util:assert_status(Config, 0,
-      Qs, {queue, upstream_queue}),
-    Fun(Ch),
-    delete_all(Ch, Qs),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    ok.
-
-declare_all(Ch, Qs) -> [declare_queue(Ch, Q) || Q <- Qs].
-delete_all(Ch, Qs) ->
-    [delete_queue(Ch, Q) || #'queue.declare'{queue = Q} <- Qs].
-
-declare_queue(Ch, Q) ->
-    amqp_channel:call(Ch, Q).
-
-delete_queue(Ch, Q) ->
-    amqp_channel:call(Ch, #'queue.delete'{queue = Q}).
-
-q(Name) ->
-    #'queue.declare'{queue   = Name,
-                     durable = true}.
-
-repeat(Count, Item) -> [Item || _ <- lists:seq(1, Count)].
-
-%%----------------------------------------------------------------------------
-
-publish(Ch, X, Key, Payload) when is_binary(Payload) ->
-    publish(Ch, X, Key, #amqp_msg{payload = Payload});
-
-publish(Ch, X, Key, Msg = #amqp_msg{}) ->
-    amqp_channel:call(Ch, #'basic.publish'{exchange    = X,
-                                           routing_key = Key}, Msg).
-
-publish_expect(Ch, X, Key, Q, Payload) ->
-    publish(Ch, X, Key, Payload),
-    expect(Ch, Q, [Payload]).
-
-%% Doubled due to our strange basic.get behaviour.
-expect_empty(Ch, Q) ->
-    rabbit_federation_test_util:expect_empty(Ch, Q),
-    rabbit_federation_test_util:expect_empty(Ch, Q).
-
-expect_federation(Ch, UpstreamQ, DownstreamQ) ->
-    publish_expect(Ch, <<>>, UpstreamQ, DownstreamQ, <<"HELLO">>).
-
-expect_no_federation(Ch, UpstreamQ, DownstreamQ) ->
-    publish(Ch, <<>>, UpstreamQ, <<"HELLO">>),
-    expect_empty(Ch, DownstreamQ),
-    expect(Ch, UpstreamQ, [<<"HELLO">>]).
diff --git a/rabbitmq-server/deps/rabbitmq_federation/test/rabbit_federation_test_util.erl b/rabbitmq-server/deps/rabbitmq_federation/test/rabbit_federation_test_util.erl
deleted file mode 100644 (file)
index 9b79ff9..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Federation.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_federation_test_util).
-
--include("rabbit_federation.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--import(rabbit_misc, [pget/2]).
-
-setup_federation(Config) ->
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream">>, <<"localhost">>, [
-        {<<"uri">>, rabbit_ct_broker_helpers:node_uri(Config, 0)}]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream">>, <<"local5673">>, [
-        {<<"uri">>, <<"amqp://localhost:1">>}]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"upstream">>, [
-        [
-          {<<"upstream">>, <<"localhost">>},
-          {<<"exchange">>, <<"upstream">>},
-          {<<"queue">>, <<"upstream">>}
-        ]
-      ]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"upstream2">>, [
-        [
-          {<<"upstream">>, <<"localhost">>},
-          {<<"exchange">>, <<"upstream2">>},
-          {<<"queue">>, <<"upstream2">>}
-        ]
-      ]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"localhost">>, [
-        [{<<"upstream">>, <<"localhost">>}]
-      ]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"upstream12">>, [
-        [
-          {<<"upstream">>, <<"localhost">>},
-          {<<"exchange">>, <<"upstream">>},
-          {<<"queue">>, <<"upstream">>}
-        ], [
-          {<<"upstream">>, <<"localhost">>},
-          {<<"exchange">>, <<"upstream2">>},
-          {<<"queue">>, <<"upstream2">>}
-        ]
-      ]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"one">>, [
-        [
-          {<<"upstream">>, <<"localhost">>},
-          {<<"exchange">>, <<"one">>},
-          {<<"queue">>, <<"one">>}
-        ]
-      ]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"two">>, [
-        [
-          {<<"upstream">>, <<"localhost">>},
-          {<<"exchange">>, <<"two">>},
-          {<<"queue">>, <<"two">>}
-        ]
-      ]),
-
-    rabbit_ct_broker_helpers:set_parameter(Config, 0,
-      <<"federation-upstream-set">>, <<"upstream5673">>, [
-        [
-          {<<"upstream">>, <<"local5673">>},
-          {<<"exchange">>, <<"upstream">>}
-        ]
-      ]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"fed">>, <<"^fed\.">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"upstream">>}]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"fed12">>, <<"^fed12\.">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"upstream12">>}]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"one">>, <<"^two$">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"one">>}]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"two">>, <<"^one$">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"two">>}]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"hare">>, <<"^hare\.">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"upstream5673">>}]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"all">>, <<"^all\.">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"all">>}]),
-
-    rabbit_ct_broker_helpers:set_policy(Config, 0,
-      <<"new">>, <<"^new\.">>, <<"all">>, [
-        {<<"federation-upstream-set">>, <<"new-set">>}]),
-    Config.
-
-expect(Ch, Q, Fun) when is_function(Fun) ->
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue  = Q,
-                                                no_ack = true}, self()),
-    CTag = receive
-        #'basic.consume_ok'{consumer_tag = CT} -> CT
-    end,
-    Fun(),
-    amqp_channel:call(Ch, #'basic.cancel'{consumer_tag = CTag});
-
-expect(Ch, Q, Payloads) ->
-    expect(Ch, Q, fun() -> expect(Payloads) end).
-
-expect([]) ->
-    ok;
-expect(Payloads) ->
-    receive
-        {#'basic.deliver'{}, #amqp_msg{payload = Payload}} ->
-            case lists:member(Payload, Payloads) of
-                true  -> expect(Payloads -- [Payload]);
-                false -> throw({expected, Payloads, actual, Payload})
-            end
-    end.
-
-expect_empty(Ch, Q) ->
-    ?assertMatch(#'basic.get_empty'{},
-                 amqp_channel:call(Ch, #'basic.get'{ queue = Q })).
-
-set_upstream(Config, Node, Name, URI) ->
-    set_upstream(Config, Node, Name, URI, []).
-
-set_upstream(Config, Node, Name, URI, Extra) ->
-    rabbit_ct_broker_helpers:set_parameter(Config, Node,
-      <<"federation-upstream">>, Name, [{<<"uri">>, URI} | Extra]).
-
-clear_upstream(Config, Node, Name) ->
-    rabbit_ct_broker_helpers:clear_parameter(Config, Node,
-      <<"federation-upstream">>, Name).
-
-set_upstream_set(Config, Node, Name, Set) ->
-    rabbit_ct_broker_helpers:set_parameter(Config, Node,
-      <<"federation-upstream-set">>, Name,
-      [[{<<"upstream">>, UStream} | Extra] || {UStream, Extra} <- Set]).
-
-set_policy(Config, Node, Name, Pattern, UpstreamSet) ->
-    rabbit_ct_broker_helpers:set_policy(Config, Node,
-      Name, Pattern, <<"all">>,
-      [{<<"federation-upstream-set">>, UpstreamSet}]).
-
-clear_policy(Config, Node, Name) ->
-    rabbit_ct_broker_helpers:clear_policy(Config, Node, Name).
-
-set_policy_upstream(Config, Node, Pattern, URI, Extra) ->
-    set_policy_upstreams(Config, Node, Pattern, [{URI, Extra}]).
-
-set_policy_upstreams(Config, Node, Pattern, URIExtras) ->
-    put(upstream_num, 1),
-    [set_upstream(Config, Node, gen_upstream_name(), URI, Extra)
-     || {URI, Extra} <- URIExtras],
-    set_policy(Config, Node, Pattern, Pattern, <<"all">>).
-
-gen_upstream_name() ->
-    list_to_binary("upstream-" ++ integer_to_list(next_upstream_num())).
-
-next_upstream_num() ->
-    R = get(upstream_num) + 1,
-    put(upstream_num, R),
-    R.
-
-%% Make sure that even though multiple nodes are in a single
-%% distributed system, we still keep all our process groups separate.
-disambiguate(Config) ->
-    rabbit_ct_broker_helpers:rpc_all(Config,
-      application, set_env,
-      [rabbitmq_federation, pgroup_name_cluster_id, true]),
-    Config.
-
-no_plugins(Cfg) ->
-    [{K, case K of
-             plugins -> none;
-             _       -> V
-         end} || {K, V} <- Cfg].
-
-%%----------------------------------------------------------------------------
-
-assert_status(Config, Node, XorQs, Names) ->
-    rabbit_ct_broker_helpers:rpc(Config, Node,
-      ?MODULE, assert_status1, [XorQs, Names]).
-
-assert_status1(XorQs, Names) ->
-    Links = lists:append([links(XorQ) || XorQ <- XorQs]),
-    Remaining = lists:foldl(fun (Link, Status) ->
-                                    assert_link_status(Link, Status, Names)
-                            end, rabbit_federation_status:status(), Links),
-    ?assertEqual([], Remaining),
-    ok.
-
-assert_link_status({DXorQNameBin, UpstreamName, UXorQNameBin}, Status,
-                   {TypeName, UpstreamTypeName}) ->
-    {This, Rest} = lists:partition(
-                     fun(St) ->
-                             pget(upstream, St) =:= UpstreamName andalso
-                                 pget(TypeName, St) =:= DXorQNameBin andalso
-                                 pget(UpstreamTypeName, St) =:= UXorQNameBin
-                     end, Status),
-    ?assertMatch([_], This),
-    Rest.
-
-links(#'exchange.declare'{exchange = Name}) ->
-    case rabbit_policy:get(<<"federation-upstream-set">>, xr(Name)) of
-        undefined -> [];
-        Set       -> X = #exchange{name = xr(Name)},
-                     [{Name, U#upstream.name, U#upstream.exchange_name} ||
-                         U <- rabbit_federation_upstream:from_set(Set, X)]
-    end;
-links(#'queue.declare'{queue = Name}) ->
-    case rabbit_policy:get(<<"federation-upstream-set">>, qr(Name)) of
-        undefined -> [];
-        Set       -> Q = #amqqueue{name = qr(Name)},
-                     [{Name, U#upstream.name, U#upstream.queue_name} ||
-                         U <- rabbit_federation_upstream:from_set(Set, Q)]
-    end.
-
-xr(Name) -> rabbit_misc:r(<<"/">>, exchange, Name).
-qr(Name) -> rabbit_misc:r(<<"/">>, queue, Name).
diff --git a/rabbitmq-server/deps/rabbitmq_federation/test/unit_inbroker_SUITE.erl b/rabbitmq-server/deps/rabbitmq_federation/test/unit_inbroker_SUITE.erl
deleted file mode 100644 (file)
index e172f4f..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Federation.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_inbroker_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("rabbit_common/include/rabbit.hrl").
-
--include("rabbit_federation.hrl").
-
--compile(export_all).
-
--define(US_NAME, <<"upstream">>).
--define(DS_NAME, <<"fed.downstream">>).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-          serialisation,
-          scratch_space,
-          remove_credentials
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-%% Test that we apply binding changes in the correct order even when
-%% they arrive out of order.
-serialisation(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, serialisation1, []).
-
-serialisation1() ->
-    with_exchanges(
-      fun(X) ->
-              [B1, B2, B3] = [b(K) || K <- [<<"1">>, <<"2">>, <<"3">>]],
-              remove_bindings(4, X, [B1, B3]),
-              add_binding(5, X, B1),
-              add_binding(1, X, B1),
-              add_binding(2, X, B2),
-              add_binding(3, X, B3),
-              %% List of lists because one for each link
-              Keys = rabbit_federation_exchange_link:list_routing_keys(
-                       X#exchange.name),
-              [[<<"1">>, <<"2">>]] =:= Keys
-      end).
-
-scratch_space(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, scratch_space1, []).
-
-scratch_space1() ->
-    A = <<"A">>,
-    B = <<"B">>,
-    DB = rabbit_federation_db,
-    with_exchanges(
-      fun(#exchange{name = N}) ->
-              DB:set_active_suffix(N, upstream(x), A),
-              DB:set_active_suffix(N, upstream(y), A),
-              DB:prune_scratch(N, [upstream(y), upstream(z)]),
-              DB:set_active_suffix(N, upstream(y), B),
-              DB:set_active_suffix(N, upstream(z), A),
-              none = DB:get_active_suffix(N, upstream(x), none),
-              B    = DB:get_active_suffix(N, upstream(y), none),
-              A    = DB:get_active_suffix(N, upstream(z), none)
-      end).
-
-remove_credentials(Config) ->
-    Test0 = fun (In, Exp) ->
-                    Act = rabbit_ct_broker_helpers:rpc(Config, 0,
-                      rabbit_federation_upstream, remove_credentials, [In]),
-                    Exp = Act
-            end,
-    Cat = fun (Bs) ->
-                  list_to_binary(lists:append([binary_to_list(B) || B <- Bs]))
-          end,
-    Test = fun (Scheme, Rest) ->
-                   Exp = Cat([Scheme, Rest]),
-                   Test0(Exp,                                   Exp),
-                   Test0(Cat([Scheme, <<"user@">>, Rest]),      Exp),
-                   Test0(Cat([Scheme, <<"user:pass@">>, Rest]), Exp)
-           end,
-    Test(<<"amqp://">>,  <<"">>),
-    Test(<<"amqp://">>,  <<"localhost">>),
-    Test(<<"amqp://">>,  <<"localhost/">>),
-    Test(<<"amqp://">>,  <<"localhost/foo">>),
-    Test(<<"amqp://">>,  <<"localhost:5672">>),
-    Test(<<"amqp://">>,  <<"localhost:5672/foo">>),
-    Test(<<"amqps://">>, <<"localhost:5672/%2f">>),
-    ok.
-
-with_exchanges(Fun) ->
-    rabbit_exchange:declare(r(?US_NAME), fanout, false, false, false, []),
-    X = rabbit_exchange:declare(r(?DS_NAME), fanout, false, false, false, []),
-    Fun(X),
-    %% Delete downstream first or it will recreate the upstream
-    rabbit_exchange:delete(r(?DS_NAME), false),
-    rabbit_exchange:delete(r(?US_NAME), false),
-    ok.
-
-add_binding(Ser, X, B) ->
-    rabbit_federation_exchange:add_binding(transaction, X, B),
-    rabbit_federation_exchange:add_binding(Ser, X, B).
-
-remove_bindings(Ser, X, Bs) ->
-    rabbit_federation_exchange:remove_bindings(transaction, X, Bs),
-    rabbit_federation_exchange:remove_bindings(Ser, X, Bs).
-
-r(Name) -> rabbit_misc:r(<<"/">>, exchange, Name).
-
-b(Key) ->
-    #binding{source = ?DS_NAME, destination = <<"whatever">>,
-             key = Key, args = []}.
-
-upstream(UpstreamName) ->
-    #upstream{name          = atom_to_list(UpstreamName),
-              exchange_name = <<"upstream">>}.
diff --git a/rabbitmq-server/deps/rabbitmq_federation_management/erlang.mk b/rabbitmq-server/deps/rabbitmq_federation_management/erlang.mk
deleted file mode 100644 (file)
index 1688ee8..0000000
+++ /dev/null
@@ -1,6640 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_federation_management/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_federation_management/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/build.config b/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/erlang.mk b/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/rjms_topic_selector_SUITE.erl b/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/rjms_topic_selector_SUITE.erl
deleted file mode 100644 (file)
index 341bb97..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is Pivotal Software, Inc.
-%% Copyright (c) 2013 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rjms_topic_selector_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include("rabbit_jms_topic_exchange.hrl").
-
--import(rabbit_ct_client_helpers, [open_connection_and_channel/1,
-                                   close_connection_and_channel/2]).
-
-%% Useful test constructors
--define(BSELECTARG(BinStr), {?RJMS_COMPILED_SELECTOR_ARG, longstr, BinStr}).
--define(BASICMSG(Payload, Hdrs), #'amqp_msg'{props=#'P_basic'{headers=Hdrs}, payload=Payload}).
--define(VERSION_ARG, {?RJMS_VERSION_ARG, longstr, <<"1.4.7">>}).
-
-all() ->
-    [
-      {group, parallel_tests}
-    ].
-
-groups() ->
-    [
-      {parallel_tests, [parallel], [
-                                    test_topic_selection,
-                                    test_default_topic_selection
-                                   ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-test_topic_selection(Config) ->
-    {Connection, Channel} = open_connection_and_channel(Config),
-
-    Exchange = declare_rjms_exchange(Channel, "rjms_test_topic_selector_exchange", [?VERSION_ARG]),
-
-    %% Declare a queue and bind it
-    Q = declare_queue(Channel),
-    bind_queue(Channel, Q, Exchange, <<"select-key">>, [?BSELECTARG(<<"{ident, <<\"boolVal\">>}.">>), ?VERSION_ARG]),
-
-    publish_two_messages(Channel, Exchange, <<"select-key">>),
-
-    get_and_check(Channel, Q, 0, <<"true">>),
-
-    close_connection_and_channel(Connection, Channel),
-    ok.
-
-test_default_topic_selection(Config) ->
-    {Connection, Channel} = open_connection_and_channel(Config),
-
-    Exchange = declare_rjms_exchange(Channel, "rjms_test_default_selector_exchange", [?VERSION_ARG]),
-
-    %% Declare a queue and bind it
-    Q = declare_queue(Channel),
-    bind_queue(Channel, Q, Exchange, <<"select-key">>, [?BSELECTARG(<<"{ident, <<\"boolVal\">>}.">>), ?VERSION_ARG]),
-    publish_two_messages(Channel, Exchange, <<"select-key">>),
-    get_and_check(Channel, Q, 0, <<"true">>),
-
-    close_connection_and_channel(Connection, Channel),
-    ok.
-
-%% Declare a rjms_topic_selector exchange, with args
-declare_rjms_exchange(Ch, XNameStr, XArgs) ->
-    Exchange = list_to_binary(XNameStr),
-    Decl = #'exchange.declare'{ exchange = Exchange
-                              , type = <<"x-jms-topic">>
-                              , arguments = XArgs },
-    #'exchange.declare_ok'{} = amqp_channel:call(Ch, Decl),
-    Exchange.
-
-%% Bind a selector queue to an exchange
-bind_queue(Ch, Q, Ex, RKey, Args) ->
-    Binding = #'queue.bind'{ queue       = Q
-                           , exchange    = Ex
-                           , routing_key = RKey
-                           , arguments   = Args
-                           },
-    #'queue.bind_ok'{} = amqp_channel:call(Ch, Binding),
-    ok.
-
-%% Declare a queue, return Q name (as binary)
-declare_queue(Ch) ->
-    #'queue.declare_ok'{queue = Q} = amqp_channel:call(Ch, #'queue.declare'{}),
-    Q.
-
-%% Get message from Q and check remaining and payload.
-get_and_check(Channel, Queue, ExpectedRemaining, ExpectedPayload) ->
-    Get = #'basic.get'{queue = Queue},
-    {#'basic.get_ok'{delivery_tag = Tag, message_count = Remaining}, Content}
-      = amqp_channel:call(Channel, Get),
-    amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag}),
-
-    ExpectedRemaining = Remaining,
-    ExpectedPayload = Content#amqp_msg.payload,
-    ok.
-
-publish_two_messages(Chan, Exch, RoutingKey) ->
-    Publish = #'basic.publish'{exchange = Exch, routing_key = RoutingKey},
-    amqp_channel:cast(Chan, Publish, ?BASICMSG(<<"false">>, [{<<"boolVal">>, 'bool', false}])),
-    amqp_channel:cast(Chan, Publish, ?BASICMSG(<<"true">>, [{<<"boolVal">>, 'bool', true}])),
-    ok.
diff --git a/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/rjms_topic_selector_unit_SUITE.erl b/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/rjms_topic_selector_unit_SUITE.erl
deleted file mode 100644 (file)
index 4bcd0d0..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is Pivotal Software, Inc.
-%% Copyright (c) 2012, 2013 Pivotal Software, Inc.  All rights reserved.
-%% -----------------------------------------------------------------------------
-
-%% Unit test file for RJMS Topic Selector plugin
-
-%% -----------------------------------------------------------------------------
-
--module(rjms_topic_selector_unit_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include("rabbit_jms_topic_exchange.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--import(rabbit_jms_topic_exchange, [ description/0
-                                   , serialise_events/0
-                                   , route/2
-                                   , validate/1
-                                   , create/2
-                                   , delete/3
-                                   , validate_binding/2
-                                   , add_binding/3
-                                   , remove_bindings/3
-                                   , assert_args_equivalence/2
-                                   , policy_changed/3 ]).
-
-
-all() ->
-    [
-      {group, parallel_tests}
-    ].
-
-groups() ->
-    [
-      {parallel_tests, [parallel], [
-                                    description_test,
-                                    serialise_events_test,
-                                    validate_test,
-                                    create_test,
-                                    delete_test,
-                                    validate_binding_test,
-                                    add_binding_test
-                                   ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    Config.
-
-end_per_suite(Config) ->
-    Config.
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(_Testcase, Config) ->
-    Config.
-
-end_per_testcase(_Testcase, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-description_test(_Config) ->
-  ?assertMatch([{name, _}, {description, _}], description()).
-
-serialise_events_test(_Config) ->
-  ?assertMatch(false, serialise_events()).
-
-validate_test(_Config) ->
-  ?assertEqual(ok, validate(any_exchange)).
-
-create_test(_Config) ->
-  ?assertEqual(ok, create(none, any_exchange)).
-
-delete_test(_Config) ->
-  ?assertEqual(ok, delete(none, any_exchange, any_bindings)).
-
-validate_binding_test(_Config) ->
-  ?assertEqual(ok, validate_binding(any_exchange, any_bindings)).
-
-add_binding_test(_Config) ->
-  ?assertEqual(ok, add_binding(none, dummy_exchange(), dummy_binding())).
-
-dummy_exchange() ->
-  #exchange{name = <<"XName">>, arguments = []}.
-
-dummy_binding() ->
-  #binding{ key = <<"BindingKey">>
-          , destination = #resource{name = <<"DName">>}
-          , args = [{?RJMS_COMPILED_SELECTOR_ARG, longstr, <<"<<\"false\">>.">>}
-                   ,{?RJMS_VERSION_ARG, longstr, <<"1.4.7">>}]}.
diff --git a/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/sjx_evaluation_SUITE.erl b/rabbitmq-server/deps/rabbitmq_jms_topic_exchange/test/sjx_evaluation_SUITE.erl
deleted file mode 100644 (file)
index 969a5a1..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is Pivotal Software, Inc.
-%% Copyright (c) 2012, 2013 Pivotal Software, Inc.  All rights reserved.
-%% -----------------------------------------------------------------------------
-%% Derived from works which were:
-%% Copyright (c) 2012, 2013 Steve Powell (Zteve.Powell@gmail.com)
-%% -----------------------------------------------------------------------------
-
-%% Tests for sjx_evaluator
-
-%% -----------------------------------------------------------------------------
--module(sjx_evaluation_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--import(sjx_evaluator, [evaluate/2]).
-
-%% Fixed type info for identifiers
-%%
--define(TEST_TYPE_INFO,
-[ {<<"JMSType">>,          longstr, <<"string">>}
-, {<<"JMSCorrelationID">>, longstr, <<"string">>}
-, {<<"JMSMessageID">>,     longstr, <<"string">>}
-, {<<"JMSDeliveryMode">>,  longstr, <<"string">>}
-, {<<"JMSPriority">>,      longstr, <<"number">>}
-, {<<"JMSTimestamp">>,     longstr, <<"number">>}
-]).
-
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                basic_evaluate_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    Config.
-
-end_per_suite(Config) ->
-    Config.
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(_Testcase, Config) ->
-    Config.
-
-end_per_testcase(_Testcase, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-basic_evaluate_test(_Config) ->
-    Hs = [{<<"JMSType">>, longstr, <<"car">>},
-          {<<"colour">>, longstr, <<"blue">>},
-          {<<"altcol">>, longstr, <<"'blue">>},
-          {<<"likevar">>, longstr, <<"bl_ue">>},
-          {<<"weight">>, signedint, 2501},
-          {<<"WeIgHt">>, signedint, 2},
-          {<<"afloat">>, float, 3.0e-2},
-          {<<"abool">>, bool, false}],
-
-    [ ?_assert(    eval(Hs, {'=', {'ident', <<"JMSType">>}, <<"car">>}                      ))
-    , ?_assert(not eval(Hs, {'ident', <<"abool">>}                                          ))
-    , ?_assert(    eval(Hs, {'not', {'ident', <<"abool">>}}                                 ))
-    , ?_assert(    eval(Hs, {'=', {'ident', <<"colour">>}, <<"blue">>}                      ))
-    , ?_assert(    eval(Hs, {'=', {'ident', <<"weight">>}, 2501}                            ))
-    , ?_assert(    eval(Hs, {'=', {'ident', <<"WeIgHt">>}, 2}                               ))
-    , ?_assert(    eval(Hs, {'=', 2501, {'ident', <<"weight">>}}                            ))
-    , ?_assert(    eval(Hs, {'=', {'ident', <<"afloat">>}, 3.0e-2}                          ))
-    , ?_assert(    eval(Hs, {'>', {'ident', <<"weight">>}, 2500}                            ))
-    , ?_assert(    eval(Hs, {'<', {'ident', <<"weight">>}, 2502}                            ))
-    , ?_assert(    eval(Hs, {'>=', {'ident', <<"weight">>}, 2501}                           ))
-    , ?_assert(    eval(Hs, {'<=', {'ident', <<"weight">>}, 2501}                           ))
-    , ?_assert(not eval(Hs, {'<=', {'ident', <<"weight">>}, 2500}                           ))
-    , ?_assert(    eval(Hs, {'between', {'ident', <<"weight">>}, {'range', 0, 2501}}        ))
-    , ?_assert(    eval(Hs, {'between', {'ident', <<"weight">>}, {'range', 2500, 2501}}     ))
-    , ?_assert(    eval(Hs, {'between', 17, {'range', 17, 18}}                              ))
-    , ?_assert(    eval(Hs, {'between', 17, {'range', 17, 17}}                              ))
-    , ?_assert(    eval(Hs, {'not_between', 16, {'range', 17, 18}}                          ))
-    , ?_assert(    eval(Hs, {'<', 2500, {'ident', <<"weight">>}}                            ))
-    , ?_assert(    eval(Hs, {'>', 2502, {'ident', <<"weight">>}}                            ))
-    , ?_assert(    eval(Hs, {'<=', 2500, {'ident', <<"weight">>}}                           ))
-    , ?_assert(    eval(Hs, {'>=', 2502, {'ident', <<"weight">>}}                           ))
-    , ?_assert(    eval(Hs, {'<=', 2501, {'ident', <<"weight">>}}                           ))
-    , ?_assert(    eval(Hs, {'>=', 2501, {'ident', <<"weight">>}}                           ))
-    , ?_assert(    eval(Hs, {'like', {'ident', <<"colour">>}, {<<"bl%">>, 'no_escape'}}     ))
-    , ?_assert(    eval(Hs, {'like', {'ident', <<"likevar">>}, {<<"b_!_ue">>, <<"!">>}}     ))
-    , ?_assert(    eval(Hs, {'like', {'ident', <<"colour">>}, {<<"bl_e">>, 'no_escape'}}    ))
-    , ?_assert(    eval(Hs, {'not_like', {'ident', <<"colour">>}, {<<"l%">>, 'no_escape'}}  ))
-    , ?_assert(not eval(Hs, {'not_like', {'ident', <<"colour">>}, {<<"bl%">>, 'no_escape'}} ))
-    , ?_assert(    eval(Hs, {'in', {'ident', <<"colour">>}, [<<"blue">>, <<"green">>]}      ))
-    , ?_assert(not eval(Hs, {'not_in', {'ident', <<"colour">>}, [<<"green">>, <<"blue">>]}  ))
-    , ?_assert(not eval(Hs, {'in', {'ident', <<"colour">>}, [<<"bleen">>, <<"grue">>]}      ))
-    , ?_assert(    eval(Hs, {'not_in', {'ident', <<"colour">>}, [<<"grue">>, <<"bleen">>]}  ))
-    , ?_assert(    eval(Hs, {'not_like', {'ident', <<"altcol">>}, {<<"bl%">>, 'no_escape'}} ))
-    , ?_assert(    eval(Hs, {'like', {'ident', <<"altcol">>}, {<<"'bl%">>, 'no_escape'}}    ))
-    , ?_assert(    eval(Hs, {'or', {'and', {'like', {'ident', <<"colour">>}, {<<"bl%">>, 'no_escape'}}
-                                         , {'>', {'ident', <<"weight">>}, 2500}}
-                                 , false}                                                   ))
-    , ?_assert(undefined =:= eval(Hs, {'<=', {'ident', <<"missing">>}, 2500}                ))
-    , ?_assert(undefined =:= eval(Hs, {'in', {'ident', <<"missing">>}, [<<"blue">>]}        ))
-    ].
-
-eval(Hs, S) -> evaluate(S, Hs).
diff --git a/rabbitmq-server/deps/rabbitmq_management/build.config b/rabbitmq-server/deps/rabbitmq_management/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_management/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_management/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_clustering_SUITE.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_clustering_SUITE.erl
deleted file mode 100644 (file)
index 8f348a6..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_clustering_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include("include/rabbit_mgmt_test.hrl").
-
--import(rabbit_ct_broker_helpers, [get_node_config/3, restart_node/2]).
--import(rabbit_mgmt_test_util, [http_get/2, http_put/4, http_delete/3]).
--import(rabbit_misc, [pget/2]).
-
--compile(export_all).
-
-all() ->
-    [
-     {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-     {non_parallel_tests, [], [
-                               list_cluster_nodes_test,
-                               multi_node_case1_test
-                              ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    inets:start(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-                                                    {rmq_nodename_suffix, ?MODULE},
-                                                    {rmq_nodes_count, 2}
-                                                   ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-                                         rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-list_cluster_nodes_test(Config) ->
-    %% see rmq_nodes_count in init_per_suite
-    ?assertEqual(2, length(http_get(Config, "/nodes"))),
-    passed.
-
-multi_node_case1_test(Config) ->
-    Nodename1 = get_node_config(Config, 0, nodename),
-    Nodename2 = get_node_config(Config, 1, nodename),
-    Policy = [{pattern,    <<".*">>},
-              {definition, [{'ha-mode', <<"all">>}]}],
-    http_put(Config, "/policies/%2f/HA", Policy, ?NO_CONTENT),
-    QArgs = [{node, list_to_binary(atom_to_list(Nodename2))}],
-    http_put(Config, "/queues/%2f/ha-queue", QArgs, ?NO_CONTENT),
-
-    Q = wait_for(Config, "/queues/%2f/ha-queue"),
-    assert_node(Nodename2, pget(node, Q)),
-    assert_single_node(Nodename1, pget(slave_nodes, Q)),
-    assert_single_node(Nodename1, pget(synchronised_slave_nodes, Q)),
-    %% restart node2
-    restart_node(Config, 1),
-
-    Q2 = wait_for(Config, "/queues/%2f/ha-queue"),
-    assert_node(Nodename1, pget(node, Q2)),
-    assert_single_node(Nodename2, pget(slave_nodes, Q2)),
-    assert_single_node(Nodename2, pget(synchronised_slave_nodes, Q2)),
-    http_delete(Config, "/queues/%2f/ha-queue", ?NO_CONTENT),
-    http_delete(Config, "/policies/%2f/HA", ?NO_CONTENT),
-
-    passed.
-
-%%----------------------------------------------------------------------------
-
-wait_for(Config, Path) ->
-    wait_for(Config, Path, [slave_nodes, synchronised_slave_nodes]).
-
-wait_for(Config, Path, Keys) ->
-    wait_for(Config, Path, Keys, 1000).
-
-wait_for(_Config, Path, Keys, 0) ->
-    exit({timeout, {Path, Keys}});
-
-wait_for(Config, Path, Keys, Count) ->
-    Res = http_get(Config, Path),
-    case present(Keys, Res) of
-        false -> timer:sleep(10),
-                 wait_for(Config, Path, Keys, Count - 1);
-        true  -> Res
-    end.
-
-present(Keys, Res) ->
-    lists:all(fun (Key) ->
-                      X = pget(Key, Res),
-                      X =/= [] andalso X =/= undefined
-              end, Keys).
-
-assert_single_node(Exp, Act) ->
-    ?assertEqual(1, length(Act)),
-    assert_node(Exp, hd(Act)).
-
-assert_nodes(Exp, Act0) ->
-    Act = [extract_node(A) || A <- Act0],
-    ?assertEqual(length(Exp), length(Act)),
-    [?assert(lists:member(E, Act)) || E <- Exp].
-
-assert_node(Exp, Act) ->
-    ?assertEqual(Exp, list_to_atom(binary_to_list(Act))).
-
-extract_node(N) ->
-    list_to_atom(hd(string:tokens(binary_to_list(N), "@"))).
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl
deleted file mode 100644 (file)
index 6e82fd1..0000000
+++ /dev/null
@@ -1,2046 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_http_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include("include/rabbit_mgmt_test.hrl").
-
--import(rabbit_ct_client_helpers, [close_connection/1, close_channel/1, open_unmanaged_connection/1]).
--import(rabbit_mgmt_test_util, [assert_list/2, assert_item/2, test_item/2,
-                                assert_keys/2, assert_no_keys/2,
-                                http_get/2, http_get/3, http_get/5,
-                                http_put/4, http_put/6,
-                                http_post/4, http_post/6,
-                                http_delete/3, http_delete/5,
-                                http_put_raw/4, http_post_accept_json/4,
-                                req/4, auth_header/2,
-                                amqp_port/1]).
-
--import(rabbit_misc, [pget/2]).
-
--compile(export_all).
-
-all() ->
-    [
-     {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-     {non_parallel_tests, [], [
-                               overview_test,
-                               auth_test,
-                               cluster_name_test,
-                               nodes_test,
-                               memory_test,
-                               ets_tables_memory_test,
-                               vhosts_test,
-                               vhosts_trace_test,
-                               users_test,
-                               users_legacy_administrator_test,
-                               permissions_validation_test,
-                               permissions_list_test,
-                               permissions_test,
-                               connections_test,
-                               multiple_invalid_connections_test,
-                               exchanges_test,
-                               queues_test,
-                               bindings_test,
-                               bindings_post_test,
-                               bindings_e2e_test,
-                               permissions_administrator_test,
-                               permissions_vhost_test,
-                               permissions_amqp_test,
-                               permissions_connection_channel_consumer_test,
-                               consumers_test,
-                               definitions_test,
-                               definitions_vhost_test,
-                               definitions_password_test,
-                               definitions_remove_things_test,
-                               definitions_server_named_queue_test,
-                               aliveness_test,
-                               healthchecks_test,
-                               arguments_test,
-                               arguments_table_test,
-                               queue_purge_test,
-                               queue_actions_test,
-                               exclusive_consumer_test,
-                               exclusive_queue_test,
-                               connections_channels_pagination_test,
-                               exchanges_pagination_test,
-                               exchanges_pagination_permissions_test,
-                               queue_pagination_test,
-                               queues_pagination_permissions_test,
-                               samples_range_test,
-                               sorting_test,
-                               format_output_test,
-                               columns_test,
-                               get_test,
-                               get_fail_test,
-                               publish_test,
-                               publish_accept_json_test,
-                               publish_fail_test,
-                               publish_base64_test,
-                               publish_unrouted_test,
-                               if_empty_unused_test,
-                               parameters_test,
-                               policy_test,
-                               policy_permissions_test,
-                               issue67_test,
-                               extensions_test,
-                               cors_test
-                              ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    inets:start(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-                                                    {rmq_nodename_suffix, ?MODULE}
-                                                   ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps() ++
-                                          rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-                                         rabbit_ct_client_helpers:teardown_steps() ++
-                                             rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-
-overview_test(Config) ->
-    %% Rather crude, but this req doesn't say much and at least this means it
-    %% didn't blow up.
-    true = 0 < length(pget(listeners, http_get(Config, "/overview"))),
-    http_put(Config, "/users/myuser", [{password, <<"myuser">>},
-                                       {tags,     <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_get(Config, "/overview", "myuser", "myuser", ?OK),
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-
-    passed.
-
-cluster_name_test(Config) ->
-    http_put(Config, "/users/myuser", [{password, <<"myuser">>},
-                                       {tags,     <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/cluster-name", [{name, "foo"}], "myuser", "myuser", ?NOT_AUTHORISED),
-    http_put(Config, "/cluster-name", [{name, "foo"}], ?NO_CONTENT),
-    [{name, <<"foo">>}] = http_get(Config, "/cluster-name", "myuser", "myuser", ?OK),
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    passed.
-
-nodes_test(Config) ->
-    http_put(Config, "/users/user", [{password, <<"user">>},
-                                     {tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/monitor", [{password, <<"monitor">>},
-                                        {tags, <<"monitoring">>}], [?CREATED, ?NO_CONTENT]),
-    DiscNode = [{type, <<"disc">>}, {running, true}],
-    assert_list([DiscNode], http_get(Config, "/nodes")),
-    assert_list([DiscNode], http_get(Config, "/nodes", "monitor", "monitor", ?OK)),
-    http_get(Config, "/nodes", "user", "user", ?NOT_AUTHORISED),
-    [Node] = http_get(Config, "/nodes"),
-    Path = "/nodes/" ++ binary_to_list(pget(name, Node)),
-    assert_item(DiscNode, http_get(Config, Path, ?OK)),
-    assert_item(DiscNode, http_get(Config, Path, "monitor", "monitor", ?OK)),
-    http_get(Config, Path, "user", "user", ?NOT_AUTHORISED),
-    http_delete(Config, "/users/user", ?NO_CONTENT),
-    http_delete(Config, "/users/monitor", ?NO_CONTENT),
-    passed.
-
-memory_test(Config) ->
-    [Node] = http_get(Config, "/nodes"),
-    Path = "/nodes/" ++ binary_to_list(pget(name, Node)) ++ "/memory",
-    Result = http_get(Config, Path, ?OK),
-    assert_keys([memory], Result),
-    Keys = [total, connection_readers, connection_writers, connection_channels,
-            connection_other, queue_procs, queue_slave_procs, plugins,
-            other_proc, mnesia, mgmt_db, msg_index, other_ets, binary, code,
-            atom, other_system],
-    assert_keys(Keys, pget(memory, Result)),
-    http_get(Config, "/nodes/nonode/memory", ?NOT_FOUND),
-    %% Relative memory as a percentage of the total
-    Result1 = http_get(Config, Path ++ "/relative", ?OK),
-    assert_keys([memory], Result1),
-    Breakdown = pget(memory, Result1),
-    assert_keys(Keys, Breakdown),
-    assert_item([{total, 100}], Breakdown),
-    assert_percentage(Breakdown),
-    http_get(Config, "/nodes/nonode/memory/relative", ?NOT_FOUND),
-    passed.
-
-ets_tables_memory_test(Config) ->
-    [Node] = http_get(Config, "/nodes"),
-    Path = "/nodes/" ++ binary_to_list(pget(name, Node)) ++ "/memory/ets",
-    Result = http_get(Config, Path, ?OK),
-    assert_keys([ets_tables_memory], Result),
-    NonMgmtKeys = [rabbit_vhost,rabbit_user_permission],
-    Keys = [total, old_stats_fine_index,
-            connection_stats_key_index, channel_stats_key_index,
-            old_stats, node_node_stats, node_stats, consumers_by_channel,
-            consumers_by_queue, channel_stats, connection_stats, queue_stats],
-    assert_keys(Keys ++ NonMgmtKeys, pget(ets_tables_memory, Result)),
-    http_get(Config, "/nodes/nonode/memory/ets", ?NOT_FOUND),
-    %% Relative memory as a percentage of the total
-    ResultRelative = http_get(Config, Path ++ "/relative", ?OK),
-    assert_keys([ets_tables_memory], ResultRelative),
-    Breakdown = pget(ets_tables_memory, ResultRelative),
-    assert_keys(Keys, Breakdown),
-    assert_item([{total, 100}], Breakdown),
-    assert_percentage(Breakdown),
-    http_get(Config, "/nodes/nonode/memory/ets/relative", ?NOT_FOUND),
-
-    ResultMgmt = http_get(Config, Path ++ "/management", ?OK),
-    assert_keys([ets_tables_memory], ResultMgmt),
-    assert_keys(Keys, pget(ets_tables_memory, ResultMgmt)),
-    assert_no_keys(NonMgmtKeys, pget(ets_tables_memory, ResultMgmt)),
-
-    ResultMgmtRelative = http_get(Config, Path ++ "/management/relative", ?OK),
-    assert_keys([ets_tables_memory], ResultMgmtRelative),
-    assert_keys(Keys, pget(ets_tables_memory, ResultMgmtRelative)),
-    assert_no_keys(NonMgmtKeys, pget(ets_tables_memory, ResultMgmtRelative)),
-    assert_item([{total, 100}], pget(ets_tables_memory, ResultMgmtRelative)),
-    assert_percentage(pget(ets_tables_memory, ResultMgmtRelative)),
-
-    ResultUnknownFilter = http_get(Config, Path ++ "/blahblah", ?OK),
-    [{ets_tables_memory, <<"no_tables">>}] = ResultUnknownFilter,
-    passed.
-
-assert_percentage(Breakdown) ->
-    Total = lists:sum([P || {K, P} <- Breakdown, K =/= total]),
-    Count = length(Breakdown) - 1,
-    %% Rounding up and down can lose some digits. Never more than the number
-    %% of items in the breakdown.
-    case ((Total =< 100 + Count) andalso (Total >= 100 - Count)) of
-        false ->
-            throw({bad_percentage, Total, Breakdown});
-        true ->
-            ok
-    end.
-
-auth_test(Config) ->
-    http_put(Config, "/users/user", [{password, <<"user">>},
-                                     {tags, <<"">>}], [?CREATED, ?NO_CONTENT]),
-    test_auth(Config, ?NOT_AUTHORISED, []),
-    test_auth(Config, ?NOT_AUTHORISED, [auth_header("user", "user")]),
-    test_auth(Config, ?NOT_AUTHORISED, [auth_header("guest", "gust")]),
-    test_auth(Config, ?OK, [auth_header("guest", "guest")]),
-    http_delete(Config, "/users/user", ?NO_CONTENT),
-    passed.
-
-%% This test is rather over-verbose as we're trying to test understanding of
-%% Webmachine
-vhosts_test(Config) ->
-    assert_list([[{name, <<"/">>}]], http_get(Config, "/vhosts")),
-    %% Create a new one
-    http_put(Config, "/vhosts/myvhost", none, [?CREATED, ?NO_CONTENT]),
-    %% PUT should be idempotent
-    http_put(Config, "/vhosts/myvhost", none, ?NO_CONTENT),
-    %% Check it's there
-    assert_list([[{name, <<"/">>}], [{name, <<"myvhost">>}]],
-                http_get(Config, "/vhosts")),
-    %% Check individually
-    assert_item([{name, <<"/">>}], http_get(Config, "/vhosts/%2f", ?OK)),
-    assert_item([{name, <<"myvhost">>}],http_get(Config, "/vhosts/myvhost")),
-    %% Delete it
-    http_delete(Config, "/vhosts/myvhost", ?NO_CONTENT),
-    %% It's not there
-    http_get(Config, "/vhosts/myvhost", ?NOT_FOUND),
-    http_delete(Config, "/vhosts/myvhost", ?NOT_FOUND),
-
-    passed.
-
-vhosts_trace_test(Config) ->
-    http_put(Config, "/vhosts/myvhost", none, [?CREATED, ?NO_CONTENT]),
-    Disabled = [{name,  <<"myvhost">>}, {tracing, false}],
-    Enabled  = [{name,  <<"myvhost">>}, {tracing, true}],
-    Disabled = http_get(Config, "/vhosts/myvhost"),
-    http_put(Config, "/vhosts/myvhost", [{tracing, true}], ?NO_CONTENT),
-    Enabled = http_get(Config, "/vhosts/myvhost"),
-    http_put(Config, "/vhosts/myvhost", [{tracing, true}], ?NO_CONTENT),
-    Enabled = http_get(Config, "/vhosts/myvhost"),
-    http_put(Config, "/vhosts/myvhost", [{tracing, false}], ?NO_CONTENT),
-    Disabled = http_get(Config, "/vhosts/myvhost"),
-    http_delete(Config, "/vhosts/myvhost", ?NO_CONTENT),
-
-    passed.
-
-users_test(Config) ->
-    assert_item([{name, <<"guest">>}, {tags, <<"administrator">>}],
-                http_get(Config, "/whoami")),
-    http_get(Config, "/users/myuser", ?NOT_FOUND),
-    http_put_raw(Config, "/users/myuser", "Something not JSON", ?BAD_REQUEST),
-    http_put(Config, "/users/myuser", [{flim, <<"flam">>}], ?BAD_REQUEST),
-    http_put(Config, "/users/myuser", [{tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/myuser", [{password_hash, <<"not_hash">>}], ?BAD_REQUEST),
-    http_put(Config, "/users/myuser", [{password_hash,
-                                        <<"IECV6PZI/Invh0DL187KFpkO5Jc=">>},
-                                       {tags, <<"management">>}], ?NO_CONTENT),
-    assert_item([{name, <<"myuser">>}, {tags, <<"management">>},
-                 {password_hash, <<"IECV6PZI/Invh0DL187KFpkO5Jc=">>},
-                 {hashing_algorithm, <<"rabbit_password_hashing_sha256">>}],
-                http_get(Config, "/users/myuser")),
-
-    http_put(Config, "/users/myuser", [{password_hash,
-                                        <<"IECV6PZI/Invh0DL187KFpkO5Jc=">>},
-                                       {hashing_algorithm, <<"rabbit_password_hashing_md5">>},
-                                       {tags, <<"management">>}], ?NO_CONTENT),
-    assert_item([{name, <<"myuser">>}, {tags, <<"management">>},
-                 {password_hash, <<"IECV6PZI/Invh0DL187KFpkO5Jc=">>},
-                 {hashing_algorithm, <<"rabbit_password_hashing_md5">>}],
-                http_get(Config, "/users/myuser")),
-    http_put(Config, "/users/myuser", [{password, <<"password">>},
-                                       {tags, <<"administrator, foo">>}], ?NO_CONTENT),
-    assert_item([{name, <<"myuser">>}, {tags, <<"administrator,foo">>}],
-                http_get(Config, "/users/myuser")),
-    assert_list([[{name, <<"myuser">>}, {tags, <<"administrator,foo">>}],
-                 [{name, <<"guest">>}, {tags, <<"administrator">>}]],
-                http_get(Config, "/users")),
-    test_auth(Config, ?OK, [auth_header("myuser", "password")]),
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    test_auth(Config, ?NOT_AUTHORISED, [auth_header("myuser", "password")]),
-    http_get(Config, "/users/myuser", ?NOT_FOUND),
-    passed.
-
-users_legacy_administrator_test(Config) ->
-    http_put(Config, "/users/myuser1", [{administrator, <<"true">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/myuser2", [{administrator, <<"false">>}], [?CREATED, ?NO_CONTENT]),
-    assert_item([{name, <<"myuser1">>}, {tags, <<"administrator">>}],
-                http_get(Config, "/users/myuser1")),
-    assert_item([{name, <<"myuser2">>}, {tags, <<"">>}],
-                http_get(Config, "/users/myuser2")),
-    http_delete(Config, "/users/myuser1", ?NO_CONTENT),
-    http_delete(Config, "/users/myuser2", ?NO_CONTENT),
-    passed.
-
-permissions_validation_test(Config) ->
-    Good = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/permissions/wrong/guest", Good, ?BAD_REQUEST),
-    http_put(Config, "/permissions/%2f/wrong", Good, ?BAD_REQUEST),
-    http_put(Config, "/permissions/%2f/guest",
-             [{configure, <<"[">>}, {write, <<".*">>}, {read, <<".*">>}],
-             ?BAD_REQUEST),
-    http_put(Config, "/permissions/%2f/guest", Good, ?NO_CONTENT),
-    passed.
-
-permissions_list_test(Config) ->
-    [[{user,<<"guest">>},
-      {vhost,<<"/">>},
-      {configure,<<".*">>},
-      {write,<<".*">>},
-      {read,<<".*">>}]] =
-        http_get(Config, "/permissions"),
-
-    http_put(Config, "/users/myuser1", [{password, <<"">>}, {tags, <<"administrator">>}],
-             [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/myuser2", [{password, <<"">>}, {tags, <<"administrator">>}],
-             [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/vhosts/myvhost1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/vhosts/myvhost2", none, [?CREATED, ?NO_CONTENT]),
-
-    Perms = [{configure, <<"foo">>}, {write, <<"foo">>}, {read, <<"foo">>}],
-    http_put(Config, "/permissions/myvhost1/myuser1", Perms, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/myvhost2/myuser1", Perms, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/myvhost1/myuser2", Perms, [?CREATED, ?NO_CONTENT]),
-
-    4 = length(http_get(Config, "/permissions")),
-    2 = length(http_get(Config, "/users/myuser1/permissions")),
-    1 = length(http_get(Config, "/users/myuser2/permissions")),
-
-    http_get(Config, "/users/notmyuser/permissions", ?NOT_FOUND),
-    http_get(Config, "/vhosts/notmyvhost/permissions", ?NOT_FOUND),
-
-    http_delete(Config, "/users/myuser1", ?NO_CONTENT),
-    http_delete(Config, "/users/myuser2", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/myvhost1", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/myvhost2", ?NO_CONTENT),
-    passed.
-
-permissions_test(Config) ->
-    http_put(Config, "/users/myuser", [{password, <<"myuser">>}, {tags, <<"administrator">>}],
-             [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/vhosts/myvhost", none, [?CREATED, ?NO_CONTENT]),
-
-    http_put(Config, "/permissions/myvhost/myuser",
-             [{configure, <<"foo">>}, {write, <<"foo">>}, {read, <<"foo">>}],
-             [?CREATED, ?NO_CONTENT]),
-
-    Permission = [{user,<<"myuser">>},
-                  {vhost,<<"myvhost">>},
-                  {configure,<<"foo">>},
-                  {write,<<"foo">>},
-                  {read,<<"foo">>}],
-    Default = [{user,<<"guest">>},
-               {vhost,<<"/">>},
-               {configure,<<".*">>},
-               {write,<<".*">>},
-               {read,<<".*">>}],
-    Permission = http_get(Config, "/permissions/myvhost/myuser"),
-    assert_list([Permission, Default], http_get(Config, "/permissions")),
-    assert_list([Permission], http_get(Config, "/users/myuser/permissions")),
-    http_delete(Config, "/permissions/myvhost/myuser", ?NO_CONTENT),
-    http_get(Config, "/permissions/myvhost/myuser", ?NOT_FOUND),
-
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/myvhost", ?NO_CONTENT),
-    passed.
-
-connections_test(Config) ->
-    {Conn, _Ch} = open_connection_and_channel(Config),
-    LocalPort = local_port(Conn),
-    Path = binary_to_list(
-             rabbit_mgmt_format:print(
-               "/connections/127.0.0.1%3A~w%20->%20127.0.0.1%3A~w",
-               [LocalPort, amqp_port(Config)])),
-    http_get(Config, Path, ?OK),
-    http_delete(Config, Path, ?NO_CONTENT),
-    %% TODO rabbit_reader:shutdown/2 returns before the connection is
-    %% closed. It may not be worth fixing.
-    timer:sleep(200),
-    http_get(Config, Path, ?NOT_FOUND),
-    close_connection(Conn),
-    passed.
-
-multiple_invalid_connections_test(Config) ->
-    Count = 100,
-    spawn_invalid(Config, Count),
-    Page0 = http_get(Config, "/connections?page=1&page_size=100", ?OK),
-    wait_for_answers(Count),
-    Page1 = http_get(Config, "/connections?page=1&page_size=100", ?OK),
-    ?assertEqual(0, proplists:get_value(total_count, Page0)),
-    ?assertEqual(0, proplists:get_value(total_count, Page1)),
-    passed.
-
-test_auth(Config, Code, Headers) ->
-    {ok, {{_, Code, _}, _, _}} = req(Config, get, "/overview", Headers),
-    passed.
-
-exchanges_test(Config) ->
-    %% Can pass booleans or strings
-    Good = [{type, <<"direct">>}, {durable, <<"true">>}],
-    http_put(Config, "/vhosts/myvhost", none, [?CREATED, ?NO_CONTENT]),
-    http_get(Config, "/exchanges/myvhost/foo", ?NOT_AUTHORISED),
-    http_put(Config, "/exchanges/myvhost/foo", Good, ?NOT_AUTHORISED),
-    http_put(Config, "/permissions/myvhost/guest",
-             [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-             [?CREATED, ?NO_CONTENT]),
-    http_get(Config, "/exchanges/myvhost/foo", ?NOT_FOUND),
-    http_put(Config, "/exchanges/myvhost/foo", Good, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/exchanges/myvhost/foo", Good, ?NO_CONTENT),
-    http_get(Config, "/exchanges/%2f/foo", ?NOT_FOUND),
-    assert_item([{name,<<"foo">>},
-                 {vhost,<<"myvhost">>},
-                 {type,<<"direct">>},
-                 {durable,true},
-                 {auto_delete,false},
-                 {internal,false},
-                 {arguments,[]}],
-                http_get(Config, "/exchanges/myvhost/foo")),
-
-    http_put(Config, "/exchanges/badvhost/bar", Good, ?NOT_FOUND),
-    http_put(Config, "/exchanges/myvhost/bar", [{type, <<"bad_exchange_type">>}],
-             ?BAD_REQUEST),
-    http_put(Config, "/exchanges/myvhost/bar", [{type, <<"direct">>},
-                                                {durable, <<"troo">>}],
-             ?BAD_REQUEST),
-    http_put(Config, "/exchanges/myvhost/foo", [{type, <<"direct">>}],
-             ?BAD_REQUEST),
-
-    http_delete(Config, "/exchanges/myvhost/foo", ?NO_CONTENT),
-    http_delete(Config, "/exchanges/myvhost/foo", ?NOT_FOUND),
-
-    http_delete(Config, "/vhosts/myvhost", ?NO_CONTENT),
-    http_get(Config, "/exchanges/badvhost", ?NOT_FOUND),
-    passed.
-
-queues_test(Config) ->
-    Good = [{durable, true}],
-    http_get(Config, "/queues/%2f/foo", ?NOT_FOUND),
-    http_put(Config, "/queues/%2f/foo", Good, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/foo", Good, ?NO_CONTENT),
-    http_get(Config, "/queues/%2f/foo", ?OK),
-
-    http_put(Config, "/queues/badvhost/bar", Good, ?NOT_FOUND),
-    http_put(Config, "/queues/%2f/bar",
-             [{durable, <<"troo">>}],
-             ?BAD_REQUEST),
-    http_put(Config, "/queues/%2f/foo",
-             [{durable, false}],
-             ?BAD_REQUEST),
-
-    http_put(Config, "/queues/%2f/baz", Good, [?CREATED, ?NO_CONTENT]),
-
-    Queues = http_get(Config, "/queues/%2f"),
-    Queue = http_get(Config, "/queues/%2f/foo"),
-    assert_list([[{name,        <<"foo">>},
-                  {vhost,       <<"/">>},
-                  {durable,     true},
-                  {auto_delete, false},
-                  {exclusive,   false},
-                  {arguments,   []}],
-                 [{name,        <<"baz">>},
-                  {vhost,       <<"/">>},
-                  {durable,     true},
-                  {auto_delete, false},
-                  {exclusive,   false},
-                  {arguments,   []}]], Queues),
-    assert_item([{name,        <<"foo">>},
-                 {vhost,       <<"/">>},
-                 {durable,     true},
-                 {auto_delete, false},
-                 {exclusive,   false},
-                 {arguments,   []}], Queue),
-
-    http_delete(Config, "/queues/%2f/foo", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/baz", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/foo", ?NOT_FOUND),
-    http_get(Config, "/queues/badvhost", ?NOT_FOUND),
-    passed.
-
-bindings_test(Config) ->
-    XArgs = [{type, <<"direct">>}],
-    QArgs = [],
-    http_put(Config, "/exchanges/%2f/myexchange", XArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/myqueue", QArgs, [?CREATED, ?NO_CONTENT]),
-    BArgs = [{routing_key, <<"routing">>}, {arguments, []}],
-    http_post(Config, "/bindings/%2f/e/myexchange/q/myqueue", BArgs, [?CREATED, ?NO_CONTENT]),
-    http_get(Config, "/bindings/%2f/e/myexchange/q/myqueue/routing", ?OK),
-    http_get(Config, "/bindings/%2f/e/myexchange/q/myqueue/rooting", ?NOT_FOUND),
-    Binding =
-        [{source,<<"myexchange">>},
-         {vhost,<<"/">>},
-         {destination,<<"myqueue">>},
-         {destination_type,<<"queue">>},
-         {routing_key,<<"routing">>},
-         {arguments,[]},
-         {properties_key,<<"routing">>}],
-    DBinding =
-        [{source,<<"">>},
-         {vhost,<<"/">>},
-         {destination,<<"myqueue">>},
-         {destination_type,<<"queue">>},
-         {routing_key,<<"myqueue">>},
-         {arguments,[]},
-         {properties_key,<<"myqueue">>}],
-    Binding = http_get(Config, "/bindings/%2f/e/myexchange/q/myqueue/routing"),
-    assert_list([Binding],
-                http_get(Config, "/bindings/%2f/e/myexchange/q/myqueue")),
-    assert_list([Binding, DBinding],
-                http_get(Config, "/queues/%2f/myqueue/bindings")),
-    assert_list([Binding],
-                http_get(Config, "/exchanges/%2f/myexchange/bindings/source")),
-    http_delete(Config, "/bindings/%2f/e/myexchange/q/myqueue/routing", ?NO_CONTENT),
-    http_delete(Config, "/bindings/%2f/e/myexchange/q/myqueue/routing", ?NOT_FOUND),
-    http_delete(Config, "/exchanges/%2f/myexchange", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    http_get(Config, "/bindings/badvhost", ?NOT_FOUND),
-    http_get(Config, "/bindings/badvhost/myqueue/myexchange/routing", ?NOT_FOUND),
-    http_get(Config, "/bindings/%2f/e/myexchange/q/myqueue/routing", ?NOT_FOUND),
-    passed.
-
-bindings_post_test(Config) ->
-    XArgs = [{type, <<"direct">>}],
-    QArgs = [],
-    BArgs = [{routing_key, <<"routing">>}, {arguments, [{foo, <<"bar">>}]}],
-    http_put(Config, "/exchanges/%2f/myexchange", XArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/myqueue", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/bindings/%2f/e/myexchange/q/badqueue", BArgs, ?NOT_FOUND),
-    http_post(Config, "/bindings/%2f/e/badexchange/q/myqueue", BArgs, ?NOT_FOUND),
-    Headers1 = http_post(Config, "/bindings/%2f/e/myexchange/q/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    "../../../../%2F/e/myexchange/q/myqueue/~" = pget("location", Headers1),
-    Headers2 = http_post(Config, "/bindings/%2f/e/myexchange/q/myqueue", BArgs, [?CREATED, ?NO_CONTENT]),
-    PropertiesKey = "routing~V4mGFgnPNrdtRmluZIxTDA",
-    PropertiesKeyBin = list_to_binary(PropertiesKey),
-    "../../../../%2F/e/myexchange/q/myqueue/" ++ PropertiesKey =
-        pget("location", Headers2),
-    URI = "/bindings/%2F/e/myexchange/q/myqueue/" ++ PropertiesKey,
-    [{source,<<"myexchange">>},
-     {vhost,<<"/">>},
-     {destination,<<"myqueue">>},
-     {destination_type,<<"queue">>},
-     {routing_key,<<"routing">>},
-     {arguments,[{foo,<<"bar">>}]},
-     {properties_key,PropertiesKeyBin}] = http_get(Config, URI, ?OK),
-    http_get(Config, URI ++ "x", ?NOT_FOUND),
-    http_delete(Config, URI, ?NO_CONTENT),
-    http_delete(Config, "/exchanges/%2f/myexchange", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-bindings_e2e_test(Config) ->
-    BArgs = [{routing_key, <<"routing">>}, {arguments, []}],
-    http_post(Config, "/bindings/%2f/e/amq.direct/e/badexchange", BArgs, ?NOT_FOUND),
-    http_post(Config, "/bindings/%2f/e/badexchange/e/amq.fanout", BArgs, ?NOT_FOUND),
-    Headers = http_post(Config, "/bindings/%2f/e/amq.direct/e/amq.fanout", BArgs, [?CREATED, ?NO_CONTENT]),
-    "../../../../%2F/e/amq.direct/e/amq.fanout/routing" =
-        pget("location", Headers),
-    [{source,<<"amq.direct">>},
-     {vhost,<<"/">>},
-     {destination,<<"amq.fanout">>},
-     {destination_type,<<"exchange">>},
-     {routing_key,<<"routing">>},
-     {arguments,[]},
-     {properties_key,<<"routing">>}] =
-        http_get(Config, "/bindings/%2f/e/amq.direct/e/amq.fanout/routing", ?OK),
-    http_delete(Config, "/bindings/%2f/e/amq.direct/e/amq.fanout/routing", ?NO_CONTENT),
-    http_post(Config, "/bindings/%2f/e/amq.direct/e/amq.headers", BArgs, [?CREATED, ?NO_CONTENT]),
-    Binding =
-        [{source,<<"amq.direct">>},
-         {vhost,<<"/">>},
-         {destination,<<"amq.headers">>},
-         {destination_type,<<"exchange">>},
-         {routing_key,<<"routing">>},
-         {arguments,[]},
-         {properties_key,<<"routing">>}],
-    Binding = http_get(Config, "/bindings/%2f/e/amq.direct/e/amq.headers/routing"),
-    assert_list([Binding],
-                http_get(Config, "/bindings/%2f/e/amq.direct/e/amq.headers")),
-    assert_list([Binding],
-                http_get(Config, "/exchanges/%2f/amq.direct/bindings/source")),
-    assert_list([Binding],
-                http_get(Config, "/exchanges/%2f/amq.headers/bindings/destination")),
-    http_delete(Config, "/bindings/%2f/e/amq.direct/e/amq.headers/routing", ?NO_CONTENT),
-    http_get(Config, "/bindings/%2f/e/amq.direct/e/amq.headers/rooting", ?NOT_FOUND),
-    passed.
-
-permissions_administrator_test(Config) ->
-    http_put(Config, "/users/isadmin", [{password, <<"isadmin">>},
-                                        {tags, <<"administrator">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/notadmin", [{password, <<"notadmin">>},
-                                         {tags, <<"administrator">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/notadmin", [{password, <<"notadmin">>},
-                                         {tags, <<"management">>}], ?NO_CONTENT),
-    Test =
-        fun(Path) ->
-                http_get(Config, Path, "notadmin", "notadmin", ?NOT_AUTHORISED),
-                http_get(Config, Path, "isadmin", "isadmin", ?OK),
-                http_get(Config, Path, "guest", "guest", ?OK)
-        end,
-    %% All users can get a list of vhosts. It may be filtered.
-    %%Test("/vhosts"),
-    Test("/vhosts/%2f"),
-    Test("/vhosts/%2f/permissions"),
-    Test("/users"),
-    Test("/users/guest"),
-    Test("/users/guest/permissions"),
-    Test("/permissions"),
-    Test("/permissions/%2f/guest"),
-    http_delete(Config, "/users/notadmin", ?NO_CONTENT),
-    http_delete(Config, "/users/isadmin", ?NO_CONTENT),
-    passed.
-
-permissions_vhost_test(Config) ->
-    QArgs = [],
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/users/myuser", [{password, <<"myuser">>},
-                                       {tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/vhosts/myvhost1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/vhosts/myvhost2", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/myvhost1/myuser", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/myvhost1/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/myvhost2/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-    assert_list([[{name, <<"/">>}],
-                 [{name, <<"myvhost1">>}],
-                 [{name, <<"myvhost2">>}]], http_get(Config, "/vhosts", ?OK)),
-    assert_list([[{name, <<"myvhost1">>}]],
-                http_get(Config, "/vhosts", "myuser", "myuser", ?OK)),
-    http_put(Config, "/queues/myvhost1/myqueue", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/myvhost2/myqueue", QArgs, [?CREATED, ?NO_CONTENT]),
-    Test1 =
-        fun(Path) ->
-                Results = http_get(Config, Path, "myuser", "myuser", ?OK),
-                [case pget(vhost, Result) of
-                     <<"myvhost2">> ->
-                         throw({got_result_from_vhost2_in, Path, Result});
-                     _ ->
-                         ok
-                 end || Result <- Results]
-        end,
-    Test2 =
-        fun(Path1, Path2) ->
-                http_get(Config, Path1 ++ "/myvhost1/" ++ Path2, "myuser", "myuser",
-                         ?OK),
-                http_get(Config, Path1 ++ "/myvhost2/" ++ Path2, "myuser", "myuser",
-                         ?NOT_AUTHORISED)
-        end,
-    Test1("/exchanges"),
-    Test2("/exchanges", ""),
-    Test2("/exchanges", "amq.direct"),
-    Test1("/queues"),
-    Test2("/queues", ""),
-    Test2("/queues", "myqueue"),
-    Test1("/bindings"),
-    Test2("/bindings", ""),
-    Test2("/queues", "myqueue/bindings"),
-    Test2("/exchanges", "amq.default/bindings/source"),
-    Test2("/exchanges", "amq.default/bindings/destination"),
-    Test2("/bindings", "e/amq.default/q/myqueue"),
-    Test2("/bindings", "e/amq.default/q/myqueue/myqueue"),
-    http_delete(Config, "/vhosts/myvhost1", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/myvhost2", ?NO_CONTENT),
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    passed.
-
-permissions_amqp_test(Config) ->
-    %% Just test that it works at all, not that it works in all possible cases.
-    QArgs = [],
-    PermArgs = [{configure, <<"foo.*">>}, {write, <<"foo.*">>},
-                {read,      <<"foo.*">>}],
-    http_put(Config, "/users/myuser", [{password, <<"myuser">>},
-                                       {tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/%2f/myuser", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/bar-queue", QArgs, "myuser", "myuser",
-             ?NOT_AUTHORISED),
-    http_put(Config, "/queues/%2f/bar-queue", QArgs, "nonexistent", "nonexistent",
-             ?NOT_AUTHORISED),
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    passed.
-
-%% Opens a new connection and a channel on it.
-%% The channel is not managed by rabbit_ct_client_helpers and
-%% should be explicitly closed by the caller.
-open_connection_and_channel(Config) ->
-    Conn = rabbit_ct_client_helpers:open_connection(Config, 0),
-    {ok, Ch}   = amqp_connection:open_channel(Conn),
-    {Conn, Ch}.
-
-get_conn(Config, Username, Password) ->
-    Port       = amqp_port(Config),
-    {ok, Conn} = amqp_connection:start(#amqp_params_network{
-                                          port     = Port,
-                                         username = list_to_binary(Username),
-                                         password = list_to_binary(Password)}),
-    LocalPort = local_port(Conn),
-    ConnPath = rabbit_misc:format(
-                 "/connections/127.0.0.1%3A~w%20->%20127.0.0.1%3A~w",
-                 [LocalPort, Port]),
-    ChPath = rabbit_misc:format(
-               "/channels/127.0.0.1%3A~w%20->%20127.0.0.1%3A~w%20(1)",
-               [LocalPort, Port]),
-    ConnChPath = rabbit_misc:format(
-                   "/connections/127.0.0.1%3A~w%20->%20127.0.0.1%3A~w/channels",
-                   [LocalPort, Port]),
-    {Conn, ConnPath, ChPath, ConnChPath}.
-
-permissions_connection_channel_consumer_test(Config) ->
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/users/user", [{password, <<"user">>},
-                                     {tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/%2f/user", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/monitor", [{password, <<"monitor">>},
-                                        {tags, <<"monitoring">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/%2f/monitor", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/test", [], [?CREATED, ?NO_CONTENT]),
-
-    {Conn1, UserConn, UserCh, UserConnCh} = get_conn(Config, "user", "user"),
-    {Conn2, MonConn, MonCh, MonConnCh} = get_conn(Config, "monitor", "monitor"),
-    {Conn3, AdmConn, AdmCh, AdmConnCh} = get_conn(Config, "guest", "guest"),
-    {ok, Ch1} = amqp_connection:open_channel(Conn1),
-    {ok, Ch2} = amqp_connection:open_channel(Conn2),
-    {ok, Ch3} = amqp_connection:open_channel(Conn3),
-    [amqp_channel:subscribe(
-       Ch, #'basic.consume'{queue = <<"test">>}, self()) ||
-        Ch <- [Ch1, Ch2, Ch3]],
-    AssertLength = fun (Path, User, Len) ->
-                           ?assertEqual(Len,
-                                        length(http_get(Config, Path, User, User, ?OK)))
-                   end,
-    [begin
-         AssertLength(P, "user", 1),
-         AssertLength(P, "monitor", 3),
-         AssertLength(P, "guest", 3)
-     end || P <- ["/connections", "/channels", "/consumers", "/consumers/%2f"]],
-
-    AssertRead = fun(Path, UserStatus) ->
-                         http_get(Config, Path, "user", "user", UserStatus),
-                         http_get(Config, Path, "monitor", "monitor", ?OK),
-                         http_get(Config, Path, ?OK)
-                 end,
-    AssertRead(UserConn, ?OK),
-    AssertRead(MonConn, ?NOT_AUTHORISED),
-    AssertRead(AdmConn, ?NOT_AUTHORISED),
-    AssertRead(UserCh, ?OK),
-    AssertRead(MonCh, ?NOT_AUTHORISED),
-    AssertRead(AdmCh, ?NOT_AUTHORISED),
-    AssertRead(UserConnCh, ?OK),
-    AssertRead(MonConnCh, ?NOT_AUTHORISED),
-    AssertRead(AdmConnCh, ?NOT_AUTHORISED),
-
-    AssertClose = fun(Path, User, Status) ->
-                          http_delete(Config, Path, User, User, Status)
-                  end,
-    AssertClose(UserConn, "monitor", ?NOT_AUTHORISED),
-    AssertClose(MonConn, "user", ?NOT_AUTHORISED),
-    AssertClose(AdmConn, "guest", ?NO_CONTENT),
-    AssertClose(MonConn, "guest", ?NO_CONTENT),
-    AssertClose(UserConn, "user", ?NO_CONTENT),
-
-    http_delete(Config, "/users/user", ?NO_CONTENT),
-    http_delete(Config, "/users/monitor", ?NO_CONTENT),
-    http_get(Config, "/connections/foo", ?NOT_FOUND),
-    http_get(Config, "/channels/foo", ?NOT_FOUND),
-    http_delete(Config, "/queues/%2f/test", ?NO_CONTENT),
-    passed.
-
-
-
-
-consumers_test(Config) ->
-    http_put(Config, "/queues/%2f/test", [], [?CREATED, ?NO_CONTENT]),
-    {Conn, _ConnPath, _ChPath, _ConnChPath} = get_conn(Config, "guest", "guest"),
-    {ok, Ch} = amqp_connection:open_channel(Conn),
-    amqp_channel:subscribe(
-      Ch, #'basic.consume'{queue        = <<"test">>,
-                           no_ack       = false,
-                           consumer_tag = <<"my-ctag">> }, self()),
-    assert_list([[{exclusive,    false},
-                  {ack_required, true},
-                  {consumer_tag, <<"my-ctag">>}]], http_get(Config, "/consumers")),
-    amqp_connection:close(Conn),
-    http_delete(Config, "/queues/%2f/test", ?NO_CONTENT),
-    passed.
-
-defs(Config, Key, URI, CreateMethod, Args) ->
-    defs(Config, Key, URI, CreateMethod, Args,
-         fun(URI2) -> http_delete(Config, URI2, ?NO_CONTENT) end).
-
-defs_v(Config, Key, URI, CreateMethod, Args) ->
-    Rep1 = fun (S, S2) -> re:replace(S, "<vhost>", S2, [{return, list}]) end,
-    Rep2 = fun (L, V2) -> lists:keymap(fun (vhost) -> V2;
-                                           (V)     -> V end, 2, L) end,
-    %% Test against default vhost
-    defs(Config, Key, Rep1(URI, "%2f"), CreateMethod, Rep2(Args, <<"/">>)),
-
-    %% Test against new vhost
-    http_put(Config, "/vhosts/test", none, [?CREATED, ?NO_CONTENT]),
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/permissions/test/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-    defs(Config, Key, Rep1(URI, "test"), CreateMethod, Rep2(Args, <<"test">>),
-         fun(URI2) -> http_delete(Config, URI2, ?NO_CONTENT),
-                      http_delete(Config, "/vhosts/test", ?NO_CONTENT) end).
-
-create(Config, CreateMethod, URI, Args) ->
-    case CreateMethod of
-        put        -> http_put(Config, URI, Args, [?CREATED, ?NO_CONTENT]),
-                      URI;
-        put_update -> http_put(Config, URI, Args, ?NO_CONTENT),
-                      URI;
-        post       -> Headers = http_post(Config, URI, Args, [?CREATED, ?NO_CONTENT]),
-                      rabbit_web_dispatch_util:unrelativise(
-                        URI, pget("location", Headers))
-    end.
-
-defs(Config, Key, URI, CreateMethod, Args, DeleteFun) ->
-    %% Create the item
-    URI2 = create(Config, CreateMethod, URI, Args),
-    %% Make sure it ends up in definitions
-    Definitions = http_get(Config, "/definitions", ?OK),
-    true = lists:any(fun(I) -> test_item(Args, I) end, pget(Key, Definitions)),
-
-    %% Delete it
-    DeleteFun(URI2),
-
-    %% Post the definitions back, it should get recreated in correct form
-    http_post(Config, "/definitions", Definitions, ?CREATED),
-    assert_item(Args, http_get(Config, URI2, ?OK)),
-
-    %% And delete it again
-    DeleteFun(URI2),
-
-    passed.
-
-register_parameters_and_policy_validator(Config) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_mgmt_runtime_parameters_util, register, []),
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_mgmt_runtime_parameters_util, register_policy_validator, []).
-
-unregister_parameters_and_policy_validator(Config) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_mgmt_runtime_parameters_util, unregister_policy_validator, []),
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_mgmt_runtime_parameters_util, unregister, []).
-
-definitions_test(Config) ->
-    register_parameters_and_policy_validator(Config),
-
-    defs_v(Config, queues, "/queues/<vhost>/my-queue", put,
-           [{name,    <<"my-queue">>},
-            {durable, true}]),
-    defs_v(Config, exchanges, "/exchanges/<vhost>/my-exchange", put,
-           [{name, <<"my-exchange">>},
-            {type, <<"direct">>}]),
-    defs_v(Config, bindings, "/bindings/<vhost>/e/amq.direct/e/amq.fanout", post,
-           [{routing_key, <<"routing">>}, {arguments, []}]),
-    defs_v(Config, policies, "/policies/<vhost>/my-policy", put,
-           [{vhost,      vhost},
-            {name,       <<"my-policy">>},
-            {pattern,    <<".*">>},
-            {definition, [{testpos, [1, 2, 3]}]},
-            {priority,   1}]),
-    defs_v(Config, parameters, "/parameters/test/<vhost>/good", put,
-           [{vhost,     vhost},
-            {component, <<"test">>},
-            {name,      <<"good">>},
-            {value,     <<"ignore">>}]),
-    defs(Config, users, "/users/myuser", put,
-         [{name,          <<"myuser">>},
-          {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-          {hashing_algorithm, <<"rabbit_password_hashing_sha256">>},
-          {tags,          <<"management">>}]),
-    defs(Config, vhosts, "/vhosts/myvhost", put,
-         [{name, <<"myvhost">>}]),
-    defs(Config, permissions, "/permissions/%2f/guest", put,
-         [{user,      <<"guest">>},
-          {vhost,     <<"/">>},
-          {configure, <<"c">>},
-          {write,     <<"w">>},
-          {read,      <<"r">>}]),
-
-    %% We just messed with guest's permissions
-    http_put(Config, "/permissions/%2f/guest",
-             [{configure, <<".*">>},
-              {write,     <<".*">>},
-              {read,      <<".*">>}], [?CREATED, ?NO_CONTENT]),
-    BrokenConfig =
-        [{users,       []},
-         {vhosts,      []},
-         {permissions, []},
-         {queues,      []},
-         {exchanges,   [[{name,        <<"amq.direct">>},
-                         {vhost,       <<"/">>},
-                         {type,        <<"definitely not direct">>},
-                         {durable,     true},
-                         {auto_delete, false},
-                         {arguments,   []}
-                        ]]},
-         {bindings,    []}],
-    http_post(Config, "/definitions", BrokenConfig, ?BAD_REQUEST),
-
-    unregister_parameters_and_policy_validator(Config),
-    passed.
-
-defs_vhost(Config, Key, URI, CreateMethod, Args) ->
-    Rep1 = fun (S, S2) -> re:replace(S, "<vhost>", S2, [{return, list}]) end,
-    Rep2 = fun (L, V2) -> lists:keymap(fun (vhost) -> V2;
-                                           (V)     -> V end, 2, L) end,
-
-    %% Create test vhost
-    http_put(Config, "/vhosts/test", none, [?CREATED, ?NO_CONTENT]),
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/permissions/test/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-
-    %% Test against default vhost
-    defs_vhost(Config, Key, URI, Rep1, "%2f", "test", CreateMethod,
-               Rep2(Args, <<"/">>), Rep2(Args, <<"test">>),
-               fun(URI2) -> http_delete(Config, URI2, [?NO_CONTENT, ?CREATED]) end),
-
-    %% Test against test vhost
-    defs_vhost(Config, Key, URI, Rep1, "test", "%2f", CreateMethod,
-               Rep2(Args, <<"test">>), Rep2(Args, <<"/">>),
-               fun(URI2) -> http_delete(Config, URI2, [?NO_CONTENT, ?CREATED]) end),
-
-    %% Remove test vhost
-    http_delete(Config, "/vhosts/test", ?NO_CONTENT).
-
-
-defs_vhost(Config, Key, URI0, Rep1, VHost1, VHost2, CreateMethod, Args1, Args2,
-           DeleteFun) ->
-    %% Create the item
-    URI2 = create(Config, CreateMethod, Rep1(URI0, VHost1), Args1),
-    %% Make sure it ends up in definitions
-    Definitions = http_get(Config, "/definitions/" ++ VHost1, ?OK),
-    true = lists:any(fun(I) -> test_item(Args1, I) end, pget(Key, Definitions)),
-
-    %% Make sure it is not in the other vhost
-    Definitions0 = http_get(Config, "/definitions/" ++ VHost2, ?OK),
-    false = lists:any(fun(I) -> test_item(Args2, I) end, pget(Key, Definitions0)),
-
-    %% Post the definitions back
-    http_post(Config, "/definitions/" ++ VHost2, Definitions, [?NO_CONTENT, ?CREATED]),
-
-    %% Make sure it is now in the other vhost
-    Definitions1 = http_get(Config, "/definitions/" ++ VHost2, ?OK),
-    true = lists:any(fun(I) -> test_item(Args2, I) end, pget(Key, Definitions1)),
-
-    %% Delete it
-    DeleteFun(URI2),
-    URI3 = create(Config, CreateMethod, Rep1(URI0, VHost2), Args2),
-    DeleteFun(URI3),
-    passed.
-
-definitions_vhost_test(Config) ->
-    %% Ensures that definitions can be exported/imported from a single virtual
-    %% host to another
-
-    register_parameters_and_policy_validator(Config),
-
-    defs_vhost(Config, queues, "/queues/<vhost>/my-queue", put,
-               [{name,    <<"my-queue">>},
-                {durable, true}]),
-    defs_vhost(Config, exchanges, "/exchanges/<vhost>/my-exchange", put,
-               [{name, <<"my-exchange">>},
-                {type, <<"direct">>}]),
-    defs_vhost(Config, bindings, "/bindings/<vhost>/e/amq.direct/e/amq.fanout", post,
-               [{routing_key, <<"routing">>}, {arguments, []}]),
-    defs_vhost(Config, policies, "/policies/<vhost>/my-policy", put,
-               [{vhost,      vhost},
-                {name,       <<"my-policy">>},
-                {pattern,    <<".*">>},
-                {definition, [{testpos, [1, 2, 3]}]},
-                {priority,   1}]),
-
-    Upload =
-        [{queues,      []},
-         {exchanges,   []},
-         {policies,    []},
-         {bindings,    []}],
-    http_post(Config, "/definitions/othervhost", Upload, ?BAD_REQUEST),
-
-    unregister_parameters_and_policy_validator(Config),
-    passed.
-
-definitions_password_test(Config) ->
-                                                % Import definitions from 3.5.x
-    Config35 = [{rabbit_version, <<"3.5.4">>},
-                {users, [[{name,          <<"myuser">>},
-                          {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-                          {tags,          <<"management">>}]
-                        ]}],
-    Expected35 = [{name,          <<"myuser">>},
-                  {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-                  {hashing_algorithm, <<"rabbit_password_hashing_md5">>},
-                  {tags,          <<"management">>}],
-    http_post(Config, "/definitions", Config35, ?CREATED),
-    Definitions35 = http_get(Config, "/definitions", ?OK),
-    Users35 = pget(users, Definitions35),
-    true = lists:any(fun(I) -> test_item(Expected35, I) end, Users35),
-
-    %% Import definitions from from 3.6.0
-    Config36 = [{rabbit_version, <<"3.6.0">>},
-                {users, [[{name,          <<"myuser">>},
-                          {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-                          {tags,          <<"management">>}]
-                        ]}],
-    Expected36 = [{name,          <<"myuser">>},
-                  {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-                  {hashing_algorithm, <<"rabbit_password_hashing_sha256">>},
-                  {tags,          <<"management">>}],
-    http_post(Config, "/definitions", Config36, ?CREATED),
-
-    Definitions36 = http_get(Config, "/definitions", ?OK),
-    Users36 = pget(users, Definitions36),
-    true = lists:any(fun(I) -> test_item(Expected36, I) end, Users36),
-
-    %% No hashing_algorithm provided
-    ConfigDefault = [{rabbit_version, <<"3.6.1">>},
-                     {users, [[{name,          <<"myuser">>},
-                               {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-                               {tags,          <<"management">>}]
-                             ]}],
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, [rabbit,
-                                                                   password_hashing_module,
-                                                                   rabbit_password_hashing_sha512]),
-
-    ExpectedDefault = [{name,          <<"myuser">>},
-                       {password_hash, <<"WAbU0ZIcvjTpxM3Q3SbJhEAM2tQ=">>},
-                       {hashing_algorithm, <<"rabbit_password_hashing_sha512">>},
-                       {tags,          <<"management">>}],
-    http_post(Config, "/definitions", ConfigDefault, ?CREATED),
-
-    DefinitionsDefault = http_get(Config, "/definitions", ?OK),
-    UsersDefault = pget(users, DefinitionsDefault),
-
-    true = lists:any(fun(I) -> test_item(ExpectedDefault, I) end, UsersDefault),
-    passed.
-
-definitions_remove_things_test(Config) ->
-    {Conn, Ch} = open_connection_and_channel(Config),
-    amqp_channel:call(Ch, #'queue.declare'{ queue = <<"my-exclusive">>,
-                                            exclusive = true }),
-    http_get(Config, "/queues/%2f/my-exclusive", ?OK),
-    Definitions = http_get(Config, "/definitions", ?OK),
-    [] = pget(queues, Definitions),
-    [] = pget(exchanges, Definitions),
-    [] = pget(bindings, Definitions),
-    amqp_channel:close(Ch),
-    close_connection(Conn),
-    passed.
-
-definitions_server_named_queue_test(Config) ->
-    {Conn, Ch} = open_connection_and_channel(Config),
-    #'queue.declare_ok'{ queue = QName } =
-        amqp_channel:call(Ch, #'queue.declare'{}),
-    close_channel(Ch),
-    close_connection(Conn),
-    Path = "/queues/%2f/" ++ mochiweb_util:quote_plus(QName),
-    http_get(Config, Path, ?OK),
-    Definitions = http_get(Config, "/definitions", ?OK),
-    http_delete(Config, Path, ?NO_CONTENT),
-    http_get(Config, Path, ?NOT_FOUND),
-    http_post(Config, "/definitions", Definitions, [?CREATED, ?NO_CONTENT]),
-    http_get(Config, Path, ?OK),
-    http_delete(Config, Path, ?NO_CONTENT),
-    passed.
-
-aliveness_test(Config) ->
-    [{status, <<"ok">>}] = http_get(Config, "/aliveness-test/%2f", ?OK),
-    http_get(Config, "/aliveness-test/foo", ?NOT_FOUND),
-    http_delete(Config, "/queues/%2f/aliveness-test", ?NO_CONTENT),
-    passed.
-
-healthchecks_test(Config) ->
-    [{status, <<"ok">>}] = http_get(Config, "/healthchecks/node", ?OK),
-    http_get(Config, "/healthchecks/node/foo", ?NOT_FOUND),
-    passed.
-
-arguments_test(Config) ->
-    XArgs = [{type, <<"headers">>},
-             {arguments, [{'alternate-exchange', <<"amq.direct">>}]}],
-    QArgs = [{arguments, [{'x-expires', 1800000}]}],
-    BArgs = [{routing_key, <<"">>},
-             {arguments, [{'x-match', <<"all">>},
-                          {foo, <<"bar">>}]}],
-    http_put(Config, "/exchanges/%2f/myexchange", XArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/myqueue", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/bindings/%2f/e/myexchange/q/myqueue", BArgs, [?CREATED, ?NO_CONTENT]),
-    Definitions = http_get(Config, "/definitions", ?OK),
-    http_delete(Config, "/exchanges/%2f/myexchange", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    http_post(Config, "/definitions", Definitions, ?CREATED),
-    [{'alternate-exchange', <<"amq.direct">>}] =
-        pget(arguments, http_get(Config, "/exchanges/%2f/myexchange", ?OK)),
-    [{'x-expires', 1800000}] =
-        pget(arguments, http_get(Config, "/queues/%2f/myqueue", ?OK)),
-    true = lists:sort([{'x-match', <<"all">>}, {foo, <<"bar">>}]) =:=
-       lists:sort(pget(arguments,
-                       http_get(Config, "/bindings/%2f/e/myexchange/q/myqueue/" ++
-                                    "~nXOkVwqZzUOdS9_HcBWheg", ?OK))),
-    http_delete(Config, "/exchanges/%2f/myexchange", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-arguments_table_test(Config) ->
-    Args = [{'upstreams', [<<"amqp://localhost/%2f/upstream1">>,
-                           <<"amqp://localhost/%2f/upstream2">>]}],
-    XArgs = [{type, <<"headers">>},
-             {arguments, Args}],
-    http_put(Config, "/exchanges/%2f/myexchange", XArgs, [?CREATED, ?NO_CONTENT]),
-    Definitions = http_get(Config, "/definitions", ?OK),
-    http_delete(Config, "/exchanges/%2f/myexchange", ?NO_CONTENT),
-    http_post(Config, "/definitions", Definitions, ?CREATED),
-    Args = pget(arguments, http_get(Config, "/exchanges/%2f/myexchange", ?OK)),
-    http_delete(Config, "/exchanges/%2f/myexchange", ?NO_CONTENT),
-    passed.
-
-queue_purge_test(Config) ->
-    QArgs = [],
-    http_put(Config, "/queues/%2f/myqueue", QArgs, [?CREATED, ?NO_CONTENT]),
-    {Conn, Ch} = open_connection_and_channel(Config),
-    Publish = fun() ->
-                      amqp_channel:call(
-                        Ch, #'basic.publish'{exchange = <<"">>,
-                                             routing_key = <<"myqueue">>},
-                        #amqp_msg{payload = <<"message">>})
-              end,
-    Publish(),
-    Publish(),
-    amqp_channel:call(
-      Ch, #'queue.declare'{queue = <<"exclusive">>, exclusive = true}),
-    {#'basic.get_ok'{}, _} =
-        amqp_channel:call(Ch, #'basic.get'{queue = <<"myqueue">>}),
-    http_delete(Config, "/queues/%2f/myqueue/contents", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/badqueue/contents", ?NOT_FOUND),
-    http_delete(Config, "/queues/%2f/exclusive/contents", ?BAD_REQUEST),
-    http_delete(Config, "/queues/%2f/exclusive", ?BAD_REQUEST),
-    #'basic.get_empty'{} =
-        amqp_channel:call(Ch, #'basic.get'{queue = <<"myqueue">>}),
-    close_channel(Ch),
-    close_connection(Conn),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-queue_actions_test(Config) ->
-    http_put(Config, "/queues/%2f/q", [], [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/queues/%2f/q/actions", [{action, sync}], ?NO_CONTENT),
-    http_post(Config, "/queues/%2f/q/actions", [{action, cancel_sync}], ?NO_CONTENT),
-    http_post(Config, "/queues/%2f/q/actions", [{action, change_colour}], ?BAD_REQUEST),
-    http_delete(Config, "/queues/%2f/q", ?NO_CONTENT),
-    passed.
-
-exclusive_consumer_test(Config) ->
-    {Conn, Ch} = open_connection_and_channel(Config),
-    #'queue.declare_ok'{ queue = QName } =
-        amqp_channel:call(Ch, #'queue.declare'{exclusive = true}),
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue     = QName,
-                                                exclusive = true}, self()),
-    timer:sleep(1000), %% Sadly we need to sleep to let the stats update
-    http_get(Config, "/queues/%2f/"), %% Just check we don't blow up
-    close_channel(Ch),
-    close_connection(Conn),
-    passed.
-
-
-exclusive_queue_test(Config) ->
-    {Conn, Ch} = open_connection_and_channel(Config),
-    #'queue.declare_ok'{ queue = QName } =
-       amqp_channel:call(Ch, #'queue.declare'{exclusive = true}),
-    timer:sleep(1000), %% Sadly we need to sleep to let the stats update
-    Path = "/queues/%2f/" ++ mochiweb_util:quote_plus(QName),
-    Queue = http_get(Config, Path),
-    assert_item([{name,         QName},
-                {vhost,       <<"/">>},
-                {durable,     false},
-                {auto_delete, false},
-                {exclusive,   true},
-                {arguments,   []}], Queue),
-    amqp_channel:close(Ch),
-    close_connection(Conn),
-    passed.
-
-connections_channels_pagination_test(Config) ->
-    %% this test uses "unmanaged" (by Common Test helpers) connections to avoid
-    %% connection caching
-    Conn      = open_unmanaged_connection(Config),
-    {ok, Ch}  = amqp_connection:open_channel(Conn),
-    Conn1     = open_unmanaged_connection(Config),
-    {ok, Ch1} = amqp_connection:open_channel(Conn1),
-    Conn2     = open_unmanaged_connection(Config),
-    {ok, Ch2} = amqp_connection:open_channel(Conn2),
-
-    timer:sleep(1000), %% Sadly we need to sleep to let the stats update
-    PageOfTwo = http_get(Config, "/connections?page=1&page_size=2", ?OK),
-    ?assertEqual(3, proplists:get_value(total_count, PageOfTwo)),
-    ?assertEqual(3, proplists:get_value(filtered_count, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(item_count, PageOfTwo)),
-    ?assertEqual(1, proplists:get_value(page, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_size, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_count, PageOfTwo)),
-
-
-    TwoOfTwo = http_get(Config, "/channels?page=2&page_size=2", ?OK),
-    ?assertEqual(3, proplists:get_value(total_count, TwoOfTwo)),
-    ?assertEqual(3, proplists:get_value(filtered_count, TwoOfTwo)),
-    ?assertEqual(1, proplists:get_value(item_count, TwoOfTwo)),
-    ?assertEqual(2, proplists:get_value(page, TwoOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_size, TwoOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_count, TwoOfTwo)),
-
-    amqp_channel:close(Ch),
-    amqp_connection:close(Conn),
-    amqp_channel:close(Ch1),
-    amqp_connection:close(Conn1),
-    amqp_channel:close(Ch2),
-    amqp_connection:close(Conn2),
-
-    passed.
-
-exchanges_pagination_test(Config) ->
-    QArgs = [],
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/vh1/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_get(Config, "/exchanges/vh1?page=1&page_size=2", ?OK),
-    http_put(Config, "/exchanges/%2f/test0", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/exchanges/vh1/test1", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/exchanges/%2f/test2_reg", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/exchanges/vh1/reg_test3", QArgs, [?CREATED, ?NO_CONTENT]),
-    PageOfTwo = http_get(Config, "/exchanges?page=1&page_size=2", ?OK),
-    ?assertEqual(19, proplists:get_value(total_count, PageOfTwo)),
-    ?assertEqual(19, proplists:get_value(filtered_count, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(item_count, PageOfTwo)),
-    ?assertEqual(1, proplists:get_value(page, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_size, PageOfTwo)),
-    ?assertEqual(10, proplists:get_value(page_count, PageOfTwo)),
-    assert_list([[{name, <<"">>}, {vhost, <<"/">>}],
-                [{name, <<"amq.direct">>}, {vhost, <<"/">>}]
-               ], proplists:get_value(items, PageOfTwo)),
-
-    ByName = http_get(Config, "/exchanges?page=1&page_size=2&name=reg", ?OK),
-    ?assertEqual(19, proplists:get_value(total_count, ByName)),
-    ?assertEqual(2, proplists:get_value(filtered_count, ByName)),
-    ?assertEqual(2, proplists:get_value(item_count, ByName)),
-    ?assertEqual(1, proplists:get_value(page, ByName)),
-    ?assertEqual(2, proplists:get_value(page_size, ByName)),
-    ?assertEqual(1, proplists:get_value(page_count, ByName)),
-    assert_list([[{name, <<"test2_reg">>}, {vhost, <<"/">>}],
-                [{name, <<"reg_test3">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, ByName)),
-
-
-    RegExByName = http_get(Config,
-                           "/exchanges?page=1&page_size=2&name=^(?=^reg)&use_regex=true",
-                           ?OK),
-    ?assertEqual(19, proplists:get_value(total_count, RegExByName)),
-    ?assertEqual(1, proplists:get_value(filtered_count, RegExByName)),
-    ?assertEqual(1, proplists:get_value(item_count, RegExByName)),
-    ?assertEqual(1, proplists:get_value(page, RegExByName)),
-    ?assertEqual(2, proplists:get_value(page_size, RegExByName)),
-    ?assertEqual(1, proplists:get_value(page_count, RegExByName)),
-    assert_list([[{name, <<"reg_test3">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, RegExByName)),
-
-
-    http_get(Config, "/exchanges?page=1000", ?BAD_REQUEST),
-    http_get(Config, "/exchanges?page=-1", ?BAD_REQUEST),
-    http_get(Config, "/exchanges?page=not_an_integer_value", ?BAD_REQUEST),
-    http_get(Config, "/exchanges?page=1&page_size=not_an_intger_value", ?BAD_REQUEST),
-    http_get(Config, "/exchanges?page=1&page_size=501", ?BAD_REQUEST), %% max 500 allowed
-    http_get(Config, "/exchanges?page=-1&page_size=-2", ?BAD_REQUEST),
-    http_delete(Config, "/exchanges/%2f/test0", ?NO_CONTENT),
-    http_delete(Config, "/exchanges/vh1/test1", ?NO_CONTENT),
-    http_delete(Config, "/exchanges/%2f/test2_reg", ?NO_CONTENT),
-    http_delete(Config, "/exchanges/vh1/reg_test3", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/vh1", ?NO_CONTENT),
-    passed.
-
-exchanges_pagination_permissions_test(Config) ->
-    http_put(Config, "/users/admin",   [{password, <<"admin">>},
-                                        {tags, <<"administrator">>}], [?CREATED, ?NO_CONTENT]),
-    Perms = [{configure, <<".*">>},
-            {write,     <<".*">>},
-            {read,      <<".*">>}],
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/vh1/admin",   Perms, [?CREATED, ?NO_CONTENT]),
-    QArgs = [],
-    http_put(Config, "/exchanges/%2f/test0", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/exchanges/vh1/test1", QArgs, "admin","admin", [?CREATED, ?NO_CONTENT]),
-    FirstPage = http_get(Config, "/exchanges?page=1&name=test1","admin","admin", ?OK),
-    ?assertEqual(8, proplists:get_value(total_count, FirstPage)),
-    ?assertEqual(1, proplists:get_value(item_count, FirstPage)),
-    ?assertEqual(1, proplists:get_value(page, FirstPage)),
-    ?assertEqual(100, proplists:get_value(page_size, FirstPage)),
-    ?assertEqual(1, proplists:get_value(page_count, FirstPage)),
-    assert_list([[{name, <<"test1">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, FirstPage)),
-    http_delete(Config, "/exchanges/%2f/test0", ?NO_CONTENT),
-    http_delete(Config, "/exchanges/vh1/test1","admin","admin", ?NO_CONTENT),
-    http_delete(Config, "/users/admin", ?NO_CONTENT),
-    passed.
-
-
-
-queue_pagination_test(Config) ->
-    QArgs = [],
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/vh1/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-
-    http_get(Config, "/queues/vh1?page=1&page_size=2", ?OK),
-
-    http_put(Config, "/queues/%2f/test0", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/vh1/test1", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/test2_reg", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/vh1/reg_test3", QArgs, [?CREATED, ?NO_CONTENT]),
-    PageOfTwo = http_get(Config, "/queues?page=1&page_size=2", ?OK),
-    ?assertEqual(4, proplists:get_value(total_count, PageOfTwo)),
-    ?assertEqual(4, proplists:get_value(filtered_count, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(item_count, PageOfTwo)),
-    ?assertEqual(1, proplists:get_value(page, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_size, PageOfTwo)),
-    ?assertEqual(2, proplists:get_value(page_count, PageOfTwo)),
-    assert_list([[{name, <<"test0">>}, {vhost, <<"/">>}],
-                [{name, <<"test2_reg">>}, {vhost, <<"/">>}]
-               ], proplists:get_value(items, PageOfTwo)),
-
-    SortedByName = http_get(Config, "/queues?sort=name&page=1&page_size=2", ?OK),
-    ?assertEqual(4, proplists:get_value(total_count, SortedByName)),
-    ?assertEqual(4, proplists:get_value(filtered_count, SortedByName)),
-    ?assertEqual(2, proplists:get_value(item_count, SortedByName)),
-    ?assertEqual(1, proplists:get_value(page, SortedByName)),
-    ?assertEqual(2, proplists:get_value(page_size, SortedByName)),
-    ?assertEqual(2, proplists:get_value(page_count, SortedByName)),
-    assert_list([[{name, <<"reg_test3">>}, {vhost, <<"vh1">>}],
-                [{name, <<"test0">>}, {vhost, <<"/">>}]
-               ], proplists:get_value(items, SortedByName)),
-
-
-    FirstPage = http_get(Config, "/queues?page=1", ?OK),
-    ?assertEqual(4, proplists:get_value(total_count, FirstPage)),
-    ?assertEqual(4, proplists:get_value(filtered_count, FirstPage)),
-    ?assertEqual(4, proplists:get_value(item_count, FirstPage)),
-    ?assertEqual(1, proplists:get_value(page, FirstPage)),
-    ?assertEqual(100, proplists:get_value(page_size, FirstPage)),
-    ?assertEqual(1, proplists:get_value(page_count, FirstPage)),
-    assert_list([[{name, <<"test0">>}, {vhost, <<"/">>}],
-                [{name, <<"test1">>}, {vhost, <<"vh1">>}],
-                [{name, <<"test2_reg">>}, {vhost, <<"/">>}],
-                [{name, <<"reg_test3">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, FirstPage)),
-
-
-    ReverseSortedByName = http_get(Config,
-                                   "/queues?page=2&page_size=2&sort=name&sort_reverse=true",
-                                   ?OK),
-    ?assertEqual(4, proplists:get_value(total_count, ReverseSortedByName)),
-    ?assertEqual(4, proplists:get_value(filtered_count, ReverseSortedByName)),
-    ?assertEqual(2, proplists:get_value(item_count, ReverseSortedByName)),
-    ?assertEqual(2, proplists:get_value(page, ReverseSortedByName)),
-    ?assertEqual(2, proplists:get_value(page_size, ReverseSortedByName)),
-    ?assertEqual(2, proplists:get_value(page_count, ReverseSortedByName)),
-    assert_list([[{name, <<"test0">>}, {vhost, <<"/">>}],
-                [{name, <<"reg_test3">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, ReverseSortedByName)),
-
-
-    ByName = http_get(Config, "/queues?page=1&page_size=2&name=reg", ?OK),
-    ?assertEqual(4, proplists:get_value(total_count, ByName)),
-    ?assertEqual(2, proplists:get_value(filtered_count, ByName)),
-    ?assertEqual(2, proplists:get_value(item_count, ByName)),
-    ?assertEqual(1, proplists:get_value(page, ByName)),
-    ?assertEqual(2, proplists:get_value(page_size, ByName)),
-    ?assertEqual(1, proplists:get_value(page_count, ByName)),
-    assert_list([[{name, <<"test2_reg">>}, {vhost, <<"/">>}],
-                [{name, <<"reg_test3">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, ByName)),
-
-    RegExByName = http_get(Config,
-                           "/queues?page=1&page_size=2&name=^(?=^reg)&use_regex=true",
-                           ?OK),
-    ?assertEqual(4, proplists:get_value(total_count, RegExByName)),
-    ?assertEqual(1, proplists:get_value(filtered_count, RegExByName)),
-    ?assertEqual(1, proplists:get_value(item_count, RegExByName)),
-    ?assertEqual(1, proplists:get_value(page, RegExByName)),
-    ?assertEqual(2, proplists:get_value(page_size, RegExByName)),
-    ?assertEqual(1, proplists:get_value(page_count, RegExByName)),
-    assert_list([[{name, <<"reg_test3">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, RegExByName)),
-
-
-    http_get(Config, "/queues?page=1000", ?BAD_REQUEST),
-    http_get(Config, "/queues?page=-1", ?BAD_REQUEST),
-    http_get(Config, "/queues?page=not_an_integer_value", ?BAD_REQUEST),
-    http_get(Config, "/queues?page=1&page_size=not_an_intger_value", ?BAD_REQUEST),
-    http_get(Config, "/queues?page=1&page_size=501", ?BAD_REQUEST), %% max 500 allowed
-    http_get(Config, "/queues?page=-1&page_size=-2", ?BAD_REQUEST),
-    http_delete(Config, "/queues/%2f/test0", ?NO_CONTENT),
-    http_delete(Config, "/queues/vh1/test1", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/test2_reg", ?NO_CONTENT),
-    http_delete(Config, "/queues/vh1/reg_test3", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/vh1", ?NO_CONTENT),
-    passed.
-
-queues_pagination_permissions_test(Config) ->
-    http_put(Config, "/users/admin",   [{password, <<"admin">>},
-                                        {tags, <<"administrator">>}], [?CREATED, ?NO_CONTENT]),
-    Perms = [{configure, <<".*">>},
-            {write,     <<".*">>},
-            {read,      <<".*">>}],
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/vh1/admin",   Perms, [?CREATED, ?NO_CONTENT]),
-    QArgs = [],
-    http_put(Config, "/queues/%2f/test0", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/vh1/test1", QArgs, "admin","admin", [?CREATED, ?NO_CONTENT]),
-    FirstPage = http_get(Config, "/queues?page=1","admin","admin", ?OK),
-    ?assertEqual(1, proplists:get_value(total_count, FirstPage)),
-    ?assertEqual(1, proplists:get_value(item_count, FirstPage)),
-    ?assertEqual(1, proplists:get_value(page, FirstPage)),
-    ?assertEqual(100, proplists:get_value(page_size, FirstPage)),
-    ?assertEqual(1, proplists:get_value(page_count, FirstPage)),
-    assert_list([[{name, <<"test1">>}, {vhost, <<"vh1">>}]
-               ], proplists:get_value(items, FirstPage)),
-    http_delete(Config, "/queues/%2f/test0", ?NO_CONTENT),
-    http_delete(Config, "/queues/vh1/test1","admin","admin", ?NO_CONTENT),
-    http_delete(Config, "/users/admin", ?NO_CONTENT),
-    passed.
-
-samples_range_test(Config) ->
-    
-    {Conn, Ch} = open_connection_and_channel(Config),
-
-    %% Channels.
-
-    [ConnInfo | _] = http_get(Config, "/channels?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/channels?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    {_, ConnDetails} = lists:keyfind(connection_details, 1, ConnInfo),
-    {_, ConnName0} = lists:keyfind(name, 1, ConnDetails),
-    ConnName = http_uri:encode(binary_to_list(ConnName0)),
-    ChanName = ConnName ++ http_uri:encode(" (1)"),
-
-    http_get(Config, "/channels/" ++ ChanName ++ "?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/channels/" ++ ChanName ++ "?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_get(Config, "/vhosts/%2f/channels?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/vhosts/%2f/channels?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    %% Connections.
-
-    http_get(Config, "/connections?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/connections?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_get(Config, "/connections/" ++ ConnName ++ "?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/connections/" ++ ConnName ++ "?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_get(Config, "/connections/" ++ ConnName ++ "/channels?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/connections/" ++ ConnName ++ "/channels?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_get(Config, "/vhosts/%2f/connections?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/vhosts/%2f/connections?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    amqp_channel:close(Ch),
-    amqp_connection:close(Conn),
-
-    %% Exchanges.
-
-    http_get(Config, "/exchanges?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/exchanges?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_get(Config, "/exchanges/%2f/amq.direct?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/exchanges/%2f/amq.direct?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    %% Nodes.
-
-    http_get(Config, "/nodes?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/nodes?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    %% Overview.
-
-    http_get(Config, "/overview?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/overview?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    %% Queues.
-
-    http_put(Config, "/queues/%2f/test0", [], [?CREATED, ?NO_CONTENT]),
-
-    http_get(Config, "/queues/%2f?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/queues/%2f?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-    http_get(Config, "/queues/%2f/test0?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/queues/%2f/test0?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_delete(Config, "/queues/%2f/test0", ?NO_CONTENT),
-
-    %% Vhosts.
-
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-
-    http_get(Config, "/vhosts?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/vhosts?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-    http_get(Config, "/vhosts/vh1?lengths_age=60&lengths_incr=1", ?OK),
-    http_get(Config, "/vhosts/vh1?lengths_age=6000&lengths_incr=1", ?BAD_REQUEST),
-
-    http_delete(Config, "/vhosts/vh1", ?NO_CONTENT),
-
-    passed.
-
-sorting_test(Config) ->
-    QArgs = [],
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/vh1/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/test0", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/vh1/test1", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/test2", QArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/vh1/test3", QArgs, [?CREATED, ?NO_CONTENT]),
-    assert_list([[{name, <<"test0">>}],
-                 [{name, <<"test2">>}],
-                 [{name, <<"test1">>}],
-                 [{name, <<"test3">>}]], http_get(Config, "/queues", ?OK)),
-    assert_list([[{name, <<"test0">>}],
-                 [{name, <<"test1">>}],
-                 [{name, <<"test2">>}],
-                 [{name, <<"test3">>}]], http_get(Config, "/queues?sort=name", ?OK)),
-    assert_list([[{name, <<"test0">>}],
-                 [{name, <<"test2">>}],
-                 [{name, <<"test1">>}],
-                 [{name, <<"test3">>}]], http_get(Config, "/queues?sort=vhost", ?OK)),
-    assert_list([[{name, <<"test3">>}],
-                 [{name, <<"test1">>}],
-                 [{name, <<"test2">>}],
-                 [{name, <<"test0">>}]], http_get(Config, "/queues?sort_reverse=true", ?OK)),
-    assert_list([[{name, <<"test3">>}],
-                 [{name, <<"test2">>}],
-                 [{name, <<"test1">>}],
-                 [{name, <<"test0">>}]], http_get(Config, "/queues?sort=name&sort_reverse=true", ?OK)),
-    assert_list([[{name, <<"test3">>}],
-                 [{name, <<"test1">>}],
-                 [{name, <<"test2">>}],
-                 [{name, <<"test0">>}]], http_get(Config, "/queues?sort=vhost&sort_reverse=true", ?OK)),
-    %% Rather poor but at least test it doesn't blow up with dots
-    http_get(Config, "/queues?sort=owner_pid_details.name", ?OK),
-    http_delete(Config, "/queues/%2f/test0", ?NO_CONTENT),
-    http_delete(Config, "/queues/vh1/test1", ?NO_CONTENT),
-    http_delete(Config, "/queues/%2f/test2", ?NO_CONTENT),
-    http_delete(Config, "/queues/vh1/test3", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/vh1", ?NO_CONTENT),
-    passed.
-
-format_output_test(Config) ->
-    QArgs = [],
-    PermArgs = [{configure, <<".*">>}, {write, <<".*">>}, {read, <<".*">>}],
-    http_put(Config, "/vhosts/vh1", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/vh1/guest", PermArgs, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/test0", QArgs, [?CREATED, ?NO_CONTENT]),
-    assert_list([[{name, <<"test0">>},
-                 {consumer_utilisation, null},
-                 {exclusive_consumer_tag, null},
-                 {recoverable_slaves, null}]], http_get(Config, "/queues", ?OK)),
-    http_delete(Config, "/queues/%2f/test0", ?NO_CONTENT),
-    http_delete(Config, "/vhosts/vh1", ?NO_CONTENT),
-    passed.
-
-columns_test(Config) ->
-    http_put(Config, "/queues/%2f/test", [{arguments, [{<<"foo">>, <<"bar">>}]}],
-             [?CREATED, ?NO_CONTENT]),
-    [List] = http_get(Config, "/queues?columns=arguments.foo,name", ?OK),
-    [{arguments, [{foo, <<"bar">>}]}, {name, <<"test">>}] = lists:sort(List),
-    [{arguments, [{foo, <<"bar">>}]}, {name, <<"test">>}] =
-        lists:sort(http_get(Config, "/queues/%2f/test?columns=arguments.foo,name", ?OK)),
-    http_delete(Config, "/queues/%2f/test", ?NO_CONTENT),
-    passed.
-
-get_test(Config) ->
-    %% Real world example...
-    Headers = [{<<"x-forwarding">>, array,
-                [{table,
-                  [{<<"uri">>, longstr,
-                    <<"amqp://localhost/%2f/upstream">>}]}]}],
-    http_put(Config, "/queues/%2f/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    {Conn, Ch} = open_connection_and_channel(Config),
-    Publish = fun (Payload) ->
-                      amqp_channel:cast(
-                        Ch, #'basic.publish'{exchange = <<>>,
-                                             routing_key = <<"myqueue">>},
-                        #amqp_msg{props = #'P_basic'{headers = Headers},
-                                  payload = Payload})
-              end,
-    Publish(<<"1aaa">>),
-    Publish(<<"2aaa">>),
-    Publish(<<"3aaa">>),
-    amqp_channel:close(Ch),
-    close_connection(Conn),
-    [Msg] = http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  false},
-                                                          {count,    1},
-                                                          {encoding, auto},
-                                                          {truncate, 1}], ?OK),
-    false         = pget(redelivered, Msg),
-    <<>>          = pget(exchange,    Msg),
-    <<"myqueue">> = pget(routing_key, Msg),
-    <<"1">>       = pget(payload,     Msg),
-    [{'x-forwarding',
-      [[{uri,<<"amqp://localhost/%2f/upstream">>}]]}] =
-        pget(headers, pget(properties, Msg)),
-
-    [M2, M3] = http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  true},
-                                                             {count,    5},
-                                                             {encoding, auto}], ?OK),
-    <<"2aaa">> = pget(payload, M2),
-    <<"3aaa">> = pget(payload, M3),
-    2 = length(http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  false},
-                                                             {count,    5},
-                                                             {encoding, auto}], ?OK)),
-    [] = http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  false},
-                                                       {count,    5},
-                                                       {encoding, auto}], ?OK),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-get_fail_test(Config) ->
-    http_put(Config, "/users/myuser", [{password, <<"password">>},
-                                       {tags, <<"management">>}], ?NO_CONTENT),
-    http_put(Config, "/queues/%2f/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/queues/%2f/myqueue/get",
-              [{requeue,  false},
-               {count,    1},
-               {encoding, auto}], "myuser", "password", ?NOT_AUTHORISED),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    passed.
-
-publish_test(Config) ->
-    Headers = [{'x-forwarding', [[{uri,<<"amqp://localhost/%2f/upstream">>}]]}],
-    Msg = msg(<<"myqueue">>, Headers, <<"Hello world">>),
-    http_put(Config, "/queues/%2f/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    ?assertEqual([{routed, true}],
-                 http_post(Config, "/exchanges/%2f/amq.default/publish", Msg, ?OK)),
-    [Msg2] = http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  false},
-                                                           {count,    1},
-                                                           {encoding, auto}], ?OK),
-    assert_item(Msg, Msg2),
-    http_post(Config, "/exchanges/%2f/amq.default/publish", Msg2, ?OK),
-    [Msg3] = http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  false},
-                                                           {count,    1},
-                                                           {encoding, auto}], ?OK),
-    assert_item(Msg, Msg3),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-publish_accept_json_test(Config) ->
-    Headers = [{'x-forwarding', [[{uri, <<"amqp://localhost/%2f/upstream">>}]]}],
-    Msg = msg(<<"myqueue">>, Headers, <<"Hello world">>),
-    http_put(Config, "/queues/%2f/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    ?assertEqual([{routed, true}],
-                http_post_accept_json(Config, "/exchanges/%2f/amq.default/publish",
-                                      Msg, ?OK)),
-
-    [Msg2] = http_post_accept_json(Config, "/queues/%2f/myqueue/get",
-                                  [{requeue, false},
-                                   {count, 1},
-                                   {encoding, auto}], ?OK),
-    assert_item(Msg, Msg2),
-    http_post_accept_json(Config, "/exchanges/%2f/amq.default/publish", Msg2, ?OK),
-    [Msg3] = http_post_accept_json(Config, "/queues/%2f/myqueue/get",
-                                  [{requeue, false},
-                                   {count, 1},
-                                   {encoding, auto}], ?OK),
-    assert_item(Msg, Msg3),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-publish_fail_test(Config) ->
-    Msg = msg(<<"myqueue">>, [], <<"Hello world">>),
-    http_put(Config, "/queues/%2f/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/myuser", [{password, <<"password">>},
-                                       {tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/exchanges/%2f/amq.default/publish", Msg, "myuser", "password",
-              ?NOT_AUTHORISED),
-    Msg2 = [{exchange,         <<"">>},
-            {routing_key,      <<"myqueue">>},
-            {properties,       [{user_id, <<"foo">>}]},
-            {payload,          <<"Hello world">>},
-            {payload_encoding, <<"string">>}],
-    http_post(Config, "/exchanges/%2f/amq.default/publish", Msg2, ?BAD_REQUEST),
-    Msg3 = [{exchange,         <<"">>},
-            {routing_key,      <<"myqueue">>},
-            {properties,       []},
-            {payload,          [<<"not a string">>]},
-            {payload_encoding, <<"string">>}],
-    http_post(Config, "/exchanges/%2f/amq.default/publish", Msg3, ?BAD_REQUEST),
-    MsgTemplate = [{exchange,         <<"">>},
-                   {routing_key,      <<"myqueue">>},
-                   {payload,          <<"Hello world">>},
-                   {payload_encoding, <<"string">>}],
-    [http_post(Config, "/exchanges/%2f/amq.default/publish",
-               [{properties, [BadProp]} | MsgTemplate], ?BAD_REQUEST)
-     || BadProp <- [{priority,   <<"really high">>},
-                    {timestamp,  <<"recently">>},
-                    {expiration, 1234}]],
-    http_delete(Config, "/users/myuser", ?NO_CONTENT),
-    passed.
-
-publish_base64_test(Config) ->
-    Msg     = msg(<<"myqueue">>, [], <<"YWJjZA==">>, <<"base64">>),
-    BadMsg1 = msg(<<"myqueue">>, [], <<"flibble">>,  <<"base64">>),
-    BadMsg2 = msg(<<"myqueue">>, [], <<"YWJjZA==">>, <<"base99">>),
-    http_put(Config, "/queues/%2f/myqueue", [], [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/exchanges/%2f/amq.default/publish", Msg, ?OK),
-    http_post(Config, "/exchanges/%2f/amq.default/publish", BadMsg1, ?BAD_REQUEST),
-    http_post(Config, "/exchanges/%2f/amq.default/publish", BadMsg2, ?BAD_REQUEST),
-    [Msg2] = http_post(Config, "/queues/%2f/myqueue/get", [{requeue,  false},
-                                                           {count,    1},
-                                                           {encoding, auto}], ?OK),
-    ?assertEqual(<<"abcd">>, pget(payload, Msg2)),
-    http_delete(Config, "/queues/%2f/myqueue", ?NO_CONTENT),
-    passed.
-
-publish_unrouted_test(Config) ->
-    Msg = msg(<<"hmmm">>, [], <<"Hello world">>),
-    ?assertEqual([{routed, false}],
-                 http_post(Config, "/exchanges/%2f/amq.default/publish", Msg, ?OK)).
-
-if_empty_unused_test(Config) ->
-    http_put(Config, "/exchanges/%2f/test", [], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/queues/%2f/test", [], [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/bindings/%2f/e/test/q/test", [], [?CREATED, ?NO_CONTENT]),
-    http_post(Config, "/exchanges/%2f/amq.default/publish",
-              msg(<<"test">>, [], <<"Hello world">>), ?OK),
-    http_delete(Config, "/queues/%2f/test?if-empty=true", ?BAD_REQUEST),
-    http_delete(Config, "/exchanges/%2f/test?if-unused=true", ?BAD_REQUEST),
-    http_delete(Config, "/queues/%2f/test/contents", ?NO_CONTENT),
-
-    {Conn, _ConnPath, _ChPath, _ConnChPath} = get_conn(Config, "guest", "guest"),
-    {ok, Ch} = amqp_connection:open_channel(Conn),
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue = <<"test">> }, self()),
-    http_delete(Config, "/queues/%2f/test?if-unused=true", ?BAD_REQUEST),
-    amqp_connection:close(Conn),
-
-    http_delete(Config, "/queues/%2f/test?if-empty=true", ?NO_CONTENT),
-    http_delete(Config, "/exchanges/%2f/test?if-unused=true", ?NO_CONTENT),
-    passed.
-
-parameters_test(Config) ->
-    register_parameters_and_policy_validator(Config),
-
-    http_put(Config, "/parameters/test/%2f/good", [{value, <<"ignore">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/parameters/test/%2f/maybe", [{value, <<"good">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/parameters/test/%2f/maybe", [{value, <<"bad">>}], ?BAD_REQUEST),
-    http_put(Config, "/parameters/test/%2f/bad", [{value, <<"good">>}], ?BAD_REQUEST),
-    http_put(Config, "/parameters/test/um/good", [{value, <<"ignore">>}], ?NOT_FOUND),
-
-    Good = [{vhost,     <<"/">>},
-            {component, <<"test">>},
-            {name,      <<"good">>},
-            {value,     <<"ignore">>}],
-    Maybe = [{vhost,     <<"/">>},
-             {component, <<"test">>},
-             {name,      <<"maybe">>},
-             {value,     <<"good">>}],
-    List = [Good, Maybe],
-
-    assert_list(List, http_get(Config, "/parameters")),
-    assert_list(List, http_get(Config, "/parameters/test")),
-    assert_list(List, http_get(Config, "/parameters/test/%2f")),
-    assert_list([],   http_get(Config, "/parameters/oops")),
-    http_get(Config, "/parameters/test/oops", ?NOT_FOUND),
-
-    assert_item(Good,  http_get(Config, "/parameters/test/%2f/good", ?OK)),
-    assert_item(Maybe, http_get(Config, "/parameters/test/%2f/maybe", ?OK)),
-
-    http_delete(Config, "/parameters/test/%2f/good", ?NO_CONTENT),
-    http_delete(Config, "/parameters/test/%2f/maybe", ?NO_CONTENT),
-    http_delete(Config, "/parameters/test/%2f/bad", ?NOT_FOUND),
-
-    0 = length(http_get(Config, "/parameters")),
-    0 = length(http_get(Config, "/parameters/test")),
-    0 = length(http_get(Config, "/parameters/test/%2f")),
-    unregister_parameters_and_policy_validator(Config),
-    passed.
-
-policy_test(Config) ->
-    register_parameters_and_policy_validator(Config),
-    PolicyPos  = [{vhost,      <<"/">>},
-                  {name,       <<"policy_pos">>},
-                  {pattern,    <<".*">>},
-                  {definition, [{testpos,[1,2,3]}]},
-                  {priority,   10}],
-    PolicyEven = [{vhost,      <<"/">>},
-                  {name,       <<"policy_even">>},
-                  {pattern,    <<".*">>},
-                  {definition, [{testeven,[1,2,3,4]}]},
-                  {priority,   10}],
-    http_put(Config,
-             "/policies/%2f/policy_pos",
-             lists:keydelete(key, 1, PolicyPos),
-             [?CREATED, ?NO_CONTENT]),
-    http_put(Config,
-             "/policies/%2f/policy_even",
-             lists:keydelete(key, 1, PolicyEven),
-             [?CREATED, ?NO_CONTENT]),
-    assert_item(PolicyPos,  http_get(Config, "/policies/%2f/policy_pos",  ?OK)),
-    assert_item(PolicyEven, http_get(Config, "/policies/%2f/policy_even", ?OK)),
-    List = [PolicyPos, PolicyEven],
-    assert_list(List, http_get(Config, "/policies",     ?OK)),
-    assert_list(List, http_get(Config, "/policies/%2f", ?OK)),
-
-    http_delete(Config, "/policies/%2f/policy_pos", ?NO_CONTENT),
-    http_delete(Config, "/policies/%2f/policy_even", ?NO_CONTENT),
-    0 = length(http_get(Config, "/policies")),
-    0 = length(http_get(Config, "/policies/%2f")),
-    unregister_parameters_and_policy_validator(Config),
-    passed.
-
-policy_permissions_test(Config) ->
-    register_parameters_and_policy_validator(Config),
-
-    http_put(Config, "/users/admin",  [{password, <<"admin">>},
-                                       {tags, <<"administrator">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/mon",    [{password, <<"mon">>},
-                                       {tags, <<"monitoring">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/policy", [{password, <<"policy">>},
-                                       {tags, <<"policymaker">>}], [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/users/mgmt",   [{password, <<"mgmt">>},
-                                       {tags, <<"management">>}], [?CREATED, ?NO_CONTENT]),
-    Perms = [{configure, <<".*">>},
-             {write,     <<".*">>},
-             {read,      <<".*">>}],
-    http_put(Config, "/vhosts/v", none, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/v/admin",  Perms, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/v/mon",    Perms, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/v/policy", Perms, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/permissions/v/mgmt",   Perms, [?CREATED, ?NO_CONTENT]),
-
-    Policy = [{pattern,    <<".*">>},
-              {definition, [{<<"ha-mode">>, <<"all">>}]}],
-    Param = [{value, <<"">>}],
-
-    http_put(Config, "/policies/%2f/HA", Policy, [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/parameters/test/%2f/good", Param, [?CREATED, ?NO_CONTENT]),
-
-    Pos = fun (U) ->
-                  Expected = case U of "admin" -> [?CREATED, ?NO_CONTENT]; _ -> ?NO_CONTENT end,
-                  http_put(Config, "/policies/v/HA",        Policy, U, U, Expected),
-                  http_put(Config,
-                           "/parameters/test/v/good",       Param, U, U, ?NO_CONTENT),
-                  1 = length(http_get(Config, "/policies",          U, U, ?OK)),
-                  1 = length(http_get(Config, "/parameters/test",   U, U, ?OK)),
-                  1 = length(http_get(Config, "/parameters",        U, U, ?OK)),
-                  1 = length(http_get(Config, "/policies/v",        U, U, ?OK)),
-                  1 = length(http_get(Config, "/parameters/test/v", U, U, ?OK)),
-                  http_get(Config, "/policies/v/HA",                U, U, ?OK),
-                  http_get(Config, "/parameters/test/v/good",       U, U, ?OK)
-          end,
-    Neg = fun (U) ->
-                  http_put(Config, "/policies/v/HA",    Policy, U, U, ?NOT_AUTHORISED),
-                  http_put(Config,
-                           "/parameters/test/v/good",   Param, U, U, ?NOT_AUTHORISED),
-                  http_put(Config,
-                           "/parameters/test/v/admin",  Param, U, U, ?NOT_AUTHORISED),
-                  %% Policies are read-only for management and monitoring.
-                  http_get(Config, "/policies",                 U, U, ?OK),
-                  http_get(Config, "/policies/v",               U, U, ?OK),
-                  http_get(Config, "/parameters",               U, U, ?NOT_AUTHORISED),
-                  http_get(Config, "/parameters/test",          U, U, ?NOT_AUTHORISED),
-                  http_get(Config, "/parameters/test/v",        U, U, ?NOT_AUTHORISED),
-                  http_get(Config, "/policies/v/HA",            U, U, ?NOT_AUTHORISED),
-                  http_get(Config, "/parameters/test/v/good",   U, U, ?NOT_AUTHORISED)
-          end,
-    AlwaysNeg =
-        fun (U) ->
-                http_put(Config, "/policies/%2f/HA",  Policy, U, U, ?NOT_AUTHORISED),
-                http_put(Config,
-                         "/parameters/test/%2f/good", Param, U, U, ?NOT_AUTHORISED),
-                http_get(Config, "/policies/%2f/HA",          U, U, ?NOT_AUTHORISED),
-                http_get(Config, "/parameters/test/%2f/good", U, U, ?NOT_AUTHORISED)
-        end,
-
-    [Neg(U) || U <- ["mon", "mgmt"]],
-    [Pos(U) || U <- ["admin", "policy"]],
-    [AlwaysNeg(U) || U <- ["mon", "mgmt", "admin", "policy"]],
-
-    %% This one is deliberately different between admin and policymaker.
-    http_put(Config, "/parameters/test/v/admin", Param, "admin", "admin", [?CREATED, ?NO_CONTENT]),
-    http_put(Config, "/parameters/test/v/admin", Param, "policy", "policy",
-             ?BAD_REQUEST),
-
-    http_delete(Config, "/vhosts/v", ?NO_CONTENT),
-    http_delete(Config, "/users/admin", ?NO_CONTENT),
-    http_delete(Config, "/users/mon", ?NO_CONTENT),
-    http_delete(Config, "/users/policy", ?NO_CONTENT),
-    http_delete(Config, "/users/mgmt", ?NO_CONTENT),
-    http_delete(Config, "/policies/%2f/HA", ?NO_CONTENT),
-
-    unregister_parameters_and_policy_validator(Config),
-    passed.
-
-issue67_test(Config)->
-    {ok, {{_, 401, _}, Headers, _}} = req(Config, get, "/queues",
-                                          [auth_header("user_no_access", "password_no_access")]),
-    ?assertEqual("application/json",
-                 proplists:get_value("content-type",Headers)),
-    passed.
-
-extensions_test(Config) ->
-    [[{javascript,<<"dispatcher.js">>}]] = http_get(Config, "/extensions", ?OK),
-    passed.
-
-cors_test(Config) ->
-    %% With CORS disabled. No header should be received.
-    {ok, {_, HdNoCORS, _}} = req(Config, get, "/overview", [auth_header("guest", "guest")]),
-    false = lists:keymember("access-control-allow-origin", 1, HdNoCORS),
-    %% The Vary header should include "Origin" regardless of CORS configuration.
-    {_, "Accept-Encoding, origin"} = lists:keyfind("vary", 1, HdNoCORS),
-    %% Enable CORS.
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, [rabbitmq_management, cors_allow_origins, ["http://rabbitmq.com"]]),
-    %% We should only receive allow-origin and allow-credentials from GET.
-    {ok, {_, HdGetCORS, _}} = req(Config, get, "/overview",
-                                  [{"origin", "http://rabbitmq.com"}, auth_header("guest", "guest")]),
-    true = lists:keymember("access-control-allow-origin", 1, HdGetCORS),
-    true = lists:keymember("access-control-allow-credentials", 1, HdGetCORS),
-    false = lists:keymember("access-control-expose-headers", 1, HdGetCORS),
-    false = lists:keymember("access-control-max-age", 1, HdGetCORS),
-    false = lists:keymember("access-control-allow-methods", 1, HdGetCORS),
-    false = lists:keymember("access-control-allow-headers", 1, HdGetCORS),
-    %% We should receive allow-origin, allow-credentials and allow-methods from OPTIONS.
-    {ok, {_, HdOptionsCORS, _}} = req(Config, options, "/overview",
-                                      [{"origin", "http://rabbitmq.com"}, auth_header("guest", "guest")]),
-    true = lists:keymember("access-control-allow-origin", 1, HdOptionsCORS),
-    true = lists:keymember("access-control-allow-credentials", 1, HdOptionsCORS),
-    false = lists:keymember("access-control-expose-headers", 1, HdOptionsCORS),
-    true = lists:keymember("access-control-max-age", 1, HdOptionsCORS),
-    true = lists:keymember("access-control-allow-methods", 1, HdOptionsCORS),
-    false = lists:keymember("access-control-allow-headers", 1, HdOptionsCORS),
-    %% We should receive allow-headers when request-headers is sent.
-    {ok, {_, HdAllowHeadersCORS, _}} = req(Config, options, "/overview",
-                                           [{"origin", "http://rabbitmq.com"},
-                                            auth_header("guest", "guest"),
-                                            {"access-control-request-headers", "x-piggy-bank"}]),
-    {_, "x-piggy-bank"} = lists:keyfind("access-control-allow-headers", 1, HdAllowHeadersCORS),
-    %% Disable preflight request caching.
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, [rabbitmq_management, cors_max_age, undefined]),
-    %% We shouldn't receive max-age anymore.
-    {ok, {_, HdNoMaxAgeCORS, _}} = req(Config, options, "/overview",
-                                       [{"origin", "http://rabbitmq.com"}, auth_header("guest", "guest")]),
-    false = lists:keymember("access-control-max-age", 1, HdNoMaxAgeCORS),
-    %% Disable CORS again.
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, [rabbitmq_management, cors_allow_origins, []]),
-    passed.
-
-%% -------------------------------------------------------------------
-%% Helpers.
-%% -------------------------------------------------------------------
-
-msg(Key, Headers, Body) ->
-    msg(Key, Headers, Body, <<"string">>).
-
-msg(Key, Headers, Body, Enc) ->
-    [{exchange,         <<"">>},
-     {routing_key,      Key},
-     {properties,       [{delivery_mode, 2},
-                         {headers,       Headers}]},
-     {payload,          Body},
-     {payload_encoding, Enc}].
-
-local_port(Conn) ->
-    [{sock, Sock}] = amqp_connection:info(Conn, [sock]),
-    {ok, Port} = inet:port(Sock),
-    Port.
-
-spawn_invalid(_Config, 0) ->
-    ok;
-spawn_invalid(Config, N) ->
-    Self = self(),
-    spawn(fun() ->
-                  timer:sleep(rand_compat:uniform(250)),
-                  {ok, Sock} = gen_tcp:connect("localhost", amqp_port(Config), [list]),
-                  ok = gen_tcp:send(Sock, "Some Data"),
-                  receive_msg(Self)
-          end),
-    spawn_invalid(Config, N-1).
-
-receive_msg(Self) ->
-    receive
-        {tcp, _, [$A, $M, $Q, $P | _]} ->
-            Self ! done
-    after
-        60000 ->
-            Self ! no_reply
-    end.
-
-wait_for_answers(0) ->
-    ok;
-wait_for_answers(N) ->
-    receive
-        done ->
-            wait_for_answers(N-1);
-        no_reply ->
-            throw(no_reply)
-    end.
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_rabbitmqadmin_SUITE.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_rabbitmqadmin_SUITE.erl
deleted file mode 100644 (file)
index 80d5527..0000000
+++ /dev/null
@@ -1,435 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_rabbitmqadmin_SUITE).
-
--include_lib("common_test/include/ct.hrl").
-
--compile(export_all).
-
-all() ->
-    [ {group, list_to_atom(Py)} || Py <- find_pythons() ].
-
-groups() ->
-    Tests = [
-             help,
-             host,
-             config,
-             user,
-             fmt_long,
-             fmt_kvp,
-             fmt_tsv,
-             fmt_table,
-             fmt_bash,
-             vhosts,
-             users,
-             permissions,
-             alt_vhost,
-             exchanges,
-             queues,
-             bindings,
-             policies,
-             parameters,
-             publish,
-             ignore_vhost,
-             sort
-            ],
-    [ {list_to_atom(Py), [], Tests} || Py <- find_pythons() ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    inets:start(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-                                                    {rmq_nodename_suffix, ?MODULE}
-                                                   ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps() ++
-                                      rabbit_ct_client_helpers:setup_steps() ++
-                                      [fun (C) ->
-                                               rabbit_ct_helpers:set_config(C,
-                                                                            {rabbitmqadmin_path,
-                                                                             rabbitmqadmin(C)})
-                                       end
-                                      ]).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-                                         rabbit_ct_client_helpers:teardown_steps() ++
-                                             rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(python2, Config) ->
-    rabbit_ct_helpers:set_config(Config, {python, "python2"});
-init_per_group(python3, Config) ->
-    rabbit_ct_helpers:set_config(Config, {python, "python3"});
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(config, Config) ->
-    rabbit_ct_helpers:set_config(Config, {env_home, os:getenv("HOME")});
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(config, Config) ->
-    Home = rabbit_ct_helpers:get_config(Config, env_home),
-    os:putenv("HOME", Home);
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-help(Config) ->
-    {ok, _} = run(Config, ["--help"]),
-    {ok, _} = run(Config, ["help", "subcommands"]),
-    {ok, _} = run(Config, ["help", "config"]),
-    {error, _, _} = run(Config, ["help", "astronomy"]).
-
-host(Config) ->
-    {ok, _} = run(Config, ["show", "overview"]),
-    {ok, _} = run(Config, ["--host", "localhost", "show", "overview"]),
-    {error, _, _} = run(Config, ["--host", "some-host-that-does-not-exist",
-                                 "show", "overview"]).
-
-config(Config) ->
-    PrivDir = ?config(priv_dir, Config),
-    os:putenv("HOME", PrivDir),
-    {_DefConf, TestConf} = write_test_config(Config),
-    {error, _, _} = run(Config, ["--config", "/tmp/no-such-config-file",
-                                 "show", "overview"]),
-    {ok, _} = run(Config, ["--config", TestConf, "--node",
-                           "host_normal", "show", "overview"]),
-
-    % test 'default node in the config file' where "default" uses an invalid host
-    {error, _, _} = run(Config, ["--config", TestConf, "show", "overview"]),
-    {ok, _} = run(Config, ["show", "overview"]),
-    {error, _, _} = run(Config, ["--node", "non_default", "show", "overview"]).
-
-user(Config) ->
-    {ok, _} = run(Config, ["--user", "guest", "--password", "guest", "show", "overview"]),
-    {error, _, _} = run(Config, ["--user", "no", "--password", "guest", "show", "overview"]),
-    {error, _, _} = run(Config, ["--user", "guest", "--password", "no", "show", "overview"]).
-
-fmt_long(Config) ->
-    Out = multi_line_string([
-        "",
-        "--------------------------------------------------------------------------------",
-        "",
-        "   name: /",
-        "tracing: False",
-        "",
-        "--------------------------------------------------------------------------------",
-        "" ]),
-    {ok, Out} = run(Config, ["--format", "long", "list", "vhosts", "name", "tracing"]).
-
-fmt_kvp(Config) ->
-    Out = multi_line_string(["name=\"/\" tracing=\"False\""]),
-    {ok, Out} = run(Config, ["--format", "kvp", "list", "vhosts", "name", "tracing"]).
-
-fmt_tsv(Config) ->
-    Out = multi_line_string([
-                             "name\ttracing",
-                             "/\tFalse"
-                            ]),
-    {ok, Out} = run(Config, ["--format", "tsv", "list", "vhosts", "name", "tracing"]).
-
-fmt_table(Config) ->
-    Out = multi_line_string([
-                             "+------+---------+",
-                             "| name | tracing |",
-                             "+------+---------+",
-                             "| /    | False   |",
-                             "+------+---------+"
-                            ]),
-    {ok, Out} = run(Config, ["list", "vhosts", "name", "tracing"]),
-    {ok, Out} = run(Config, ["--format", "table", "list",
-                             "vhosts", "name", "tracing"]).
-
-fmt_bash(Config) ->
-    {ok, "/\n"} = run(Config, ["--format", "bash", "list",
-                               "vhosts", "name", "tracing"]).
-
-vhosts(Config) ->
-    {ok, ["/"]} = run_list(Config, l("vhosts")),
-    {ok, _} = run(Config, ["declare", "vhost", "name=foo"]),
-    {ok, ["/", "foo"]} = run_list(Config, l("vhosts")),
-    {ok, _} = run(Config, ["delete", "vhost", "name=foo"]),
-    {ok, ["/"]} = run_list(Config, l("vhosts")).
-
-users(Config) ->
-    {ok, ["guest"]} = run_list(Config, l("users")),
-    {error, _, _} = run(Config, ["declare", "user", "name=foo"]),
-    {ok, _} = run(Config, ["declare", "user", "name=foo", "password=pass", "tags="]),
-    {ok, ["foo", "guest"]} = run_list(Config, l("users")),
-    {ok, _} = run(Config, ["delete", "user", "name=foo"]),
-    {ok, ["guest"]} = run_list(Config, l("users")).
-
-permissions(Config) ->
-    {ok, _} = run(Config, ["declare", "vhost", "name=foo"]),
-    {ok, _} = run(Config, ["declare", "user", "name=bar", "password=pass", "tags="]),
-    {ok, [["guest", "/"]]} = run_table(Config, ["list", "permissions",
-                                                "user", "vhost"]),
-    {ok, _} = run(Config, ["declare", "permission", "user=bar", "vhost=foo",
-                           "configure=.*", "write=.*", "read=.*"]),
-    {ok, [["guest", "/"], ["bar", "foo"]]} =  run_table(Config, ["list",
-                                                                 "permissions",
-                                                                 "user",
-                                                                 "vhost"]),
-    {ok, _} = run(Config, ["delete", "user", "name=bar"]),
-    {ok, _} = run(Config, ["delete", "vhost", "name=foo"]).
-
-alt_vhost(Config) ->
-    {ok, _} = run(Config, ["declare", "vhost", "name=foo"]),
-    {ok, _} = run(Config, ["declare", "permission", "user=guest", "vhost=foo",
-                           "configure=.*", "write=.*", "read=.*"]),
-    {ok, _} = run(Config, ["declare", "queue", "name=in_/"]),
-    {ok, _} = run(Config, ["--vhost", "foo", "declare", "queue", "name=in_foo"]),
-    {ok, [["/", "in_/"], ["foo", "in_foo"]]} = run_table(Config, ["list", "queues",
-                                                                  "vhost", "name"]),
-    {ok, _} = run(Config, ["--vhost", "foo", "delete", "queue", "name=in_foo"]),
-    {ok, _} = run(Config, ["delete", "queue", "name=in_/"]),
-    {ok, _} = run(Config, ["delete", "vhost", "name=foo"]).
-
-exchanges(Config) ->
-    {ok, _} = run(Config, ["declare", "exchange", "name=foo", "type=direct"]),
-    {ok, ["amq.direct",
-          "amq.fanout",
-          "amq.headers",
-          "amq.match",
-          "amq.rabbitmq.log",
-          "amq.rabbitmq.trace",
-          "amq.topic",
-          "foo"]} = run_list(Config, l("exchanges")),
-    {ok, _} = run(Config, ["delete", "exchange", "name=foo"]).
-
-queues(Config) ->
-    {ok, _} = run(Config, ["declare", "queue", "name=foo"]),
-    {ok, ["foo"]} = run_list(Config, l("queues")),
-    {ok, _} = run(Config, ["delete", "queue", "name=foo"]).
-
-bindings(Config) ->
-    {ok, _} = run(Config, ["declare", "queue", "name=foo"]),
-    {ok, _} = run(Config, ["declare", "binding", "source=amq.direct",
-                           "destination=foo", "destination_type=queue",
-                           "routing_key=test"]),
-    {ok, [["foo", "queue", "foo"],
-          ["amq.direct", "foo", "queue", "test"]
-         ]} = run_table(Config,
-                              ["list", "bindings",
-                               "source", "destination",
-                               "destination_type", "routing_key"]),
-    {ok, _} = run(Config, ["delete", "queue", "name=foo"]).
-
-policies(Config) ->
-    {ok, _} = run(Config, ["declare", "policy", "name=ha",
-                           "pattern=.*", "definition={\"ha-mode\":\"all\"}"]),
-    {ok, [["ha", "/", ".*", "{\"ha-mode\": \"all\"}"]]} =
-        run_table(Config, ["list", "policies", "name",
-                                 "vhost", "pattern", "definition"]),
-    {ok, _} = run(Config, ["delete", "policy", "name=ha"]).
-
-parameters(Config) ->
-    ok = rpc(Config, rabbit_mgmt_runtime_parameters_util, register, []),
-    {ok, _} = run(Config, ["declare", "parameter", "component=test",
-                           "name=good", "value=123"]),
-    {ok, [["test", "good", "/", "123"]]} = run_table(Config, ["list",
-                                                              "parameters",
-                                                              "component",
-                                                              "name",
-                                                              "vhost",
-                                                              "value"]),
-    {ok, _} = run(Config, ["delete", "parameter", "component=test", "name=good"]),
-    ok = rpc(Config, rabbit_mgmt_runtime_parameters_util, unregister, []).
-
-publish(Config) ->
-    {ok, _} = run(Config, ["declare", "queue", "name=test"]),
-    {ok, _} = run(Config, ["publish", "routing_key=test", "payload=test_1"]),
-    {ok, _} = run(Config, ["publish", "routing_key=test", "payload=test_2"]),
-    % publish with stdin
-    {ok, _} = rabbit_ct_helpers:exec(["python", "-c",
-                                      publish_with_stdin_python_program(Config, "test_3")],
-                                     []),
-
-    M = exp_msg("test", 2, "False", "test_1"),
-    {ok, [M]} = run_table(Config, ["get", "queue=test", "requeue=false"]),
-    M2 = exp_msg("test", 1, "False", "test_2"),
-    {ok, [M2]} = run_table(Config, ["get", "queue=test", "requeue=true"]),
-    M3 = exp_msg("test", 1, "True", "test_2"),
-    {ok, [M3]} = run_table(Config, ["get",
-                                    "queue=test",
-                                    "requeue=false"]),
-    M4 = exp_msg("test", 0, "False", "test_3"),
-    {ok, [M4]} = run_table(Config, ["get",
-                                    "queue=test",
-                                    "requeue=false"]),
-    {ok, _} = run(Config, ["publish", "routing_key=test", "payload=test_4"]),
-    Fn = filename:join(?config(priv_dir, Config), "publish_test_4"),
-
-    {ok, _} = run(Config, ["get", "queue=test", "requeue=false", "payload_file=" ++ Fn]),
-    {ok, <<"test_4">>} = file:read_file(Fn),
-    {ok, _} = run(Config, ["delete", "queue", "name=test"]).
-
-ignore_vhost(Config) ->
-    {ok, _} = run(Config, ["--vhost", "/", "show", "overview"]),
-    {ok, _} = run(Config, ["--vhost", "/", "list", "users"]),
-    {ok, _} = run(Config, ["--vhost", "/", "list", "vhosts"]),
-    {ok, _} = run(Config, ["--vhost", "/", "list", "nodes"]),
-    {ok, _} = run(Config, ["--vhost", "/", "list", "permissions"]),
-    {ok, _} = run(Config, ["--vhost", "/", "declare", "user",
-                           "name=foo", "password=pass", "tags="]),
-    {ok, _} = run(Config, ["delete", "user", "name=foo"]).
-
-sort(Config) ->
-    {ok, _} = run(Config, ["declare", "queue", "name=foo"]),
-    {ok, _} = run(Config, ["declare", "binding", "source=amq.direct",
-                           "destination=foo", "destination_type=queue",
-                           "routing_key=bbb"]),
-    {ok, _} = run(Config, ["declare", "binding", "source=amq.topic",
-                           "destination=foo", "destination_type=queue",
-                           "routing_key=aaa"]),
-    {ok, [["foo"],
-          ["amq.direct", "bbb"],
-          ["amq.topic", "aaa"]]} = run_table(Config, ["--sort", "source",
-                                                      "list", "bindings",
-                                                      "source", "routing_key"]),
-    {ok, [["amq.topic", "aaa"],
-          ["amq.direct", "bbb"],
-          ["foo"]]} = run_table(Config, ["--sort", "routing_key",
-                                         "list", "bindings", "source",
-                                         "routing_key"]),
-    {ok, [["amq.topic", "aaa"],
-          ["amq.direct", "bbb"],
-          ["foo"]]} = run_table(Config, ["--sort", "source",
-                                         "--sort-reverse", "list",
-                                         "bindings", "source",
-                                         "routing_key"]),
-    {ok, _} = run(Config, ["delete", "queue", "name=foo"]).
-
-%% -------------------------------------------------------------------
-%% Utilities
-%% -------------------------------------------------------------------
-
-exp_msg(Key, Count, Redelivered, Payload) ->
-    % routing_key, message_count,
-    % payload, payload_bytes,
-    % payload_encoding, redelivered
-    [Key, integer_to_list(Count),
-     Payload, integer_to_list(length(Payload)),
-     "string", Redelivered].
-
-rpc(Config, M, F, A) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, M, F, A).
-
-l(Thing) ->
-    ["list", Thing, "name"].
-
-multi_line_string(Lines) ->
-    lists:flatten([string:join(Lines, io_lib:nl()), io_lib:nl()]).
-
-run_table(Config, Args) ->
-    {ok, Lines} = run_list(Config, Args),
-    Tokens = [string:tokens(L, "\t") || L <- Lines],
-    {ok, Tokens}.
-
-run_list(Config, Args) ->
-    A = ["-f", "tsv", "-q"],
-    case run(Config, A ++ Args) of
-        {ok, Out} -> {ok, string:tokens(Out, io_lib:nl())};
-        Err -> Err
-    end.
-
-run(Config, Args) ->
-    Py = rabbit_ct_helpers:get_config(Config, python),
-    MgmtPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mgmt),
-    RmqAdmin = rabbit_ct_helpers:get_config(Config, rabbitmqadmin_path),
-    rabbit_ct_helpers:exec([Py,
-                                  RmqAdmin,
-                                  "-P",
-                                  integer_to_list(MgmtPort)] ++ Args,
-                                 [drop_stdout]).
-
-rabbitmqadmin(Config) ->
-    filename:join([?config(current_srcdir, Config), "bin", "rabbitmqadmin"]).
-
-find_pythons() ->
-    Py2 = rabbit_ct_helpers:exec(["python2", "-V"]),
-    Py3 = rabbit_ct_helpers:exec(["python3", "-V"]),
-    case {Py2, Py3} of
-         {{ok, _}, {ok, _}} -> ["python2", "python3"];
-         {{ok, _}, _} -> ["python2"];
-         {_, {ok, _}} -> ["python3"];
-         _ -> erlang:error("python not found")
-    end.
-
-publish_with_stdin_python_program(Config, In) ->
-    % This is a nasty workaround erlang ports not supporting EOF
-    Py = rabbit_ct_helpers:get_config(Config, python),
-    MgmtPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mgmt),
-    RmqAdmin = rabbit_ct_helpers:get_config(Config, rabbitmqadmin_path),
-    "import subprocess;" ++
-    "proc = subprocess.Popen(['" ++ Py ++ "', '" ++ RmqAdmin ++ "', '-P', '" ++ integer_to_list(MgmtPort) ++
-    "', 'publish', 'routing_key=test'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE);" ++
-    "(stdout, stderr) = proc.communicate('" ++ In ++ "');" ++
-    "exit(proc.returncode)".
-
-write_test_config(Config) ->
-    MgmtPort = integer_to_list(rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mgmt)),
-    PrivDir = ?config(priv_dir, Config),
-    DefaultConfig = [
-        "[non_default]",
-        "hostname = localhost",
-        "port = 99999",
-        "username = guest",
-        "password = guest",
-        "declare_vhost = /",
-        "vhost = /",
-        "",
-        "[bad_host]",
-        "hostname = rabbit.acme.com",
-        "port = " ++ MgmtPort,
-        "username = guest",
-        "password = guest"
-                    ],
-    TestConfig = [
-        "[host_normal]",
-        "hostname = localhost",
-        "port = " ++ MgmtPort,
-        "username = guest",
-        "password = guest",
-        "declare_vhost = /",
-        "vhost = /",
-        "",
-        "[default]",
-        "hostname = localhost",
-        "port = 99999",
-        "username = guest",
-        "password = guest"
-           ],
-    DefaultConfig1 = [string:join(DefaultConfig, io_lib:nl()), io_lib:nl()],
-    TestConfig1 = [string:join(TestConfig, io_lib:nl()), io_lib:nl()],
-    FnDefault = filename:join(PrivDir, ".rabbitmqadmin.conf"),
-    FnTest = filename:join(PrivDir, "test-config"),
-    file:write_file(FnDefault, DefaultConfig1),
-    file:write_file(FnTest, TestConfig1),
-    {FnDefault, FnTest}.
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_runtime_parameters_util.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_runtime_parameters_util.erl
deleted file mode 100644 (file)
index 9245827..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_runtime_parameters_util).
--behaviour(rabbit_runtime_parameter).
--behaviour(rabbit_policy_validator).
-
--include_lib("rabbit_common/include/rabbit.hrl").
-
--export([validate/5, notify/4, notify_clear/3]).
--export([register/0, unregister/0]).
--export([validate_policy/1]).
--export([register_policy_validator/0, unregister_policy_validator/0]).
-
-%----------------------------------------------------------------------------
-
-register() ->
-    rabbit_registry:register(runtime_parameter, <<"test">>, ?MODULE).
-
-unregister() ->
-    rabbit_registry:unregister(runtime_parameter, <<"test">>).
-
-validate(_, <<"test">>, <<"good">>,  _Term, _User)      -> ok;
-validate(_, <<"test">>, <<"maybe">>, <<"good">>, _User) -> ok;
-validate(_, <<"test">>, <<"admin">>, _Term, none)       -> ok;
-validate(_, <<"test">>, <<"admin">>, _Term, User) ->
-    case lists:member(administrator, User#user.tags) of
-        true  -> ok;
-        false -> {error, "meh", []}
-    end;
-validate(_, <<"test">>, _, _, _)                        -> {error, "meh", []}.
-
-notify(_, _, _, _) -> ok.
-notify_clear(_, _, _) -> ok.
-
-%----------------------------------------------------------------------------
-
-register_policy_validator() ->
-    rabbit_registry:register(policy_validator, <<"testeven">>, ?MODULE),
-    rabbit_registry:register(policy_validator, <<"testpos">>,  ?MODULE).
-
-unregister_policy_validator() ->
-    rabbit_registry:unregister(policy_validator, <<"testeven">>),
-    rabbit_registry:unregister(policy_validator, <<"testpos">>).
-
-validate_policy([{<<"testeven">>, Terms}]) when is_list(Terms) ->
-    case  length(Terms) rem 2 =:= 0 of
-        true  -> ok;
-        false -> {error, "meh", []}
-    end;
-
-validate_policy([{<<"testpos">>, Terms}]) when is_list(Terms) ->
-    case lists:all(fun (N) -> is_integer(N) andalso N > 0 end, Terms) of
-        true  -> ok;
-        false -> {error, "meh", []}
-    end;
-
-validate_policy(_) ->
-    {error, "meh", []}.
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_db_SUITE.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_db_SUITE.erl
deleted file mode 100644 (file)
index 1f198cc..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_test_db_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include("include/rabbit_mgmt.hrl").
--include("include/rabbit_mgmt_test.hrl").
-
--import(rabbit_mgmt_test_util, [assert_list/2, assert_item/2,
-                                reset_management_settings/1]).
-
--import(rabbit_misc, [pget/2]).
-
--compile(export_all).
-
-all() ->
-    [
-     {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-     {non_parallel_tests, [], [
-                               queue_coarse_test,
-                               connection_coarse_test,
-                               fine_stats_aggregation_time_test,
-                               fine_stats_aggregation_test
-                              ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    inets:start(),
-    Config.
-
-end_per_suite(Config) ->
-    Config.
-
-init_per_group(_, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-                                                    {rmq_nodename_suffix, ?MODULE}
-                                                   ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps() ++
-                                          rabbit_ct_client_helpers:setup_steps() ++
-                                          [fun rabbit_mgmt_test_util:reset_management_settings/1]).
-
-end_per_group(_, Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-                                         [fun rabbit_mgmt_test_util:reset_management_settings/1] ++
-                                         rabbit_ct_client_helpers:teardown_steps() ++
-                                             rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_testcase(Testcase, Config) ->
-    reset_management_settings(Config),
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    reset_management_settings(Config),
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-queue_coarse_test(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, queue_coarse_test1, [Config]).
-
-queue_coarse_test1(_Config) ->
-    rabbit_mgmt_event_collector:override_lookups([{exchange, fun dummy_lookup/1},
-                                                  {queue,    fun dummy_lookup/1}]),
-    create_q(test, 0),
-    create_q(test2, 0),
-    stats_q(test, 0, 10),
-    stats_q(test2, 0, 1),
-    R = range(0, 1, 1),
-    Exp = fun(N) -> simple_details(messages, N, R) end,
-    assert_item(Exp(10), get_q(test, R)),
-    assert_item(Exp(11), get_vhost(R)),
-    assert_item(Exp(11), get_overview_q(R)),
-    delete_q(test, 0),
-    assert_item(Exp(1), get_vhost(R)),
-    assert_item(Exp(1), get_overview_q(R)),
-    delete_q(test2, 0),
-    assert_item(Exp(0), get_vhost(R)),
-    assert_item(Exp(0), get_overview_q(R)),
-    rabbit_mgmt_event_collector:reset_lookups(),
-    ok.
-
-connection_coarse_test(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, connection_coarse_test1, [Config]).
-
-connection_coarse_test1(_Config) ->
-    create_conn(test, 0),
-    create_conn(test2, 0),
-    stats_conn(test, 0, 10),
-    stats_conn(test2, 0, 1),
-    R = range(0, 1, 1),
-    Exp = fun(N) -> simple_details(recv_oct, N, R) end,
-    assert_item(Exp(10), get_conn(test, R)),
-    assert_item(Exp(1), get_conn(test2, R)),
-    delete_conn(test, 1),
-    delete_conn(test2, 1),
-    assert_list([], rabbit_mgmt_db:get_all_connections(R)),
-    ok.
-
-fine_stats_aggregation_test(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, fine_stats_aggregation_test1, [Config]).
-
-fine_stats_aggregation_test1(_Config) ->
-    application:set_env(rabbitmq_management, rates_mode, detailed),
-    restart_mgmt_db(),
-    rabbit_mgmt_event_collector:override_lookups([{exchange, fun dummy_lookup/1},
-                                                  {queue,    fun dummy_lookup/1}]),
-    create_ch(ch1, 0),
-    create_ch(ch2, 0),
-    stats_ch(ch1, 0, [{x, 100}], [{q1, x, 100},
-                                  {q2, x, 10}], [{q1, 2},
-                                                 {q2, 1}]),
-    stats_ch(ch2, 0, [{x, 10}], [{q1, x, 50},
-                                 {q2, x, 5}], []),
-    fine_stats_aggregation_test0(true),
-    delete_q(q2, 0),
-    fine_stats_aggregation_test0(false),
-    delete_q(q1, 0),
-    delete_ch(ch1, 1),
-    delete_ch(ch2, 1),
-    application:set_env(rabbitmq_management, rates_mode, basic),
-    restart_mgmt_db(),
-    ok.
-
-fine_stats_aggregation_test0(Q2Exists) ->
-    R = range(0, 1, 1),
-    Ch1 = get_ch(ch1, R),
-    Ch2 = get_ch(ch2, R),
-    X   = get_x(x, R),
-    Q1  = get_q(q1, R),
-    V   = get_vhost(R),
-    O   = get_overview(R),
-    assert_fine_stats(m, publish,     100, Ch1, R),
-    assert_fine_stats(m, publish,     10,  Ch2, R),
-    assert_fine_stats(m, publish_in,  110, X, R),
-    assert_fine_stats(m, publish_out, 165, X, R),
-    assert_fine_stats(m, publish,     150, Q1, R),
-    assert_fine_stats(m, deliver_get, 2,   Q1, R),
-    assert_fine_stats(m, deliver_get, 3,   Ch1, R),
-    assert_fine_stats(m, publish,     110, V, R),
-    assert_fine_stats(m, deliver_get, 3,   V, R),
-    assert_fine_stats(m, publish,     110, O, R),
-    assert_fine_stats(m, deliver_get, 3,   O, R),
-    assert_fine_stats({pub, x},   publish, 100, Ch1, R),
-    assert_fine_stats({pub, x},   publish, 10,  Ch2, R),
-    assert_fine_stats({in,  ch1}, publish, 100, X, R),
-    assert_fine_stats({in,  ch2}, publish, 10,  X, R),
-    assert_fine_stats({out, q1},  publish, 150, X, R),
-    assert_fine_stats({in,  x},   publish, 150, Q1, R),
-    assert_fine_stats({del, ch1}, deliver_get, 2, Q1, R),
-    assert_fine_stats({del, q1},  deliver_get, 2, Ch1, R),
-    case Q2Exists of
-        true  -> Q2  = get_q(q2, R),
-                 assert_fine_stats(m, publish,     15,  Q2, R),
-                 assert_fine_stats(m, deliver_get, 1,   Q2, R),
-                 assert_fine_stats({out, q2},  publish, 15,  X, R),
-                 assert_fine_stats({in,  x},   publish, 15,  Q2, R),
-                 assert_fine_stats({del, ch1}, deliver_get, 1, Q2, R),
-                 assert_fine_stats({del, q2},  deliver_get, 1, Ch1, R);
-        false -> assert_fine_stats_neg({out, q2}, X),
-                 assert_fine_stats_neg({del, q2}, Ch1)
-    end,
-    ok.
-
-fine_stats_aggregation_time_test(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, fine_stats_aggregation_time_test1, [Config]).
-
-fine_stats_aggregation_time_test1(_Config) ->
-    rabbit_mgmt_event_collector:override_lookups([{exchange, fun dummy_lookup/1},
-                                                  {queue,    fun dummy_lookup/1}]),
-    create_ch(ch, 0),
-    stats_ch(ch, 0, [{x, 100}], [{q, x, 50}], [{q, 20}]),
-    stats_ch(ch, 5, [{x, 110}], [{q, x, 55}], [{q, 22}]),
-
-    R1 = range(0, 1, 1),
-    assert_fine_stats(m, publish,     100, get_ch(ch, R1), R1),
-    assert_fine_stats(m, publish,     50,  get_q(q, R1), R1),
-    assert_fine_stats(m, deliver_get, 20,  get_q(q, R1), R1),
-
-    R2 = range(5, 6, 1),
-    assert_fine_stats(m, publish,     110, get_ch(ch, R2), R2),
-    assert_fine_stats(m, publish,     55,  get_q(q, R2), R2),
-    assert_fine_stats(m, deliver_get, 22,  get_q(q, R2), R2),
-
-    delete_q(q, 0),
-    delete_ch(ch, 1),
-    rabbit_mgmt_event_collector:reset_lookups(),
-    ok.
-
-assert_fine_stats(m, Type, N, Obj, R) ->
-    Act = pget(message_stats, Obj),
-    assert_item(simple_details(Type, N, R), Act);
-assert_fine_stats({T2, Name}, Type, N, Obj, R) ->
-    Act = find_detailed_stats(Name, pget(expand(T2), Obj)),
-    assert_item(simple_details(Type, N, R), Act).
-
-assert_fine_stats_neg({T2, Name}, Obj) ->
-    detailed_stats_absent(Name, pget(expand(T2), Obj)).
-
-%%----------------------------------------------------------------------------
-%% Events in
-%%----------------------------------------------------------------------------
-
-create_q(Name, Timestamp) ->
-    %% Technically we do not need this, the DB ignores it, but let's
-    %% be symmetrical...
-    event(queue_created, [{name, q(Name)}], Timestamp).
-
-create_conn(Name, Timestamp) ->
-    event(connection_created, [{pid,  pid(Name)},
-                               {name, a2b(Name)}], Timestamp).
-
-create_ch(Name, Timestamp) ->
-    event(channel_created, [{pid,  pid(Name)},
-                            {name, a2b(Name)}], Timestamp).
-
-stats_q(Name, Timestamp, Msgs) ->
-    event(queue_stats, [{name,     q(Name)},
-                        {messages, Msgs}], Timestamp).
-
-stats_conn(Name, Timestamp, Oct) ->
-    event(connection_stats, [{pid ,     pid(Name)},
-                             {recv_oct, Oct}], Timestamp).
-
-stats_ch(Name, Timestamp, XStats, QXStats, QStats) ->
-    XStats1 = [{x(XName), [{publish, N}]} || {XName, N} <- XStats],
-    QXStats1 = [{{q(QName), x(XName)}, [{publish, N}]}
-                || {QName, XName, N} <- QXStats],
-    QStats1 = [{q(QName), [{deliver_no_ack, N}]} || {QName, N} <- QStats],
-    event(channel_stats,
-          [{pid,  pid(Name)},
-           {channel_exchange_stats, XStats1},
-           {channel_queue_exchange_stats, QXStats1},
-           {channel_queue_stats, QStats1}], Timestamp).
-
-delete_q(Name, Timestamp) ->
-    event(queue_deleted, [{name, q(Name)}], Timestamp).
-
-delete_conn(Name, Timestamp) ->
-    event(connection_closed, [{pid, pid_del(Name)}], Timestamp).
-
-delete_ch(Name, Timestamp) ->
-    event(channel_closed, [{pid, pid_del(Name)}], Timestamp).
-
-event(Type, Stats, Timestamp) ->
-    ok = gen_server:call(rabbit_mgmt_event_collector,
-                         {event, #event{type      = Type,
-                                        props     = Stats,
-                                        reference = none,
-                                        timestamp = Timestamp * 1000}}).
-
-%%----------------------------------------------------------------------------
-%% Events out
-%%----------------------------------------------------------------------------
-
-range(F, L, I) ->
-    R = #range{first = F * 1000, last = L * 1000, incr = I * 1000},
-    {R, R, R, R}.
-
-get_x(Name, Range) ->
-    [X] = rabbit_mgmt_db:augment_exchanges([x2(Name)], Range, full),
-    X.
-
-get_q(Name, Range) ->
-    [Q] = rabbit_mgmt_db:augment_queues([q2(Name)], Range, full),
-    Q.
-
-get_vhost(Range) ->
-    [VHost] = rabbit_mgmt_db:augment_vhosts([[{name, <<"/">>}]], Range),
-    VHost.
-
-get_conn(Name, Range) -> rabbit_mgmt_db:get_connection(a2b(Name), Range).
-get_ch(Name, Range) -> rabbit_mgmt_db:get_channel(a2b(Name), Range).
-
-get_overview(Range) -> rabbit_mgmt_db:get_overview(Range).
-get_overview_q(Range) -> pget(queue_totals, get_overview(Range)).
-
-details0(R, AR, A, L) ->
-    [{rate,     R},
-     {samples,  [[{sample, S}, {timestamp, T}] || {T, S} <- L]},
-     {avg_rate, AR},
-     {avg,      A}].
-
-simple_details(Thing, N, {#range{first = First, last = Last}, _, _, _}) ->
-    [{Thing, N},
-     {atom_suffix(Thing, "_details"),
-      details0(0.0, 0.0, N * 1.0, [{Last, N}, {First, N}])}].
-
-atom_suffix(Atom, Suffix) ->
-    list_to_atom(atom_to_list(Atom) ++ Suffix).
-
-find_detailed_stats(Name, List) ->
-    [S] = filter_detailed_stats(Name, List),
-    S.
-
-detailed_stats_absent(Name, List) ->
-    [] = filter_detailed_stats(Name, List).
-
-filter_detailed_stats(Name, List) ->
-    [Stats || [{stats, Stats}, {_, Details}] <- List,
-              pget(name, Details) =:= a2b(Name)].
-
-expand(in)  -> incoming;
-expand(out) -> outgoing;
-expand(del) -> deliveries;
-expand(pub) -> publishes.
-
-%%----------------------------------------------------------------------------
-%% Util
-%%----------------------------------------------------------------------------
-
-x(Name) -> rabbit_misc:r(<<"/">>, exchange, a2b(Name)).
-x2(Name) -> q2(Name).
-q(Name) -> rabbit_misc:r(<<"/">>, queue, a2b(Name)).
-q2(Name) -> [{name,  a2b(Name)},
-             {vhost, <<"/">>}].
-
-pid(Name) ->
-    case get({pid, Name}) of
-        undefined -> P = spawn(fun() -> ok end),
-                     put({pid, Name}, P),
-                     P;
-        Pid       -> Pid
-    end.
-
-pid_del(Name) ->
-    Pid = pid(Name),
-    erase({pid, Name}),
-    Pid.
-
-a2b(A) -> list_to_binary(atom_to_list(A)).
-
-dummy_lookup(_Thing) -> {ok, ignore_this}.
-
-restart_mgmt_db() ->
-    supervisor2:terminate_child(rabbit_mgmt_sup_sup, rabbit_mgmt_sup),
-    rabbit_mgmt_sup_sup:start_child().
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_unit_SUITE.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_unit_SUITE.erl
deleted file mode 100644 (file)
index 8f49f37..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_test_unit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-     {group, parallel_tests}
-    ].
-
-groups() ->
-    [
-     {parallel_tests, [parallel], [
-                                   tokenise_test,
-                                   pack_binding_test,
-                                   amqp_table_test
-                                  ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-tokenise_test(_Config) ->
-    [] = rabbit_mgmt_format:tokenise(""),
-    ["foo"] = rabbit_mgmt_format:tokenise("foo"),
-    ["foo", "bar"] = rabbit_mgmt_format:tokenise("foo~bar"),
-    ["foo", "", "bar"] = rabbit_mgmt_format:tokenise("foo~~bar"),
-    ok.
-
-pack_binding_test(_Config) ->
-    assert_binding(<<"~">>,
-                   <<"">>, []),
-    assert_binding(<<"foo">>,
-                   <<"foo">>, []),
-    assert_binding(<<"foo%7Ebar%2Fbash">>,
-                   <<"foo~bar/bash">>, []),
-    assert_binding(<<"foo%7Ebar%7Ebash">>,
-                   <<"foo~bar~bash">>, []),
-    ok.
-
-amqp_table_test(_Config) ->
-    assert_table({struct, []}, []),
-    assert_table({struct, [{<<"x-expires">>, 1000}]},
-                 [{<<"x-expires">>, long, 1000}]),
-    assert_table({struct,
-                  [{<<"x-forwarding">>,
-                    [{struct,
-                      [{<<"uri">>, <<"amqp://localhost/%2f/upstream">>}]}]}]},
-                 [{<<"x-forwarding">>, array,
-                   [{table, [{<<"uri">>, longstr,
-                              <<"amqp://localhost/%2f/upstream">>}]}]}]).
-
-assert_table(JSON, AMQP) ->
-    ?assertEqual(JSON, rabbit_mgmt_format:amqp_table(AMQP)),
-    ?assertEqual(AMQP, rabbit_mgmt_format:to_amqp_table(JSON)).
-
-%%--------------------------------------------------------------------
-
-assert_binding(Packed, Routing, Args) ->
-    case rabbit_mgmt_format:pack_binding_props(Routing, Args) of
-        Packed ->
-            ok;
-        Act ->
-            throw({pack, Routing, Args, expected, Packed, got, Act})
-    end.
diff --git a/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_util.erl b/rabbitmq-server/deps/rabbitmq_management/test/rabbit_mgmt_test_util.erl
deleted file mode 100644 (file)
index a5be762..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2010-2012 GoPivotal, Inc.  All rights reserved.
-%%
-
--module(rabbit_mgmt_test_util).
-
--include("include/rabbit_mgmt_test.hrl").
-
--compile(export_all).
-
-reset_management_settings(Config) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, [rabbitmq_management, process_stats_gc_timeout, 300000]),
-    rabbit_ct_broker_helpers:rpc(Config, 0, application, set_env, [rabbitmq_management, collect_statistics_interval, 5000]),
-    Config.
-
-http_get(Config, Path) ->
-    http_get(Config, Path, ?OK).
-
-http_get(Config, Path, CodeExp) ->
-    http_get(Config, Path, "guest", "guest", CodeExp).
-
-http_get(Config, Path, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, get, Path, [auth_header(User, Pass)]),
-    assert_code(CodeExp, CodeAct, "GET", Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-http_put(Config, Path, List, CodeExp) ->
-    http_put_raw(Config, Path, format_for_upload(List), CodeExp).
-
-http_put(Config, Path, List, User, Pass, CodeExp) ->
-    http_put_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp).
-
-http_post(Config, Path, List, CodeExp) ->
-    http_post_raw(Config, Path, format_for_upload(List), CodeExp).
-
-http_post(Config, Path, List, User, Pass, CodeExp) ->
-    http_post_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp).
-
-http_post_accept_json(Config, Path, List, CodeExp) ->
-    http_post_accept_json(Config, Path, List, "guest", "guest", CodeExp).
-
-http_post_accept_json(Config, Path, List, User, Pass, CodeExp) ->
-    http_post_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp,
-                 [{"Accept", "application/json"}]).
-
-req(Config, Type, Path, Headers) ->
-    httpc:request(Type, {uri_base_from(Config) ++ Path, Headers}, ?HTTPC_OPTS, []).
-
-req(Config, Type, Path, Headers, Body) ->
-    httpc:request(Type, {uri_base_from(Config) ++ Path, Headers, "application/json", Body},
-                  ?HTTPC_OPTS, []).
-
-uri_base_from(Config) ->
-    binary_to_list(
-      rabbit_mgmt_format:print(
-        "http://localhost:~w/api",
-        [mgmt_port(Config)])).
-
-auth_header(Username, Password) ->
-    {"Authorization",
-     "Basic " ++ binary_to_list(base64:encode(Username ++ ":" ++ Password))}.
-
-amqp_port(Config) ->
-    config_port(Config, tcp_port_amqp).
-
-mgmt_port(Config) ->
-    config_port(Config, tcp_port_mgmt).
-
-config_port(Config, PortKey) ->
-    rabbit_ct_broker_helpers:get_node_config(Config, 0, PortKey).
-
-http_put_raw(Config, Path, Body, CodeExp) ->
-    http_upload_raw(Config, put, Path, Body, "guest", "guest", CodeExp, []).
-
-http_put_raw(Config, Path, Body, User, Pass, CodeExp) ->
-    http_upload_raw(Config, put, Path, Body, User, Pass, CodeExp, []).
-
-
-http_post_raw(Config, Path, Body, CodeExp) ->
-    http_upload_raw(Config, post, Path, Body, "guest", "guest", CodeExp, []).
-
-http_post_raw(Config, Path, Body, User, Pass, CodeExp) ->
-    http_upload_raw(Config, post, Path, Body, User, Pass, CodeExp, []).
-
-http_post_raw(Config, Path, Body, User, Pass, CodeExp, MoreHeaders) ->
-    http_upload_raw(Config, post, Path, Body, User, Pass, CodeExp, MoreHeaders).
-
-
-http_upload_raw(Config, Type, Path, Body, User, Pass, CodeExp, MoreHeaders) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-       req(Config, Type, Path, [auth_header(User, Pass)] ++ MoreHeaders, Body),
-    assert_code(CodeExp, CodeAct, Type, Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-http_delete(Config, Path, CodeExp) ->
-    http_delete(Config, Path, "guest", "guest", CodeExp).
-
-http_delete(Config, Path, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, delete, Path, [auth_header(User, Pass)]),
-    assert_code(CodeExp, CodeAct, "DELETE", Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-format_for_upload(none) ->
-    <<"">>;
-format_for_upload(List) ->
-    iolist_to_binary(mochijson2:encode({struct, List})).
-
-assert_code(CodesExpected, CodeAct, Type, Path, Body) when is_list(CodesExpected) ->
-    case lists:member(CodeAct, CodesExpected) of
-        true ->
-            ok;
-        false ->
-            throw({expected, CodesExpected, got, CodeAct, type, Type,
-                   path, Path, body, Body})
-    end;
-assert_code(CodeExp, CodeAct, Type, Path, Body) ->
-    case CodeExp of
-        CodeAct -> ok;
-        _       -> throw({expected, CodeExp, got, CodeAct, type, Type,
-                          path, Path, body, Body})
-    end.
-
-decode(?OK, _Headers,  ResBody) -> cleanup(mochijson2:decode(ResBody));
-decode(_,    Headers, _ResBody) -> Headers.
-
-cleanup(L) when is_list(L) ->
-    [cleanup(I) || I <- L];
-cleanup({struct, I}) ->
-    cleanup(I);
-cleanup({K, V}) when is_binary(K) ->
-    {list_to_atom(binary_to_list(K)), cleanup(V)};
-cleanup(I) ->
-    I.
-
-assert_list(Exp, Act) ->
-    case length(Exp) == length(Act) of
-        true  -> ok;
-        false -> throw({expected, Exp, actual, Act})
-    end,
-    [case length(lists:filter(fun(ActI) -> test_item(ExpI, ActI) end, Act)) of
-         1 -> ok;
-         N -> throw({found, N, ExpI, in, Act})
-     end || ExpI <- Exp].
-
-assert_item(Exp, Act) ->
-    case test_item0(Exp, Act) of
-        [] -> ok;
-        Or -> throw(Or)
-    end.
-
-test_item(Exp, Act) ->
-    case test_item0(Exp, Act) of
-        [] -> true;
-        _  -> false
-    end.
-
-test_item0(Exp, Act) ->
-    [{did_not_find, ExpI, in, Act} || ExpI <- Exp,
-                                      not lists:member(ExpI, Act)].
-
-assert_keys(Exp, Act) ->
-    case test_key0(Exp, Act) of
-        [] -> ok;
-        Or -> throw(Or)
-    end.
-
-test_key0(Exp, Act) ->
-    [{did_not_find, ExpI, in, Act} || ExpI <- Exp,
-                                      not proplists:is_defined(ExpI, Act)].
-assert_no_keys(NotExp, Act) ->
-    case test_no_key0(NotExp, Act) of
-        [] -> ok;
-        Or -> throw(Or)
-    end.
-
-test_no_key0(Exp, Act) ->
-    [{invalid_key, ExpI, in, Act} || ExpI <- Exp,
-                                      proplists:is_defined(ExpI, Act)].
diff --git a/rabbitmq-server/deps/rabbitmq_management_agent/erlang.mk b/rabbitmq-server/deps/rabbitmq_management_agent/erlang.mk
deleted file mode 100644 (file)
index 1688ee8..0000000
+++ /dev/null
@@ -1,6640 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_management_agent/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_management_agent/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_management_visualiser/erlang.mk b/rabbitmq-server/deps/rabbitmq_management_visualiser/erlang.mk
deleted file mode 100644 (file)
index 1688ee8..0000000
+++ /dev/null
@@ -1,6640 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_management_visualiser/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_management_visualiser/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/build.config b/rabbitmq-server/deps/rabbitmq_mqtt/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/erlang.mk b/rabbitmq-server/deps/rabbitmq_mqtt/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_mqtt/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/Makefile b/rabbitmq-server/deps/rabbitmq_mqtt/test/Makefile
deleted file mode 100644 (file)
index 8b37c4b..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-UPSTREAM_GIT=https://github.com/eclipse/paho.mqtt.java
-REVISION=00b5b2f99ae8410b7d96d106e080a092c5f92546
-
-JC=javac
-
-TEST_SRC=src
-CHECKOUT_DIR=test_client
-PAHO_JAR_NAME=org.eclipse.paho.client.mqttv3.jar
-PAHO_JAR=$(CHECKOUT_DIR)/org.eclipse.paho.client.mqttv3/$(PAHO_JAR_NAME)
-JUNIT_JAR=../lib/junit.jar
-JAVA_AMQP_DIR=$(DEPS_DIR)/rabbitmq_java_client
-JAVA_AMQP_CLASSES=$(JAVA_AMQP_DIR)/build/classes/
-
-ALL_CLASSES:=$(foreach f,$(shell find src -name '*.class'),'$(f)')
-CP:=$(PAHO_JAR):$(JUNIT_JAR):$(TEST_SRC):$(JAVA_AMQP_CLASSES)
-
-HOSTNAME:=$(shell hostname)
-
-define class_from_path
-$(subst .class,,$(subst src.,,$(subst /,.,$(1))))
-endef
-
-.PHONY: test
-test: build_java_amqp
-       ant test \
-               -Dhostname=$(HOSTNAME) \
-               -Dcerts.dir=$(SSL_CERTS_DIR) \
-               -Dmqtt.ssl.port=$(MQTT_SSL_PORT) \
-               -Dmqtt.port=$(MQTT_PORT) \
-               -Damqp.port=$(AMQP_PORT) \
-               -Dbuild.out=$(DATA_DIR)/build
-
-clean:
-       ant clean
-       rm -rf test_client
-
-
-distclean: clean
-       rm -rf $(CHECKOUT_DIR)
-
-$(CHECKOUT_DIR):
-       git clone $(UPSTREAM_GIT) $@
-       (cd $@ && git checkout $(REVISION)) || rm -rf $@
-
-
-.PHONY: build_java_amqp
-build_java_amqp: $(CHECKOUT_DIR)
-       $(MAKE) -C $(JAVA_AMQP_DIR) jar
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/build.properties b/rabbitmq-server/deps/rabbitmq_mqtt/test/build.properties
deleted file mode 100644 (file)
index b6ba8e8..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-build.out=build
-test.resources=${build.out}/test/resources
-javac.debug=true
-test.javac.out=${build.out}/test/classes
-test.resources=${build.out}/test/resources
-test.src.home=src
-certs.dir=certs
-certs.password=test
-server.keystore=${test.resources}/server.jks
-server.cert=${certs.dir}/server/cert.pem
-ca.cert=${certs.dir}/testca/cacert.pem
-server.keystore.phrase=bunnyhop
-amqp.port=5672
-mqtt.port=1883
-mqtt.ssl.port=8883
-
-client.keystore=${test.resources}/client.jks
-client.keystore.phrase=bunnychow
-client.srckeystore=${certs.dir}/client/keycert.p12
-client.srckeystore.password=bunnychow
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/build.xml b/rabbitmq-server/deps/rabbitmq_mqtt/test/build.xml
deleted file mode 100644 (file)
index c3eb7a6..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version="1.0"?>
-<project name="MQTT Java Test client" default="build">
-
-  <property name="output.folder" value="./target/work" />
-  <property name="ship.folder" value="./" />
-
-  <property file="build.properties"/>
-
-  <property environment="env"/>
-  <property name="java-amqp-client-path" location="${env.DEPS_DIR}/rabbitmq_java_client" />
-
-  <path id="test.javac.classpath">
-    <!-- cf dist target, infra -->
-    <fileset dir="lib">
-      <include name="**/*.jar"/>
-    </fileset>
-    <fileset dir="test_client">
-      <include name="**/*.jar"/>
-    </fileset>
-    <fileset dir="${java-amqp-client-path}">
-      <include name="**/rabbitmq-client.jar" />
-    </fileset>
-  </path>
-
-  <target name="clean-paho" description="Clean compiled Eclipe Paho Test Client jars" >
-    <ant antfile="test_client/org.eclipse.paho.client.mqttv3/build.xml" useNativeBasedir="true" target="clean"/>
-  </target>
-
-  <target name="clean"  >
-    <delete dir="${build.out}"/>
-  </target>
-
-  <target name="build-paho" depends="clean-paho" description="Build the Eclipse Paho Test Client">
-    <ant antfile="test_client/org.eclipse.paho.client.mqttv3/build.xml" useNativeBasedir="true" />
-  </target>
-
-  <target name="detect-ssl">
-    <available property="SSL_AVAILABLE" file="${certs.dir}/client"/>
-    <echo message="certsdir:${certs.dir}" />
-    <property name="CLIENT_KEYSTORE_PHRASE" value="bunnies"/>
-    <property name="SSL_P12_PASSWORD" value="${certs.password}"/>
-  </target>
-
-  <target name="detect-tmpdir">
-    <condition property="TMPDIR" value="${env.TMPDIR}" else="/tmp">
-      <available file="${env.TMPDIR}" type="dir"/>
-    </condition>
-  </target>
-
-  <target name="make-server-keystore" if="SSL_AVAILABLE" depends="detect-ssl, detect-tmpdir">
-    <mkdir dir="${test.resources}"/>
-    <exec executable="keytool" failonerror="true" osfamily="unix">
-      <arg line="-import"/>
-      <arg value="-alias"/>
-      <arg value="server1"/>
-      <arg value="-file"/>
-      <arg value="${server.cert}"/>
-      <arg value="-keystore"/>
-      <arg value="${server.keystore}"/>
-      <arg value="-noprompt"/>
-      <arg value="-storepass"/>
-      <arg value="${server.keystore.phrase}"/>
-    </exec>
-    <exec executable="keytool" failonerror="true" osfamily="unix">
-          <arg line="-import"/>
-          <arg value="-alias"/>
-          <arg value="testca"/>
-          <arg value="-trustcacerts"/>
-          <arg value="-file"/>
-          <arg value="${ca.cert}"/>
-          <arg value="-keystore"/>
-          <arg value="${server.keystore}"/>
-          <arg value="-noprompt"/>
-          <arg value="-storepass"/>
-          <arg value="${server.keystore.phrase}"/>
-        </exec>
-  </target>
-
- <target name="make-client-keystore" if="SSL_AVAILABLE" depends="detect-ssl, detect-tmpdir">
-   <mkdir dir="${test.resources}"/>
-     <exec executable="keytool" failonerror="true" osfamily="unix">
-       <arg line="-importkeystore"/>
-       <arg line="-srckeystore" />
-       <arg line="${client.srckeystore}" />
-       <arg value="-srcstoretype"/>
-       <arg value="PKCS12"/>
-       <arg value="-srcstorepass"/>
-       <arg value="${client.srckeystore.password}"/>
-       <arg value="-destkeystore"/>
-       <arg value="${client.keystore}"/>
-       <arg value="-deststoretype"/>
-       <arg value="JKS"/>
-       <arg value="-noprompt"/>
-       <arg value="-storepass"/>
-      <arg value="${client.keystore.phrase}"/>
-    </exec>
-  </target>
-
-  <target name="test-build" depends="clean,build-paho">
-    <mkdir dir="${test.javac.out}"/>
-
-    <javac srcdir="./src"
-      destdir="${test.javac.out}"
-      debug="on"
-      includeantruntime="false" >
-      <classpath>
-        <path refid="test.javac.classpath"/>
-      </classpath>
-    </javac>
-  </target>
-
-  <target name="test-ssl" depends="test-build, make-server-keystore, make-client-keystore" if="SSL_AVAILABLE">
-    <junit printSummary="withOutAndErr"
-      haltOnFailure="true"
-      failureproperty="test.failure"
-      fork="yes">
-      <classpath>
-        <path refid="test.javac.classpath"/>
-        <pathelement path="${test.javac.out}"/>
-        <pathelement path="${test.resources}"/>
-      </classpath>
-      <jvmarg value="-Dhostname=${hostname}"/>
-      <jvmarg value="-Dmqtt.ssl.port=${mqtt.ssl.port}"/>
-      <jvmarg value="-Dserver.keystore.passwd=${server.keystore.phrase}"/>
-      <jvmarg value="-Dclient.keystore.passwd=${client.keystore.phrase}"/>
-      <formatter type="plain"/>
-      <formatter type="xml"/>
-      <test todir="${build.out}" name="com.rabbitmq.mqtt.test.tls.MqttSSLTest"/>
-    </junit>
-  </target>
-
-  <target name="test-server" depends="test-build">
-    <junit printSummary="withOutAndErr"
-        haltOnFailure="true"
-        failureproperty="test.failure"
-        fork="yes">
-      <classpath>
-        <path refid="test.javac.classpath"/>
-        <pathelement path="${test.javac.out}"/>
-      </classpath>
-      <jvmarg value="-Damqp.port=${amqp.port}"/>
-      <jvmarg value="-Dmqtt.port=${mqtt.port}"/>
-      <jvmarg value="-Dhostname=${hostname}"/>
-
-      <formatter type="plain"/>
-      <formatter type="xml"/>
-      <test todir="${build.out}" name="com.rabbitmq.mqtt.test.MqttTest"/>
-    </junit>
-  </target>
-
-  <target name="test" depends="test-server, test-ssl" description="Build the test mqtt client libraries.">
-
-  </target>
-
-</project>
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/java_SUITE.erl b/rabbitmq-server/deps/rabbitmq_mqtt/test/java_SUITE.erl
deleted file mode 100644 (file)
index eb011fc..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(java_SUITE).
--compile([export_all]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--define(BASE_CONF_RABBIT, {rabbit, [{ssl_options, [{fail_if_no_peer_cert, false}]}]}).
--define(BASE_CONF_MQTT,
-        {rabbitmq_mqtt, [
-           {ssl_cert_login,   true},
-           {allow_anonymous,  true},
-           {tcp_listeners,    []},
-           {ssl_listeners,    []}
-           ]}).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                java
-                               ]}
-    ].
-
-suite() ->
-    [{timetrap, {seconds, 600}}].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-merge_app_env(Config) ->
-    {ok, Ssl} = q(Config, [erlang_node_config, rabbit, ssl_options]),
-    Ssl1 = lists:keyreplace(fail_if_no_peer_cert, 1, Ssl, {fail_if_no_peer_cert, false}),
-    Config1 = rabbit_ct_helpers:merge_app_env(Config, {rabbit, [{ssl_options, Ssl1}]}),
-    rabbit_ct_helpers:merge_app_env(Config1, ?BASE_CONF_MQTT).
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_certspwd, "bunnychow"}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      [ fun merge_app_env/1 ] ++
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    Hostname = re:replace(os:cmd("hostname"), "\\s+", "", [global,{return,list}]),
-    User = "O=client,CN=" ++ Hostname,
-    {ok,_} = rabbit_ct_broker_helpers:rabbitmqctl(Config, 0, ["add_user", User, ""]),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, 0, ["set_permissions",  "-p", "/", User, ".*", ".*", ".*"]),
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-
-%% -------------------------------------------------------------------
-%% Testsuite cases
-%% -------------------------------------------------------------------
-
-java(Config) ->
-    CertsDir = rabbit_ct_helpers:get_config(Config, rmq_certsdir),
-    MqttPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mqtt),
-    MqttSslPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mqtt_tls),
-    AmqpPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp),
-    DataDir = rabbit_ct_helpers:get_config(Config, priv_dir),
-    os:putenv("DATA_DIR", DataDir),
-    os:putenv("SSL_CERTS_DIR", CertsDir),
-    os:putenv("MQTT_SSL_PORT", erlang:integer_to_list(MqttSslPort)),
-    os:putenv("MQTT_PORT", erlang:integer_to_list(MqttPort)),
-    os:putenv("AMQP_PORT", erlang:integer_to_list(AmqpPort)),
-    {ok, _} = rabbit_ct_helpers:make(Config, make_dir(), ["test"]).
-
-
-make_dir() ->
-    {Src, _} = filename:find_src(?MODULE),
-    filename:dirname(Src).
-
-rpc(Config, M, F, A) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, M, F, A).
-
-q(P, [K | Rem]) ->
-    case proplists:get_value(K, P) of
-        undefined -> undefined;
-        V -> q(V, Rem)
-    end;
-q(P, []) -> {ok, P}.
-
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/lib/junit.jar b/rabbitmq-server/deps/rabbitmq_mqtt/test/lib/junit.jar
deleted file mode 100644 (file)
index 3a7fc26..0000000
Binary files a/rabbitmq-server/deps/rabbitmq_mqtt/test/lib/junit.jar and /dev/null differ
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/processor_SUITE.erl b/rabbitmq-server/deps/rabbitmq_mqtt/test/processor_SUITE.erl
deleted file mode 100644 (file)
index fe05811..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-
-
--module(processor_SUITE).
--compile([export_all]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                ignores_colons_in_username_if_option_set,
-                                interprets_colons_in_username_if_option_not_set
-                               ]}
-    ].
-
-suite() ->
-    [{timetrap, {seconds, 60}}].
-
-init_per_suite(Config) ->
-    ok = application:load(rabbitmq_mqtt),
-    Config.
-end_per_suite(Config) ->
-    ok = application:unload(rabbitmq_mqtt),
-    Config.
-init_per_group(_, Config) -> Config.
-end_per_group(_, Config) -> Config.
-init_per_testcase(_, Config) -> Config.
-end_per_testcase(_, Config) -> Config.
-
-ignore_colons(B) -> application:set_env(rabbitmq_mqtt, ignore_colons_in_username, B).
-
-ignores_colons_in_username_if_option_set(_Config) ->
-    ignore_colons(true),
-    ?assertEqual({rabbit_mqtt_util:env(vhost), <<"a:b:c">>},
-                  rabbit_mqtt_processor:get_vhost_username(<<"a:b:c">>)).
-
-interprets_colons_in_username_if_option_not_set(_Config) ->
-   ignore_colons(false),
-   ?assertEqual({<<"a:b">>, <<"c">>},
-                 rabbit_mqtt_processor:get_vhost_username(<<"a:b:c">>)).
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/rabbitmq_mqtt.app b/rabbitmq-server/deps/rabbitmq_mqtt/test/rabbitmq_mqtt.app
deleted file mode 100644 (file)
index c4083ec..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{application, rabbitmq_mqtt,
- [{description, "RabbitMQ MQTT Adapter"},
-  {vsn, "%%VSN%%"},
-  {modules, []},
-  {registered, []},
-  {mod, {rabbit_mqtt, []}},
-  {env, [{default_user, "guest_user"},
-         {default_pass, "guest_pass"},
-         {ssl_cert_login,false},
-         {allow_anonymous, true},
-         {vhost, "/"},
-         {exchange, "amq.topic"},
-         {subscription_ttl, 1800000}, % 30 min
-         {prefetch, 10},
-         {ssl_listeners, []},
-         {tcp_listeners, [1883]},
-         {tcp_listen_options, [{backlog,   128},
-                               {nodelay,   true}]}]},
-  {applications, [kernel, stdlib, rabbit, amqp_client]}]}.
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/reader_SUITE.erl b/rabbitmq-server/deps/rabbitmq_mqtt/test/reader_SUITE.erl
deleted file mode 100644 (file)
index 5366da6..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
--module(reader_SUITE).
--compile([export_all]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                block
-                               ]}
-    ].
-
-suite() ->
-    [{timetrap, {seconds, 60}}].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-mqtt_config(Config) ->
-    P = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mqtt_extra),
-    P2 = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mqtt_tls_extra),
-    {rabbitmq_mqtt, [
-       {ssl_cert_login,   true},
-       {allow_anonymous,  true},
-       {tcp_listeners,    [P]},
-       {ssl_listeners,    [P2]}
-       ]}.
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_extra_tcp_ports, [tcp_port_mqtt_extra,
-                               tcp_port_mqtt_tls_extra]}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-
-%% -------------------------------------------------------------------
-%% Testsuite cases
-%% -------------------------------------------------------------------
-
-block(Config) ->
-    P = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_mqtt),
-    % ok = rpc(Config, ?MODULE, change_configuration, [mqtt_config(Config)]),
-    {ok, C} = emqttc:start_link([{host, "localhost"},
-                                 {port, P},
-                                 {client_id, <<"simpleClient">>},
-                                 {proto_ver, 3},
-                                 {logger, info},
-                                 {puback_timeout, 1}]),
-    %% Only here to ensure the connection is really up
-    emqttc:subscribe(C, <<"TopicA">>, qos0),
-    emqttc:publish(C, <<"TopicA">>, <<"Payload">>),
-    expect_publishes(<<"TopicA">>, [<<"Payload">>]),
-    emqttc:unsubscribe(C, [<<"TopicA">>]),
-
-    emqttc:subscribe(C, <<"Topic1">>, qos0),
-
-    %% Not blocked
-    {ok, _} = emqttc:sync_publish(C, <<"Topic1">>, <<"Not blocked yet">>,
-                                  [{qos, 1}]),
-
-    ok = rpc(Config, vm_memory_monitor, set_vm_memory_high_watermark, [0.00000001]),
-    ok = rpc(Config, rabbit_alarm, set_alarm, [{{resource_limit, memory, node()}, []}]),
-
-    %% Let it block
-    timer:sleep(100),
-    %% Blocked, but still will publish
-    {error, ack_timeout} = emqttc:sync_publish(C, <<"Topic1">>, <<"Now blocked">>,
-                                  [{qos, 1}]),
-
-    %% Blocked
-    {error, ack_timeout} = emqttc:sync_publish(C, <<"Topic1">>,
-                                               <<"Blocked">>, [{qos, 1}]),
-
-    rpc(Config, vm_memory_monitor, set_vm_memory_high_watermark, [0.4]),
-    rpc(Config, rabbit_alarm, clear_alarm, [{resource_limit, memory, node()}]),
-
-    %% Let alarms clear
-    timer:sleep(1000),
-
-    expect_publishes(<<"Topic1">>, [<<"Not blocked yet">>,
-                                    <<"Now blocked">>,
-                                    <<"Blocked">>]),
-
-    emqttc:disconnect(C).
-
-expect_publishes(_Topic, []) -> ok;
-expect_publishes(Topic, [Payload|Rest]) ->
-    receive
-        {publish, Topic, Payload} -> expect_publishes(Topic, Rest)
-        after 500 ->
-            throw({publish_not_delivered, Payload})
-    end.
-
-rpc(Config, M, F, A) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0, M, F, A).
-
-change_configuration({App, Args}) ->
-    ok = application:stop(App),
-    ok = change_cfg(App, Args),
-    application:start(App).
-
-change_cfg(_, []) ->
-    ok;
-change_cfg(App, [{Name,Value}|Rest]) ->
-    ok = application:set_env(App, Name, Value),
-    change_cfg(App, Rest).
-
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/MqttTest.java b/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/MqttTest.java
deleted file mode 100644 (file)
index 58d2e8e..0000000
+++ /dev/null
@@ -1,642 +0,0 @@
-//  The contents of this file are subject to the Mozilla Public License
-//  Version 1.1 (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.mozilla.org/MPL/
-//
-//  Software distributed under the License is distributed on an "AS IS"
-//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-//  the License for the specific language governing rights and
-//  limitations under the License.
-//
-//  The Original Code is RabbitMQ.
-//
-//  The Initial Developer of the Original Code is GoPivotal, Inc.
-//  Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-//
-
-package com.rabbitmq.mqtt.test;
-
-import com.rabbitmq.client.*;
-import junit.framework.TestCase;
-import org.junit.Assert;
-import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
-import org.eclipse.paho.client.mqttv3.MqttCallback;
-import org.eclipse.paho.client.mqttv3.MqttClient;
-import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
-import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
-import org.eclipse.paho.client.mqttv3.MqttException;
-import org.eclipse.paho.client.mqttv3.MqttMessage;
-import org.eclipse.paho.client.mqttv3.MqttTopic;
-import org.eclipse.paho.client.mqttv3.internal.NetworkModule;
-import org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule;
-import org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream;
-import org.eclipse.paho.client.mqttv3.internal.wire.MqttOutputStream;
-import org.eclipse.paho.client.mqttv3.internal.wire.MqttPingReq;
-
-import javax.net.SocketFactory;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeoutException;
-
-/***
- *  MQTT v3.1 tests
- *  TODO: synchronise access to variables
- */
-
-public class MqttTest extends TestCase implements MqttCallback {
-
-    private final String host = "localhost";
-    private final String brokerUrl = "tcp://" + host + ":" + getPort();
-    private String clientId;
-    private String clientId2;
-    private MqttClient client;
-    private MqttClient client2;
-    private MqttConnectOptions conOpt;
-    private ArrayList<MqttMessage> receivedMessages;
-
-    private final byte[] payload = "payload".getBytes();
-    private final String topic = "test-topic";
-    private final String retainedTopic = "test-retained-topic";
-    private int testDelay = 2000;
-    private long lastReceipt;
-    private boolean expectConnectionFailure;
-    private boolean failOnDelivery = false;
-
-    private Connection conn;
-    private Channel ch;
-
-    private static int getPort() {
-        Object port = System.getProperty("mqtt.port");
-        assertNotNull(port);
-        return Integer.parseInt(port.toString());
-    }
-
-    private static int getAmqpPort() {
-        Object port = System.getProperty("amqp.port");
-        assertNotNull(port);
-        return Integer.parseInt(port.toString());
-    }
-
-    private static String getHost() {
-        Object host = System.getProperty("hostname");
-        assertNotNull(host);
-        return host.toString();
-    }
-    // override 10s limit
-    private class MyConnOpts extends MqttConnectOptions {
-        private int keepAliveInterval = 60;
-        @Override
-        public void setKeepAliveInterval(int keepAliveInterval) {
-            this.keepAliveInterval = keepAliveInterval;
-        }
-        @Override
-        public int getKeepAliveInterval() {
-            return keepAliveInterval;
-        }
-    }
-
-    @Override
-    public void setUp() throws MqttException {
-        clientId = getClass().getSimpleName() + ((int) (10000*Math.random()));
-        clientId2 = clientId + "-2";
-        client = new MqttClient(brokerUrl, clientId, null);
-        client2 = new MqttClient(brokerUrl, clientId2, null);
-        conOpt = new MyConnOpts();
-        setConOpts(conOpt);
-        receivedMessages = new ArrayList<MqttMessage>();
-        expectConnectionFailure = false;
-    }
-
-    @Override
-    public void tearDown() throws MqttException {
-        // clean any sticky sessions
-        setConOpts(conOpt);
-        client = new MqttClient(brokerUrl, clientId, null);
-        try {
-            client.connect(conOpt);
-            client.disconnect(3000);
-        } catch (Exception ignored) {}
-
-        client2 = new MqttClient(brokerUrl, clientId2, null);
-        try {
-            client2.connect(conOpt);
-            client2.disconnect(3000);
-        } catch (Exception ignored) {}
-    }
-
-    private void setUpAmqp() throws IOException, TimeoutException {
-        int port = getAmqpPort();
-        ConnectionFactory cf = new ConnectionFactory();
-        cf.setHost(host);
-        cf.setPort(port);
-        conn = cf.newConnection();
-        ch = conn.createChannel();
-    }
-
-    private void tearDownAmqp() throws IOException {
-        if(conn.isOpen()) {
-            conn.close();
-        }
-    }
-
-    private void setConOpts(MqttConnectOptions conOpts) {
-        // provide authentication if the broker needs it
-        // conOpts.setUserName("guest");
-        // conOpts.setPassword("guest".toCharArray());
-        conOpts.setCleanSession(true);
-        conOpts.setKeepAliveInterval(60);
-    }
-
-    public void testConnectFirst() throws MqttException, IOException, InterruptedException {
-        NetworkModule networkModule = new TCPNetworkModule(SocketFactory.getDefault(), host, getPort(), "");
-        networkModule.start();
-        MqttInputStream  mqttIn  = new MqttInputStream (networkModule.getInputStream());
-        MqttOutputStream mqttOut = new MqttOutputStream(networkModule.getOutputStream());
-        try {
-            mqttOut.write(new MqttPingReq());
-            mqttOut.flush();
-            mqttIn.readMqttWireMessage();
-            fail("Error expected if CONNECT is not first packet");
-        } catch (IOException ignored) {}
-    }
-
-    public void testInvalidUser() throws MqttException {
-        conOpt.setUserName("invalid-user");
-        try {
-            client.connect(conOpt);
-            fail("Authentication failure expected");
-        } catch (MqttException ex) {
-            Assert.assertEquals(MqttException.REASON_CODE_FAILED_AUTHENTICATION, ex.getReasonCode());
-        }
-    }
-
-    // rabbitmq/rabbitmq-mqtt#37: QoS 1, clean session = false
-    public void testQos1AndCleanSessionUnset()
-            throws MqttException, IOException, TimeoutException, InterruptedException {
-        testQueuePropertiesWithCleanSessionUnset("qos1-no-clean-session", 1, true, false);
-    }
-
-    protected void testQueuePropertiesWithCleanSessionSet(String cid, int qos, boolean durable, boolean autoDelete)
-            throws IOException, MqttException, TimeoutException, InterruptedException {
-        testQueuePropertiesWithCleanSession(true, cid, qos, durable, autoDelete);
-    }
-
-    protected void testQueuePropertiesWithCleanSessionUnset(String cid, int qos, boolean durable, boolean autoDelete)
-            throws IOException, MqttException, TimeoutException, InterruptedException {
-        testQueuePropertiesWithCleanSession(false, cid, qos, durable, autoDelete);
-    }
-
-    protected void testQueuePropertiesWithCleanSession(boolean cleanSession, String cid, int qos,
-                                                       boolean durable, boolean autoDelete)
-            throws MqttException, IOException, TimeoutException, InterruptedException {
-        MqttClient c = new MqttClient(brokerUrl, cid, null);
-        MqttConnectOptions opts = new MyConnOpts();
-        opts.setCleanSession(cleanSession);
-        c.connect(opts);
-
-        setUpAmqp();
-        Channel tmpCh = conn.createChannel();
-
-        String q = "mqtt-subscription-" + cid + "qos" + String.valueOf(qos);
-
-        c.subscribe(topic, qos);
-        // there is no server-sent notification about subscription
-        // success so we inject a delay
-        Thread.sleep(testDelay);
-
-        // ensure the queue is declared with the arguments we expect
-        // e.g. mqtt-subscription-client-3aqos0
-        try {
-            // first ensure the queue exists
-            tmpCh.queueDeclarePassive(q);
-            // then assert on properties
-            Map<String, Object> args = new HashMap<String, Object>();
-            args.put("x-expires", 86400000);
-            tmpCh.queueDeclare(q, durable, autoDelete, false, args);
-        } finally {
-            if(c.isConnected()) {
-                c.disconnect(3000);
-            }
-
-            Channel tmpCh2 = conn.createChannel();
-            tmpCh2.queueDelete(q);
-            tmpCh2.close();
-            tearDownAmqp();
-        }
-    }
-
-    public void testInvalidPassword() throws MqttException {
-        conOpt.setUserName("invalid-user");
-        conOpt.setPassword("invalid-password".toCharArray());
-        try {
-            client.connect(conOpt);
-            fail("Authentication failure expected");
-        } catch (MqttException ex) {
-            Assert.assertEquals(MqttException.REASON_CODE_FAILED_AUTHENTICATION, ex.getReasonCode());
-        }
-    }
-
-
-    public void testSubscribeQos0() throws MqttException, InterruptedException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        client.subscribe(topic, 0);
-
-        publish(client, topic, 0, payload);
-        Thread.sleep(testDelay);
-        Assert.assertEquals(1, receivedMessages.size());
-        Assert.assertEquals(true, Arrays.equals(receivedMessages.get(0).getPayload(), payload));
-        Assert.assertEquals(0, receivedMessages.get(0).getQos());
-        client.disconnect();
-    }
-
-    public void testSubscribeUnsubscribe() throws MqttException, InterruptedException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        client.subscribe(topic, 0);
-
-        publish(client, topic, 1, payload);
-        Thread.sleep(testDelay);
-        Assert.assertEquals(1, receivedMessages.size());
-        Assert.assertEquals(true, Arrays.equals(receivedMessages.get(0).getPayload(), payload));
-        Assert.assertEquals(0, receivedMessages.get(0).getQos());
-
-        client.unsubscribe(topic);
-        publish(client, topic, 0, payload);
-        Thread.sleep(testDelay);
-        Assert.assertEquals(1, receivedMessages.size());
-        client.disconnect();
-    }
-
-    public void testSubscribeQos1() throws MqttException, InterruptedException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        client.subscribe(topic, 1);
-
-        publish(client, topic, 0, payload);
-        publish(client, topic, 1, payload);
-        Thread.sleep(testDelay);
-
-        Assert.assertEquals(2, receivedMessages.size());
-        MqttMessage msg1 = receivedMessages.get(0);
-        MqttMessage msg2 = receivedMessages.get(1);
-
-        Assert.assertEquals(true, Arrays.equals(msg1.getPayload(), payload));
-        Assert.assertEquals(0, msg1.getQos());
-
-        Assert.assertEquals(true, Arrays.equals(msg2.getPayload(), payload));
-        Assert.assertEquals(1, msg2.getQos());
-
-        client.disconnect();
-    }
-
-    public void testSubscribeReceivesRetainedMessagesWithMatchingQoS()
-            throws MqttException, InterruptedException, UnsupportedEncodingException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        clearRetained(client, retainedTopic);
-        client.subscribe(retainedTopic, 1);
-
-        publishRetained(client, retainedTopic, 1, "retain 1".getBytes("UTF-8"));
-        publishRetained(client, retainedTopic, 1, "retain 2".getBytes("UTF-8"));
-        Thread.sleep(testDelay);
-
-        Assert.assertEquals(2, receivedMessages.size());
-        MqttMessage lastMsg = receivedMessages.get(1);
-
-        client.unsubscribe(retainedTopic);
-        receivedMessages.clear();
-        client.subscribe(retainedTopic, 1);
-        Thread.sleep(testDelay);
-        Assert.assertEquals(1, receivedMessages.size());
-        final MqttMessage retainedMsg = receivedMessages.get(0);
-        Assert.assertEquals(new String(lastMsg.getPayload()),
-                                   new String(retainedMsg.getPayload()));
-    }
-
-    public void testSubscribeReceivesRetainedMessagesWithDowngradedQoS()
-            throws MqttException, InterruptedException, UnsupportedEncodingException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        clearRetained(client, retainedTopic);
-        client.subscribe(retainedTopic, 1);
-
-        publishRetained(client, retainedTopic, 1, "retain 1".getBytes("UTF-8"));
-        Thread.sleep(testDelay);
-
-        Assert.assertEquals(1, receivedMessages.size());
-        MqttMessage lastMsg = receivedMessages.get(0);
-
-        client.unsubscribe(retainedTopic);
-        receivedMessages.clear();
-        final int subscribeQoS = 0;
-        client.subscribe(retainedTopic, subscribeQoS);
-        Thread.sleep(testDelay);
-        Assert.assertEquals(1, receivedMessages.size());
-        final MqttMessage retainedMsg = receivedMessages.get(0);
-        Assert.assertEquals(new String(lastMsg.getPayload()),
-                            new String(retainedMsg.getPayload()));
-        Assert.assertEquals(subscribeQoS, retainedMsg.getQos());
-    }
-
-    public void testPublishWithEmptyMessageClearsRetained()
-            throws MqttException, InterruptedException, UnsupportedEncodingException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        clearRetained(client, retainedTopic);
-        client.subscribe(retainedTopic, 1);
-
-        publishRetained(client, retainedTopic, 1, "retain 1".getBytes("UTF-8"));
-        publishRetained(client, retainedTopic, 1, "retain 2".getBytes("UTF-8"));
-        Thread.sleep(testDelay);
-
-        Assert.assertEquals(2, receivedMessages.size());
-        client.unsubscribe(retainedTopic);
-        receivedMessages.clear();
-
-        clearRetained(client, retainedTopic);
-        client.subscribe(retainedTopic, 1);
-        Thread.sleep(testDelay);
-        Assert.assertEquals(0, receivedMessages.size());
-    }
-
-    public void testTopics() throws MqttException, InterruptedException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        client.subscribe("/+/mid/#");
-        String cases[] = {"/pre/mid2", "/mid", "/a/mid/b/c/d", "/frob/mid"};
-        List<String> expected = Arrays.asList("/a/mid/b/c/d", "/frob/mid");
-        for(String example : cases){
-            publish(client, example, 0, example.getBytes());
-        }
-        Thread.sleep(testDelay);
-        Assert.assertEquals(expected.size(), receivedMessages.size());
-        for (MqttMessage m : receivedMessages){
-            expected.contains(new String(m.getPayload()));
-        }
-        client.disconnect();
-    }
-
-    public void testNonCleanSession() throws MqttException, InterruptedException {
-        conOpt.setCleanSession(false);
-        client.connect(conOpt);
-        client.subscribe(topic, 1);
-        client.disconnect();
-
-        client2.connect(conOpt);
-        publish(client2, topic, 1, payload);
-        client2.disconnect();
-
-        client.setCallback(this);
-        client.connect(conOpt);
-
-        Thread.sleep(testDelay);
-        Assert.assertEquals(1, receivedMessages.size());
-        Assert.assertEquals(true, Arrays.equals(receivedMessages.get(0).getPayload(), payload));
-        client.disconnect();
-    }
-
-    public void  testSessionRedelivery() throws MqttException, InterruptedException {
-        conOpt.setCleanSession(false);
-        client.connect(conOpt);
-        client.subscribe(topic, 1);
-        client.disconnect();
-
-        client2.connect(conOpt);
-        publish(client2, topic, 1, payload);
-        client2.disconnect();
-
-        failOnDelivery = true;
-
-        // Connection should fail. Messages will be redelivered.
-        client.setCallback(this);
-        client.connect(conOpt);
-
-        Thread.sleep(testDelay);
-        // Message has been delivered but connection has failed.
-        Assert.assertEquals(1, receivedMessages.size());
-        Assert.assertEquals(true, Arrays.equals(receivedMessages.get(0).getPayload(), payload));
-
-        Assert.assertFalse(client.isConnected());
-
-        receivedMessages.clear();
-        failOnDelivery = false;
-
-        client.setCallback(this);
-        client.connect(conOpt);
-
-        Thread.sleep(testDelay);
-        // Message has been redelivered after session resume
-        Assert.assertEquals(1, receivedMessages.size());
-        Assert.assertEquals(true, Arrays.equals(receivedMessages.get(0).getPayload(), payload));
-        Assert.assertTrue(client.isConnected());
-        client.disconnect();
-
-        receivedMessages.clear();
-
-        client.setCallback(this);
-        client.connect(conOpt);
-
-        Thread.sleep(testDelay);
-        // This time messaage are acknowledged and won't be redelivered
-        Assert.assertEquals(0, receivedMessages.size());
-    }
-
-    public void testCleanSession() throws MqttException, InterruptedException {
-        conOpt.setCleanSession(false);
-        client.connect(conOpt);
-        client.subscribe(topic, 1);
-        client.disconnect();
-
-        client2.connect(conOpt);
-        publish(client2, topic, 1, payload);
-        client2.disconnect();
-
-        conOpt.setCleanSession(true);
-        client.connect(conOpt);
-        client.setCallback(this);
-        client.subscribe(topic, 1);
-
-        Thread.sleep(testDelay);
-        Assert.assertEquals(0, receivedMessages.size());
-        client.unsubscribe(topic);
-        client.disconnect();
-    }
-
-    public void testMultipleClientIds() throws MqttException, InterruptedException {
-        client.connect(conOpt);
-        client2 = new MqttClient(brokerUrl, clientId, null);
-        client2.connect(conOpt);
-        Thread.sleep(testDelay);
-        Assert.assertFalse(client.isConnected());
-        client2.disconnect();
-    }
-
-    public void testPing() throws MqttException, InterruptedException {
-        conOpt.setKeepAliveInterval(1);
-        client.connect(conOpt);
-        Thread.sleep(3000);
-        Assert.assertEquals(true, client.isConnected());
-        client.disconnect();
-    }
-
-    public void testWill() throws MqttException, InterruptedException, IOException {
-        client2.connect(conOpt);
-        client2.subscribe(topic);
-        client2.setCallback(this);
-
-        final SocketFactory factory = SocketFactory.getDefault();
-        final ArrayList<Socket> sockets = new ArrayList<Socket>();
-        SocketFactory testFactory = new SocketFactory() {
-            public Socket createSocket(String s, int i) throws IOException {
-                Socket sock = factory.createSocket(s, i);
-                sockets.add(sock);
-                return sock;
-            }
-            public Socket createSocket(String s, int i, InetAddress a, int i1) throws IOException {
-                return null;
-            }
-            public Socket createSocket(InetAddress a, int i) throws IOException {
-                return null;
-            }
-            public Socket createSocket(InetAddress a, int i, InetAddress a1, int i1) throws IOException {
-                return null;
-            }
-            @Override
-            public Socket createSocket() throws IOException {
-                Socket sock = new Socket();
-                sockets.add(sock);
-                return sock;
-            }
-        };
-        conOpt.setSocketFactory(testFactory);
-        MqttTopic willTopic = client.getTopic(topic);
-        conOpt.setWill(willTopic, payload, 0, false);
-        conOpt.setCleanSession(false);
-        client.connect(conOpt);
-
-        Assert.assertEquals(1, sockets.size());
-        expectConnectionFailure = true;
-        sockets.get(0).close();
-        Thread.sleep(testDelay);
-
-        Assert.assertEquals(1, receivedMessages.size());
-        Assert.assertEquals(true, Arrays.equals(receivedMessages.get(0).getPayload(), payload));
-        client2.disconnect();
-    }
-
-    public void testSubscribeMultiple() throws MqttException {
-        client.connect(conOpt);
-        publish(client, "/topic/1", 1, "msq1-qos1".getBytes());
-
-        client2.connect(conOpt);
-        client2.setCallback(this);
-        client2.subscribe("/topic/#");
-        client2.subscribe("/topic/#");
-
-        publish(client, "/topic/2", 0, "msq2-qos0".getBytes());
-        publish(client, "/topic/3", 1, "msq3-qos1".getBytes());
-        publish(client, topic, 0, "msq4-qos0".getBytes());
-        publish(client, topic, 1, "msq4-qos1".getBytes());
-
-        Assert.assertEquals(2, receivedMessages.size());
-        client.disconnect();
-        client2.disconnect();
-    }
-
-    public void testPublishMultiple() throws MqttException, InterruptedException {
-        int pubCount = 50;
-        for (int subQos=0; subQos < 2; subQos++){
-            for (int pubQos=0; pubQos < 2; pubQos++){
-                client.connect(conOpt);
-                client.subscribe(topic, subQos);
-                client.setCallback(this);
-                long start = System.currentTimeMillis();
-                for (int i=0; i<pubCount; i++){
-                    publish(client, topic, pubQos, payload);
-                }
-                Thread.sleep(testDelay);
-                Assert.assertEquals(pubCount, receivedMessages.size());
-                System.out.println("publish QOS" + pubQos + " subscribe QOS" + subQos +
-                                   ", " + pubCount + " msgs took " +
-                                   (lastReceipt - start)/1000.0 + "sec");
-                client.disconnect();
-                receivedMessages.clear();
-            }
-        }
-    }
-
-    public void testInteropM2A() throws MqttException, IOException, InterruptedException, TimeoutException {
-        setUpAmqp();
-        String queue = ch.queueDeclare().getQueue();
-        ch.queueBind(queue, "amq.topic", topic);
-
-        client.connect(conOpt);
-        publish(client, topic, 1, payload);
-        client.disconnect();
-        Thread.sleep(testDelay);
-
-        GetResponse response = ch.basicGet(queue, true);
-        assertTrue(Arrays.equals(payload, response.getBody()));
-        assertNull(ch.basicGet(queue, true));
-        tearDownAmqp();
-    }
-
-    public void testInteropA2M() throws MqttException, IOException, InterruptedException, TimeoutException {
-        client.connect(conOpt);
-        client.setCallback(this);
-        client.subscribe(topic, 1);
-
-        setUpAmqp();
-        ch.basicPublish("amq.topic", topic, MessageProperties.MINIMAL_BASIC, payload);
-        tearDownAmqp();
-        Thread.sleep(testDelay);
-
-        Assert.assertEquals(1, receivedMessages.size());
-        client.disconnect();
-    }
-
-    private void publish(MqttClient client, String topicName, int qos, byte[] payload) throws MqttException {
-       publish(client, topicName, qos, payload, false);
-    }
-
-    private void publish(MqttClient client, String topicName, int qos, byte[] payload, boolean retained) throws MqttException {
-       MqttTopic topic = client.getTopic(topicName);
-               MqttMessage message = new MqttMessage(payload);
-        message.setQos(qos);
-        message.setRetained(retained);
-       MqttDeliveryToken token = topic.publish(message);
-       token.waitForCompletion();
-    }
-
-    private void publishRetained(MqttClient client, String topicName, int qos, byte[] payload) throws MqttException {
-        publish(client, topicName, qos, payload, true);
-    }
-
-    private void clearRetained(MqttClient client, String topicName) throws MqttException {
-        publishRetained(client, topicName, 1, "".getBytes());
-    }
-
-    public void connectionLost(Throwable cause) {
-        if (!expectConnectionFailure)
-            fail("Connection unexpectedly lost");
-    }
-
-    public void messageArrived(String topic, MqttMessage message) throws Exception {
-        lastReceipt = System.currentTimeMillis();
-        receivedMessages.add(message);
-        if(failOnDelivery){
-            throw new Exception("failOnDelivery");
-        }
-    }
-
-    public void deliveryComplete(IMqttDeliveryToken token) {
-    }
-}
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/rabbit-test.sh b/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/rabbit-test.sh
deleted file mode 100644 (file)
index 3601b4c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-CTL=$1
-USER="O=client,CN=$(hostname)"
-
-# Test direct connections
-$CTL add_user "$USER" ''
-$CTL set_permissions -p / "$USER" ".*" ".*" ".*"
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/setup-rabbit-test.sh b/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/setup-rabbit-test.sh
deleted file mode 100644 (file)
index 2e2282e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh -e
-sh -e `dirname $0`/rabbit-test.sh "$DEPS_DIR/rabbit/scripts/rabbitmqctl -n $RABBITMQ_NODENAME"
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/tls/MqttSSLTest.java b/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/tls/MqttSSLTest.java
deleted file mode 100644 (file)
index b1ee72f..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-//  The contents of this file are subject to the Mozilla Public License
-//  Version 1.1 (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.mozilla.org/MPL/
-//
-//  Software distributed under the License is distributed on an "AS IS"
-//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-//  the License for the specific language governing rights and
-//  limitations under the License.
-//
-//  The Original Code is RabbitMQ.
-//
-//  The Initial Developer of the Original Code is GoPivotal, Inc.
-//  Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-//
-
-package com.rabbitmq.mqtt.test.tls;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
-import org.eclipse.paho.client.mqttv3.MqttCallback;
-import org.eclipse.paho.client.mqttv3.MqttClient;
-import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
-import org.eclipse.paho.client.mqttv3.MqttException;
-import org.eclipse.paho.client.mqttv3.MqttMessage;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-
-/**
- * MQTT v3.1 tests
- * TODO: synchronise access to variables
- */
-
-public class MqttSSLTest extends TestCase implements MqttCallback {
-
-    private final String brokerUrl = "ssl://" + getHost() + ":" + getPort();
-    private String clientId;
-    private String clientId2;
-    private MqttClient client;
-    private MqttClient client2;
-    private MqttConnectOptions conOpt;
-    private ArrayList<MqttMessage> receivedMessages;
-
-    private long lastReceipt;
-    private boolean expectConnectionFailure;
-
-    private static String getPort() {
-        Object port = System.getProperty("mqtt.ssl.port");
-        assertNotNull(port);
-        return port.toString();
-    }
-
-    private static String getHost() {
-        Object host = System.getProperty("hostname");
-        assertNotNull(host);
-        return host.toString();
-    }
-
-    // override 10s limit
-    private class MyConnOpts extends MqttConnectOptions {
-        private int keepAliveInterval = 60;
-
-        @Override
-        public void setKeepAliveInterval(int keepAliveInterval) {
-            this.keepAliveInterval = keepAliveInterval;
-        }
-
-        @Override
-        public int getKeepAliveInterval() {
-            return keepAliveInterval;
-        }
-    }
-
-
-    @Override
-    public void setUp() throws MqttException, IOException {
-        clientId = getClass().getSimpleName() + ((int) (10000 * Math.random()));
-        clientId2 = clientId + "-2";
-        client = new MqttClient(brokerUrl, clientId, null);
-        client2 = new MqttClient(brokerUrl, clientId2, null);
-        conOpt = new MyConnOpts();
-        conOpt.setSocketFactory(MutualAuth.getSSLContextWithoutCert().getSocketFactory());
-        setConOpts(conOpt);
-        receivedMessages = new ArrayList<MqttMessage>();
-        expectConnectionFailure = false;
-    }
-
-    @Override
-    public void tearDown() throws MqttException {
-        // clean any sticky sessions
-        setConOpts(conOpt);
-        client = new MqttClient(brokerUrl, clientId, null);
-        try {
-            client.connect(conOpt);
-            client.disconnect();
-        } catch (Exception ignored) {
-        }
-
-        client2 = new MqttClient(brokerUrl, clientId2, null);
-        try {
-            client2.connect(conOpt);
-            client2.disconnect();
-        } catch (Exception ignored) {
-        }
-    }
-
-
-    private void setConOpts(MqttConnectOptions conOpts) {
-        // provide authentication if the broker needs it
-        // conOpts.setUserName("guest");
-        // conOpts.setPassword("guest".toCharArray());
-        conOpts.setCleanSession(true);
-        conOpts.setKeepAliveInterval(60);
-    }
-
-    public void testCertLogin() throws MqttException {
-        try {
-            conOpt.setSocketFactory(MutualAuth.getSSLContextWithClientCert().getSocketFactory());
-            client.connect(conOpt);
-        } catch (Exception e) {
-            e.printStackTrace();
-            fail("Exception: " + e.getMessage());
-        }
-    }
-
-
-    public void testInvalidUser() throws MqttException {
-        conOpt.setUserName("invalid-user");
-        try {
-            client.connect(conOpt);
-            fail("Authentication failure expected");
-        } catch (MqttException ex) {
-            Assert.assertEquals(MqttException.REASON_CODE_FAILED_AUTHENTICATION, ex.getReasonCode());
-        } catch (Exception e) {
-            e.printStackTrace();
-            fail("Exception: " + e.getMessage());
-        }
-    }
-
-    public void testInvalidPassword() throws MqttException {
-        conOpt.setUserName("invalid-user");
-        conOpt.setPassword("invalid-password".toCharArray());
-        try {
-            client.connect(conOpt);
-            fail("Authentication failure expected");
-        } catch (MqttException ex) {
-            Assert.assertEquals(MqttException.REASON_CODE_FAILED_AUTHENTICATION, ex.getReasonCode());
-        } catch (Exception e) {
-            e.printStackTrace();
-            fail("Exception: " + e.getMessage());
-        }
-    }
-
-
-    public void connectionLost(Throwable cause) {
-        if (!expectConnectionFailure)
-            fail("Connection unexpectedly lost");
-    }
-
-    public void messageArrived(String topic, MqttMessage message) throws Exception {
-        lastReceipt = System.currentTimeMillis();
-        receivedMessages.add(message);
-    }
-
-    public void deliveryComplete(IMqttDeliveryToken token) {
-    }
-}
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/tls/MutualAuth.java b/rabbitmq-server/deps/rabbitmq_mqtt/test/src/com/rabbitmq/mqtt/test/tls/MutualAuth.java
deleted file mode 100644 (file)
index a2d5d25..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.rabbitmq.mqtt.test.tls;
-
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManagerFactory;
-import java.io.IOException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertificateException;
-import java.util.Arrays;
-import java.util.List;
-
-public class MutualAuth {
-
-    private MutualAuth() {
-
-    }
-
-    private static String getStringProperty(String propertyName) throws IllegalArgumentException {
-        Object value = System.getProperty(propertyName);
-        if (value == null) throw new IllegalArgumentException("Property: " + propertyName + " not found");
-        return value.toString();
-    }
-
-    private static TrustManagerFactory getServerTrustManagerFactory() throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException {
-        char[] trustPhrase = getStringProperty("server.keystore.passwd").toCharArray();
-        MutualAuth dummy = new MutualAuth();
-
-        // Server TrustStore
-        KeyStore tks = KeyStore.getInstance("JKS");
-        tks.load(dummy.getClass().getResourceAsStream("/server.jks"), trustPhrase);
-
-        TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
-        tmf.init(tks);
-
-        return tmf;
-    }
-
-    public static SSLContext getSSLContextWithClientCert() throws IOException {
-
-        char[] clientPhrase = getStringProperty("client.keystore.passwd").toCharArray();
-
-        MutualAuth dummy = new MutualAuth();
-        try {
-            SSLContext sslContext = getVanillaSSLContext();
-            // Client Keystore
-            KeyStore ks = KeyStore.getInstance("JKS");
-            ks.load(dummy.getClass().getResourceAsStream("/client.jks"), clientPhrase);
-            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
-            kmf.init(ks, clientPhrase);
-
-            sslContext.init(kmf.getKeyManagers(), getServerTrustManagerFactory().getTrustManagers(), null);
-            return sslContext;
-        } catch (Exception e) {
-            throw new IOException(e);
-        }
-
-    }
-
-    private static SSLContext getVanillaSSLContext() throws NoSuchAlgorithmException {
-        SSLContext result = null;
-        List<String> xs = Arrays.asList("TLSv1.2", "TLSv1.1", "TLSv1");
-        for(String x : xs) {
-            try {
-                return SSLContext.getInstance(x);
-            } catch (NoSuchAlgorithmException nae) {
-                // keep trying
-            }
-        }
-        throw new NoSuchAlgorithmException("Could not obtain an SSLContext for TLS 1.0-1.2");
-    }
-
-    public static SSLContext getSSLContextWithoutCert() throws IOException {
-        try {
-            SSLContext sslContext = getVanillaSSLContext();
-            sslContext.init(null, getServerTrustManagerFactory().getTrustManagers(), null);
-            return sslContext;
-        } catch (Exception e) {
-            throw new IOException(e);
-        }
-    }
-
-}
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/src/test.config b/rabbitmq-server/deps/rabbitmq_mqtt/test/src/test.config
deleted file mode 100644 (file)
index 3d6baff..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-[{rabbitmq_mqtt, [
-   {ssl_cert_login,   true},
-   {allow_anonymous,  true},
-   {tcp_listeners,    [1883]},
-   {ssl_listeners,    [8883]}
-   ]},
- {rabbit, [{ssl_options, [{cacertfile,"%%CERTS_DIR%%/testca/cacert.pem"},
-                          {certfile,"%%CERTS_DIR%%/server/cert.pem"},
-                          {keyfile,"%%CERTS_DIR%%/server/key.pem"},
-                          {verify,verify_peer},
-                          {fail_if_no_peer_cert,false}
-                         ]}
-          ]}
-].
diff --git a/rabbitmq-server/deps/rabbitmq_mqtt/test/util_SUITE.erl b/rabbitmq-server/deps/rabbitmq_mqtt/test/util_SUITE.erl
deleted file mode 100644 (file)
index 7f68f07..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-
--module(util_SUITE).
--compile([export_all]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                coerce_exchange,
-                                coerce_vhost,
-                                coerce_default_user,
-                                coerce_default_pass
-                               ]}
-    ].
-
-suite() ->
-    [{timetrap, {seconds, 60}}].
-
-init_per_suite(Config) ->
-    ok = application:load(rabbitmq_mqtt),
-    Config.
-end_per_suite(Config) ->
-    ok = application:unload(rabbitmq_mqtt),
-    Config.
-init_per_group(_, Config) -> Config.
-end_per_group(_, Config) -> Config.
-init_per_testcase(_, Config) -> Config.
-end_per_testcase(_, Config) -> Config.
-
-coerce_exchange(_) ->
-    ?assertEqual(<<"amq.topic">>, rabbit_mqtt_util:env(exchange)).
-
-coerce_vhost(_) ->
-    ?assertEqual(<<"/">>, rabbit_mqtt_util:env(vhost)).
-
-coerce_default_user(_) ->
-    ?assertEqual(<<"guest_user">>, rabbit_mqtt_util:env(default_user)).
-
-coerce_default_pass(_) ->
-    ?assertEqual(<<"guest_pass">>, rabbit_mqtt_util:env(default_pass)).
diff --git a/rabbitmq-server/deps/rabbitmq_recent_history_exchange/build.config b/rabbitmq-server/deps/rabbitmq_recent_history_exchange/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_recent_history_exchange/erlang.mk b/rabbitmq-server/deps/rabbitmq_recent_history_exchange/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_recent_history_exchange/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_recent_history_exchange/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_recent_history_exchange/test/system_SUITE.erl b/rabbitmq-server/deps/rabbitmq_recent_history_exchange/test/system_SUITE.erl
deleted file mode 100644 (file)
index bf4145e..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
--module(system_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include("rabbit_recent_history.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                default_length_test,
-                                length_argument_test,
-                                wrong_argument_type_test,
-                                no_store_test,
-                                e2e_test,
-                                multinode_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    inets:start(),
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_nodes_count,     2}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    TestCaseName = rabbit_ct_helpers:config_to_testcase_name(Config, Testcase),
-    rabbit_ct_helpers:set_config(Config, {test_resource_name,
-                                          re:replace(TestCaseName, "/", "-", [global, {return, list}])}).
-
-end_per_testcase(_Testcase, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-default_length_test(Config) ->
-    Qs = qs(),
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = make_exchange_name(Config, "0")}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{}, payload = <<>>}
-          end, [], Qs, 100, length(Qs) * ?KEEP_NB).
-
-length_argument_test(Config) ->
-    Qs = qs(),
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = make_exchange_name(Config, "0")}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{}, payload = <<>>}
-          end, [{<<"x-recent-history-length">>, long, 30}], Qs, 100, length(Qs) * 30).
-
-wrong_argument_type_test(Config) ->
-    wrong_argument_type_test0(Config, -30),
-    wrong_argument_type_test0(Config, 0).
-
-
-no_store_test(Config) ->
-    Qs = qs(),
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = make_exchange_name(Config, "0")}
-          end,
-          fun() ->
-                  H = [{<<"x-recent-history-no-store">>, bool, true}],
-                  #amqp_msg{props = #'P_basic'{headers = H}, payload = <<>>}
-          end, [], Qs, 100, 0).
-
-e2e_test(Config) ->
-    MsgCount = 10,
-
-    {Conn, Chan} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = make_exchange_name(Config, "1"),
-                            type = <<"x-recent-history">>,
-                            auto_delete = true
-                           }),
-
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = make_exchange_name(Config, "2"),
-                            type = <<"direct">>,
-                            auto_delete = true
-                           }),
-
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Chan, #'queue.declare' {
-                                   queue     = <<"q">>
-                                  }),
-
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Chan, #'queue.bind' {
-                                   queue = Q,
-                                   exchange = make_exchange_name(Config, "2"),
-                                   routing_key = <<"">>
-                                  }),
-
-    #'tx.select_ok'{} = amqp_channel:call(Chan, #'tx.select'{}),
-    [amqp_channel:call(Chan,
-                       #'basic.publish'{exchange = make_exchange_name(Config, "1")},
-                       #amqp_msg{props = #'P_basic'{}, payload = <<>>}) ||
-        _ <- lists:duplicate(MsgCount, const)],
-    amqp_channel:call(Chan, #'tx.commit'{}),
-
-    amqp_channel:call(Chan,
-                      #'exchange.bind' {
-                         source      = make_exchange_name(Config, "1"),
-                         destination = make_exchange_name(Config, "2"),
-                         routing_key = <<"">>
-                        }),
-
-    #'queue.declare_ok'{message_count = Count, queue = Q} =
-        amqp_channel:call(Chan, #'queue.declare' {
-                                   passive   = true,
-                                   queue     = Q
-                                  }),
-
-    ?assertEqual(MsgCount, Count),
-
-    amqp_channel:call(Chan, #'exchange.delete' { exchange = make_exchange_name(Config, "1") }),
-    amqp_channel:call(Chan, #'exchange.delete' { exchange = make_exchange_name(Config, "2") }),
-    amqp_channel:call(Chan, #'queue.delete' { queue = Q }),
-
-    rabbit_ct_client_helpers:close_connection_and_channel(Conn, Chan),
-    ok.
-
-multinode_test(Config) ->
-    {Conn, Chan} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 1),
-
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = make_exchange_name(Config, "1"),
-                            type = <<"x-recent-history">>,
-                            auto_delete = false
-                           }),
-
-    #'queue.declare_ok'{queue = Q} =
-        amqp_channel:call(Chan, #'queue.declare' {
-                                   queue     = <<"q">>
-                                  }),
-
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Chan, #'queue.bind' {
-                                   queue = Q,
-                                   exchange = make_exchange_name(Config, "1"),
-                                   routing_key = <<"">>
-                                  }),
-
-    amqp_channel:call(Chan, #'queue.delete' { queue = Q }),
-    rabbit_ct_client_helpers:close_connection_and_channel(Conn, Chan),
-
-    rabbit_ct_broker_helpers:restart_broker(Config, 1),
-
-    {Conn2, Chan2} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-
-    #'queue.declare_ok'{queue = Q2} =
-        amqp_channel:call(Chan2, #'queue.declare' {
-                                   queue     = <<"q2">>
-                                  }),
-
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Chan2, #'queue.bind' {
-                                   queue = Q2,
-                                   exchange = make_exchange_name(Config, "1"),
-                                   routing_key = <<"">>
-                                  }),
-
-    amqp_channel:call(Chan2, #'exchange.delete' { exchange = make_exchange_name(Config, "2") }),
-    amqp_channel:call(Chan2, #'queue.delete' { queue = Q2 }),
-
-    rabbit_ct_client_helpers:close_connection_and_channel(Conn2, Chan2),
-    ok.
-
-test0(Config, MakeMethod, MakeMsg, DeclareArgs, Queues, MsgCount, ExpectedCount) ->
-    Chan = rabbit_ct_client_helpers:open_channel(Config),
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = make_exchange_name(Config, "0"),
-                            type = <<"x-recent-history">>,
-                            auto_delete = true,
-                            arguments = DeclareArgs
-                           }),
-
-    #'tx.select_ok'{} = amqp_channel:call(Chan, #'tx.select'{}),
-    [amqp_channel:call(Chan,
-                       MakeMethod(),
-                       MakeMsg()) || _ <- lists:duplicate(MsgCount, const)],
-    amqp_channel:call(Chan, #'tx.commit'{}),
-
-    [#'queue.declare_ok'{} =
-         amqp_channel:call(Chan, #'queue.declare' {
-                             queue = Q, exclusive = true }) || Q <- Queues],
-
-    [#'queue.bind_ok'{} =
-         amqp_channel:call(Chan, #'queue.bind' { queue = Q,
-                                                 exchange = make_exchange_name(Config, "0"),
-                                                 routing_key = <<"">>})
-     || Q <- Queues],
-
-    Counts =
-        [begin
-            #'queue.declare_ok'{message_count = M} =
-                 amqp_channel:call(Chan, #'queue.declare' {queue     = Q,
-                                                           exclusive = true }),
-             M
-         end || Q <- Queues],
-
-    ?assertEqual(ExpectedCount, lists:sum(Counts)),
-
-    amqp_channel:call(Chan, #'exchange.delete' { exchange = make_exchange_name(Config, "0") }),
-    [amqp_channel:call(Chan, #'queue.delete' { queue = Q }) || Q <- Queues],
-    rabbit_ct_client_helpers:close_channel(Chan),
-
-    ok.
-
-wrong_argument_type_test0(Config, Length) ->
-    Conn = rabbit_ct_client_helpers:open_unmanaged_connection(Config),
-    Chan = amqp_connection:open_channel(Conn),
-    DeclareArgs = [{<<"x-recent-history-length">>, long, Length}],
-    process_flag(trap_exit, true),
-    ?assertExit(_, amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = make_exchange_name(Config, "0"),
-                            type = <<"x-recent-history">>,
-                            auto_delete = true,
-                            arguments = DeclareArgs
-                            })),
-    amqp_connection:close(Conn),
-    ok.
-
-qs() ->
-    [<<"q0">>, <<"q1">>, <<"q2">>, <<"q3">>].
-
-make_exchange_name(Config, Suffix) ->
-    B = rabbit_ct_helpers:get_config(Config, test_resource_name),
-    erlang:list_to_binary("x-" ++ B ++ "-" ++ Suffix).
diff --git a/rabbitmq-server/deps/rabbitmq_sharding/build.config b/rabbitmq-server/deps/rabbitmq_sharding/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_sharding/erlang.mk b/rabbitmq-server/deps/rabbitmq_sharding/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_sharding/other_plugins b/rabbitmq-server/deps/rabbitmq_sharding/other_plugins
deleted file mode 100644 (file)
index 215e3fe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-[amqp_client,rabbitmq_consistent_hash_exchange,rabbitmq_sharding,random_exchange].
diff --git a/rabbitmq-server/deps/rabbitmq_sharding/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_sharding/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_sharding/test/src/rabbit_hash_exchange_SUITE.erl b/rabbitmq-server/deps/rabbitmq_sharding/test/src/rabbit_hash_exchange_SUITE.erl
deleted file mode 100644 (file)
index 82ee011..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Sharding Plugin
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_hash_exchange_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                routed_to_zero_queue_test,
-                                routed_to_one_queue_test,
-                                routed_to_many_queue_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    TestCaseName = rabbit_ct_helpers:config_to_testcase_name(Config, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, {test_resource_name,
-                                                    re:replace(TestCaseName, "/", "-", [global, {return, list}])}),
-    rabbit_ct_helpers:testcase_started(Config1, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Test cases
-%% -------------------------------------------------------------------
-
-routed_to_zero_queue_test(Config) ->
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = make_exchange_name(Config, "0"), routing_key = rnd()}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{}, payload = <<>>}
-          end, [], 5, 0),
-
-    passed.
-
-routed_to_one_queue_test(Config) ->
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = make_exchange_name(Config, "0"), routing_key = rnd()}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{}, payload = <<>>}
-          end, [<<"q1">>, <<"q2">>, <<"q3">>], 1, 1),
-
-    passed.
-
-routed_to_many_queue_test(Config) ->
-    test0(Config, fun () ->
-                  #'basic.publish'{exchange = make_exchange_name(Config, "0"), routing_key = rnd()}
-          end,
-          fun() ->
-                  #amqp_msg{props = #'P_basic'{}, payload = <<>>}
-          end, [<<"q1">>, <<"q2">>, <<"q3">>], 5, 5),
-
-    passed.
-
-test0(Config, MakeMethod, MakeMsg, Queues, MsgCount, Count) ->
-    {Conn, Chan} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    E = make_exchange_name(Config, "0"),
-
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Chan,
-                          #'exchange.declare' {
-                            exchange = E,
-                            type = <<"x-modulus-hash">>,
-                            auto_delete = true
-                           }),
-    [#'queue.declare_ok'{} =
-         amqp_channel:call(Chan, #'queue.declare' {
-                             queue = Q, exclusive = true }) || Q <- Queues],
-    [#'queue.bind_ok'{} =
-         amqp_channel:call(Chan, #'queue.bind'{queue = Q,
-                                               exchange = E,
-                                               routing_key = <<"">>})
-     || Q <- Queues],
-
-    amqp_channel:call(Chan, #'confirm.select'{}),
-
-    [amqp_channel:call(Chan,
-                       MakeMethod(),
-                       MakeMsg()) || _ <- lists:duplicate(MsgCount, const)],
-
-    % ensure that the messages have been delivered to the queues before asking
-    % for the message count
-    amqp_channel:wait_for_confirms_or_die(Chan),
-
-    Counts =
-        [begin
-             #'queue.declare_ok'{message_count = M} =
-                 amqp_channel:call(Chan, #'queue.declare' {queue     = Q,
-                                                           exclusive = true }),
-             M
-         end || Q <- Queues],
-
-    ?assertEqual(Count, lists:sum(Counts)),
-
-    amqp_channel:call(Chan, #'exchange.delete' { exchange = E }),
-    [amqp_channel:call(Chan, #'queue.delete' { queue = Q }) || Q <- Queues],
-
-    rabbit_ct_client_helpers:close_connection_and_channel(Conn, Chan),
-    ok.
-
-rnd() ->
-    list_to_binary(integer_to_list(rand_compat:uniform(1000000))).
-
-make_exchange_name(Config, Suffix) ->
-    B = rabbit_ct_helpers:get_config(Config, test_resource_name),
-    erlang:list_to_binary("x-" ++ B ++ "-" ++ Suffix).
diff --git a/rabbitmq-server/deps/rabbitmq_sharding/test/src/rabbit_sharding_SUITE.erl b/rabbitmq-server/deps/rabbitmq_sharding/test/src/rabbit_sharding_SUITE.erl
deleted file mode 100644 (file)
index 20e9b35..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Sharding Plugin
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_sharding_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--define(TEST_X, <<"sharding.test">>).
-
--import(rabbit_sharding_util, [a2b/1, exchange_bin/1]).
--import(rabbit_ct_broker_helpers, [set_parameter/5, clear_parameter/4,
-                                   set_policy/6, clear_policy/3]).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                shard_empty_routing_key_test,
-                                shard_queue_creation_test,
-                                shard_queue_creation2_test,
-                                shard_update_spn_test,
-                                shard_decrease_spn_keep_queues_test,
-                                shard_update_routing_key_test,
-                                shard_basic_consume_interceptor_test,
-                                shard_auto_scale_cluster_test,
-                                queue_declare_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    inets:start(),
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_nodes_count,     2}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    TestCaseName = rabbit_ct_helpers:config_to_testcase_name(Config, Testcase),
-    rabbit_ct_helpers:set_config(Config, {test_resource_name,
-                                          re:replace(TestCaseName, "/", "-", [global, {return, list}])}).
-
-end_per_testcase(_Testcase, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-shard_empty_routing_key_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3)),
-              timer:sleep(1000),
-              ?assertEqual(6, length(queues(Config, 0))),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 6}],
-                       [<<"3_shard">>])
-      end).
-
-shard_queue_creation_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-              ?assertEqual(6, length(queues(Config, 0))),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 6}],
-                       [<<"3_shard">>])
-      end).
-
-shard_queue_creation2_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-              ?assertEqual(0, length(queues(Config, 0))),
-
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-
-              ?assertEqual(6, length(queues(Config, 0))),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 6}],
-                       [<<"3_shard">>])
-      end).
-
-%% SPN = Shards Per Node
-shard_update_spn_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-              ?assertEqual(6, length(queues(Config, 0))),
-
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(5, <<"1234">>)),
-              ?assertEqual(10, length(queues(Config, 0))),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 5}],
-                       [<<"3_shard">>])
-      end).
-
-shard_decrease_spn_keep_queues_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(5, <<"1234">>)),
-              ?assertEqual(10, length(queues(Config, 0))),
-
-              set_policy(Config, 0, <<"3_shard">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-              ?assertEqual(10, length(queues(Config, 0))),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 5}],
-                       [<<"3_shard">>])
-      end).
-
-
-%% changes the routing key policy, therefore the queues should be
-%% unbound first and then bound with the new routing key.
-shard_update_routing_key_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-              set_policy(Config, 0, <<"rkey">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-              timer:sleep(1000),
-              Bs = bindings(Config, 0, ?TEST_X),
-
-              set_policy(Config, 0, <<"rkey">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"4321">>)),
-              timer:sleep(1000),
-              Bs2 = bindings(Config, 0, ?TEST_X),
-
-              ?assert(Bs =/= Bs2),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 1}],
-                       [<<"rkey">>])
-      end).
-
-%% tests that the interceptor returns queue names
-%% sorted by consumer count and then by queue index.
-shard_basic_consume_interceptor_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Sh = ?TEST_X,
-              amqp_channel:call(Ch, x_declare(Sh)),
-              set_policy(Config, 0, <<"three">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-
-              start_consumer(Ch, Sh),
-              assert_consumers(Config, Sh, 0, 1),
-              assert_consumers(Config, Sh, 1, 0),
-              assert_consumers(Config, Sh, 2, 0),
-
-              start_consumer(Ch, Sh),
-              assert_consumers(Config, Sh, 0, 1),
-              assert_consumers(Config, Sh, 1, 1),
-              assert_consumers(Config, Sh, 2, 0),
-
-              start_consumer(Ch, Sh),
-              assert_consumers(Config, Sh, 0, 1),
-              assert_consumers(Config, Sh, 1, 1),
-              assert_consumers(Config, Sh, 2, 1),
-
-              start_consumer(Ch, Sh),
-              assert_consumers(Config, Sh, 0, 2),
-              assert_consumers(Config, Sh, 1, 1),
-              assert_consumers(Config, Sh, 2, 1),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 6}],
-                       [<<"three">>])
-      end).
-
-shard_auto_scale_cluster_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Sh = ?TEST_X,
-              amqp_channel:call(Ch, x_declare(Sh)),
-              set_policy(Config, 0, <<"three">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-
-              ?assertEqual(6, length(queues(Config, 0))),
-              Qs = queues(Config, 0),
-
-              ?assertEqual(6, length(Qs)),
-              Nodes = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-              ?assertEqual(Nodes, lists:usort(queue_nodes(Qs))),
-
-              rabbit_ct_broker_helpers:stop_broker(Config, 1),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 6}],
-                       [<<"three">>])
-      end).
-
-queue_declare_test(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, x_declare(?TEST_X)),
-              set_policy(Config, 0, <<"declare">>, <<"^sharding">>, <<"exchanges">>, policy_definition(3, <<"1234">>)),
-
-              Declare = #'queue.declare'{queue = <<"sharding.test">>,
-                                         auto_delete = false,
-                                         durable = true},
-
-              #'queue.declare_ok'{queue = Q} =
-                  amqp_channel:call(Ch, Declare),
-
-              ?assertEqual(Q, shard_q(Config, 0, xr(?TEST_X), 0)),
-
-              teardown(Config, Ch,
-                       [{?TEST_X, 6}],
-                       [<<"declare">>])
-      end).
-
-start_consumer(Ch, Shard) ->
-    amqp_channel:call(Ch, #'basic.consume'{queue = Shard}).
-
-assert_consumers(Config, Shard, QInd, Count) ->
-    Q0 = qr(shard_q(Config, 0, xr(Shard), QInd)),
-    [{consumers, C0}] = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_sharding_interceptor, consumer_count, [Q0]),
-    ?assertEqual(C0, Count).
-
-queues(Config, NodeIndex) ->
-    case rabbit_ct_broker_helpers:rpc(Config, NodeIndex, rabbit_amqqueue, list, [<<"/">>]) of
-        {badrpc, _} -> [];
-        Qs          -> Qs
-    end.
-
-bindings(Config, NodeIndex, XName) ->
-    case rabbit_ct_broker_helpers:rpc(Config, NodeIndex, rabbit_binding, list_for_source, [xr(XName)]) of
-        {badrpc, _} -> [];
-        Bs          -> Bs
-    end.
-
-with_ch(Config, Fun) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Fun(Ch),
-    rabbit_ct_client_helpers:close_connection_and_channel(Conn, Ch),
-    cleanup(Config, 0),
-    ok.
-
-cleanup(Config) ->
-    cleanup(Config, 0).
-cleanup(Config, NodeIndex) ->
-    [rabbit_ct_broker_helpers:rpc(Config, NodeIndex, rabbit_amqqueue, delete, [Q, false, false])
-     || Q <- queues(Config, 0)].
-
-teardown(Config, Ch, Xs, Policies) ->
-    [begin
-         amqp_channel:call(Ch, x_delete(XName)),
-         delete_queues(Config, Ch, XName, N)
-     end || {XName, N} <- Xs],
-    [clear_policy(Config, 0, Policy) || Policy <- Policies].
-
-delete_queues(Config, Ch, Name, N) ->
-    [amqp_channel:call(Ch, q_delete(Config, Name, QInd)) || QInd <- lists:seq(0, N-1)].
-
-x_declare(Name) -> x_declare(Name, <<"x-modulus-hash">>).
-
-x_declare(Name, Type) ->
-    #'exchange.declare'{exchange = Name,
-                        type     = Type,
-                        durable  = true}.
-
-x_delete(Name) ->
-    #'exchange.delete'{exchange = Name}.
-
-q_delete(Config, Name, QInd) ->
-    #'queue.delete'{queue = shard_q(Config, 0, xr(Name), QInd)}.
-
-shard_q(Config, NodeIndex, X, N) ->
-    rabbit_sharding_util:make_queue_name(
-      exchange_bin(X), a2b(rabbit_ct_broker_helpers:get_node_config(Config, NodeIndex, nodename)), N).
-
-policy_definition(SPN) ->
-    [{<<"shards-per-node">>, SPN}].
-
-policy_definition(SPN, RK) ->
-    [{<<"shards-per-node">>, SPN}, {<<"routing-key">>, RK}].
-
-queue_nodes(Qs) ->
-    [queue_node(Q) || Q <- Qs].
-
-queue_node(#amqqueue{pid = Pid}) ->
-    node(Pid).
-
-xr(Name) -> rabbit_misc:r(<<"/">>, exchange, Name).
-qr(Name) -> rabbit_misc:r(<<"/">>, queue, Name).
diff --git a/rabbitmq-server/deps/rabbitmq_shovel/Makefile b/rabbitmq-server/deps/rabbitmq_shovel/Makefile
deleted file mode 100644 (file)
index 7728a5a..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-PROJECT = rabbitmq_shovel
-
-DEPS = amqp_client
-TEST_DEPS += rabbit
-
-DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
-
-# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
-# reviewed and merged.
-
-ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
-ERLANG_MK_COMMIT = rabbitmq-tmp
-
-include rabbitmq-components.mk
-
-# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now.
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
-include erlang.mk
diff --git a/rabbitmq-server/deps/rabbitmq_shovel/build.config b/rabbitmq-server/deps/rabbitmq_shovel/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_shovel/erlang.mk b/rabbitmq-server/deps/rabbitmq_shovel/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_shovel/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_shovel/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_shovel/test/configuration_SUITE.erl b/rabbitmq-server/deps/rabbitmq_shovel/test/configuration_SUITE.erl
deleted file mode 100644 (file)
index 966c3f8..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2010-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(configuration_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(EXCHANGE,    <<"test_exchange">>).
--define(TO_SHOVEL,   <<"to_the_shovel">>).
--define(FROM_SHOVEL, <<"from_the_shovel">>).
--define(UNSHOVELLED, <<"unshovelled">>).
--define(SHOVELLED,   <<"shovelled">>).
--define(TIMEOUT,     1000).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-          zero_shovels,
-          invalid_configuration,
-          valid_configuration
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    Config2 = rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()),
-    ok = rabbit_ct_broker_helpers:rpc(Config2, 0,
-      application, stop, [rabbitmq_shovel]),
-    Config2.
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-zero_shovels(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, zero_shovels1, [Config]).
-
-zero_shovels1(_Config) ->
-    %% shovel can be started with zero shovels configured
-    ok = application:start(rabbitmq_shovel),
-    ok = application:stop(rabbitmq_shovel),
-    passed.
-
-invalid_configuration(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, invalid_configuration1, [Config]).
-
-invalid_configuration1(_Config) ->
-    %% various ways of breaking the config
-    require_list_of_shovel_configurations =
-        test_broken_shovel_configs(invalid_config),
-
-    require_list_of_shovel_configurations =
-        test_broken_shovel_configs([{test_shovel, invalid_shovel_config}]),
-
-    Config = [{sources, [{broker, "amqp://"}]},
-              {destinations, [{broker, "amqp://"}]},
-              {queue, <<"">>}],
-
-    {duplicate_shovel_definition, test_shovel} =
-        test_broken_shovel_configs(
-          [{test_shovel, Config}, {test_shovel, Config}]),
-
-    {invalid_parameters, [{invalid, invalid, invalid}]} =
-        test_broken_shovel_config([{invalid, invalid, invalid} | Config]),
-
-    {duplicate_parameters, [queue]} =
-        test_broken_shovel_config([{queue, <<"">>} | Config]),
-
-    {missing_parameters, Missing} =
-        test_broken_shovel_config([]),
-    [destinations, queue, sources] = lists:sort(Missing),
-
-    {unrecognised_parameters, [invalid]} =
-        test_broken_shovel_config([{invalid, invalid} | Config]),
-
-    {require_list, invalid} =
-        test_broken_shovel_sources(invalid),
-
-    {missing_endpoint_parameter, broker_or_brokers} =
-        test_broken_shovel_sources([]),
-
-    {expected_list, brokers, invalid} =
-        test_broken_shovel_sources([{brokers, invalid}]),
-
-    {expected_string_uri, 42} =
-        test_broken_shovel_sources([{brokers, [42]}]),
-
-    {{unexpected_uri_scheme, "invalid"}, "invalid://"} =
-        test_broken_shovel_sources([{broker, "invalid://"}]),
-
-    {{unable_to_parse_uri, no_scheme}, "invalid"} =
-        test_broken_shovel_sources([{broker, "invalid"}]),
-
-    {expected_list,declarations, invalid} =
-        test_broken_shovel_sources([{broker, "amqp://"},
-                                    {declarations, invalid}]),
-    {unknown_method_name, 42} =
-        test_broken_shovel_sources([{broker, "amqp://"},
-                                    {declarations, [42]}]),
-
-    {expected_method_field_list, 'queue.declare', 42} =
-        test_broken_shovel_sources([{broker, "amqp://"},
-                                    {declarations, [{'queue.declare', 42}]}]),
-
-    {unknown_fields, 'queue.declare', [invalid]} =
-        test_broken_shovel_sources(
-          [{broker, "amqp://"},
-           {declarations, [{'queue.declare', [invalid]}]}]),
-
-    {{invalid_amqp_params_parameter, heartbeat, "text",
-      [{"heartbeat", "text"}], {not_an_integer, "text"}}, _} =
-        test_broken_shovel_sources(
-          [{broker, "amqp://localhost/?heartbeat=text"}]),
-
-    {{invalid_amqp_params_parameter, username, "text",
-      [{"username", "text"}],
-      {parameter_unconfigurable_in_query, username, "text"}}, _} =
-        test_broken_shovel_sources([{broker, "amqp://?username=text"}]),
-
-    {invalid_parameter_value, prefetch_count,
-     {require_non_negative_integer, invalid}} =
-        test_broken_shovel_config([{prefetch_count, invalid} | Config]),
-
-    {invalid_parameter_value, ack_mode,
-     {ack_mode_value_requires_one_of,
-      {no_ack, on_publish, on_confirm}, invalid}} =
-        test_broken_shovel_config([{ack_mode, invalid} | Config]),
-
-    {invalid_parameter_value, queue,
-     {require_binary, invalid}} =
-        test_broken_shovel_config([{sources, [{broker, "amqp://"}]},
-                                   {destinations, [{broker, "amqp://"}]},
-                                   {queue, invalid}]),
-
-    {invalid_parameter_value, publish_properties,
-     {require_list, invalid}} =
-        test_broken_shovel_config([{publish_properties, invalid} | Config]),
-
-    {invalid_parameter_value, publish_properties,
-     {unexpected_fields, [invalid], _}} =
-        test_broken_shovel_config([{publish_properties, [invalid]} | Config]),
-
-    {{invalid_ssl_parameter, fail_if_no_peer_cert, "42", _,
-      {require_boolean, '42'}}, _} =
-        test_broken_shovel_sources([{broker, "amqps://username:password@host:5673/vhost?cacertfile=/path/to/cacert.pem&certfile=/path/to/certfile.pem&keyfile=/path/to/keyfile.pem&verify=verify_peer&fail_if_no_peer_cert=42"}]),
-
-    passed.
-
-test_broken_shovel_configs(Configs) ->
-    application:set_env(rabbitmq_shovel, shovels, Configs),
-    {error, {Error, _}} = application:start(rabbitmq_shovel),
-    Error.
-
-test_broken_shovel_config(Config) ->
-    {invalid_shovel_configuration, test_shovel, Error} =
-        test_broken_shovel_configs([{test_shovel, Config}]),
-    Error.
-
-test_broken_shovel_sources(Sources) ->
-    {invalid_parameter_value, sources, Error} =
-        test_broken_shovel_config([{sources, Sources},
-                                   {destinations, [{broker, "amqp://"}]},
-                                   {queue, <<"">>}]),
-    Error.
-
-valid_configuration(Config) ->
-    ok = setup_shovels(Config),
-
-    Chan = rabbit_ct_client_helpers:open_channel(Config, 0),
-
-    #'queue.declare_ok'{ queue = Q } =
-        amqp_channel:call(Chan, #'queue.declare' { exclusive = true }),
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Chan, #'queue.bind' { queue = Q, exchange = ?EXCHANGE,
-                                                routing_key = ?FROM_SHOVEL }),
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Chan, #'queue.bind' { queue = Q, exchange = ?EXCHANGE,
-                                                routing_key = ?TO_SHOVEL }),
-
-    #'basic.consume_ok'{ consumer_tag = CTag } =
-        amqp_channel:subscribe(Chan,
-                               #'basic.consume' { queue = Q, exclusive = true },
-                               self()),
-    receive
-        #'basic.consume_ok'{ consumer_tag = CTag } -> ok
-    after ?TIMEOUT -> throw(timeout_waiting_for_consume_ok)
-    end,
-
-    ok = amqp_channel:call(Chan,
-                           #'basic.publish' { exchange    = ?EXCHANGE,
-                                              routing_key = ?TO_SHOVEL },
-                           #amqp_msg { payload = <<42>>,
-                                       props   = #'P_basic' {
-                                         delivery_mode = 2,
-                                         content_type  = ?UNSHOVELLED }
-                                     }),
-
-    receive
-        {#'basic.deliver' { consumer_tag = CTag, delivery_tag = AckTag,
-                            routing_key = ?FROM_SHOVEL },
-         #amqp_msg { payload = <<42>>,
-                     props   = #'P_basic' { delivery_mode = 2,
-                                            content_type  = ?SHOVELLED,
-                                            headers       = [{<<"x-shovelled">>,
-                                                              _, _}]}
-                   }} ->
-            ok = amqp_channel:call(Chan, #'basic.ack'{ delivery_tag = AckTag })
-    after ?TIMEOUT -> throw(timeout_waiting_for_deliver1)
-    end,
-
-    [{test_shovel, static, {running, _Info}, _Time}] =
-        rabbit_ct_broker_helpers:rpc(Config, 0,
-          rabbit_shovel_status, status, []),
-
-    receive
-        {#'basic.deliver' { consumer_tag = CTag, delivery_tag = AckTag1,
-                            routing_key = ?TO_SHOVEL },
-         #amqp_msg { payload = <<42>>,
-                     props   = #'P_basic' { delivery_mode = 2,
-                                            content_type  = ?UNSHOVELLED }
-                   }} ->
-            ok = amqp_channel:call(Chan, #'basic.ack'{ delivery_tag = AckTag1 })
-    after ?TIMEOUT -> throw(timeout_waiting_for_deliver2)
-    end,
-
-    rabbit_ct_client_helpers:close_channel(Chan).
-
-setup_shovels(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, setup_shovels1, [Config]).
-
-setup_shovels1(Config) ->
-    Hostname = ?config(rmq_hostname, Config),
-    TcpPort = rabbit_ct_broker_helpers:get_node_config(Config, 0,
-      tcp_port_amqp),
-    %% a working config
-    application:set_env(
-      rabbitmq_shovel,
-      shovels,
-      [{test_shovel,
-        [{sources,
-          [{broker, rabbit_misc:format("amqp://~s:~b/%2f?heartbeat=5",
-                                       [Hostname, TcpPort])},
-           {declarations,
-            [{'queue.declare',    [exclusive, auto_delete]},
-             {'exchange.declare', [{exchange, ?EXCHANGE}, auto_delete]},
-             {'queue.bind',       [{queue, <<>>}, {exchange, ?EXCHANGE},
-                                   {routing_key, ?TO_SHOVEL}]}
-            ]}]},
-         {destinations,
-          [{broker, rabbit_misc:format("amqp://~s:~b/%2f",
-                                       [Hostname, TcpPort])}]},
-         {queue, <<>>},
-         {ack_mode, on_confirm},
-         {publish_fields, [{exchange, ?EXCHANGE}, {routing_key, ?FROM_SHOVEL}]},
-         {publish_properties, [{delivery_mode, 2},
-                               {cluster_id,    <<"my-cluster">>},
-                               {content_type,  ?SHOVELLED}]},
-         {add_forward_headers, true}
-        ]}],
-      infinity),
-
-    ok = application:start(rabbitmq_shovel),
-    await_running_shovel(test_shovel).
-
-await_running_shovel(Name) ->
-    case [N || {N, _, {running, _}, _}
-                      <- rabbit_shovel_status:status(),
-                         N =:= Name] of
-        [_] -> ok;
-        _   -> timer:sleep(100),
-               await_running_shovel(Name)
-    end.
diff --git a/rabbitmq-server/deps/rabbitmq_shovel/test/dynamic_SUITE.erl b/rabbitmq-server/deps/rabbitmq_shovel/test/dynamic_SUITE.erl
deleted file mode 100644 (file)
index 0a90284..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ Federation.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(dynamic_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-          simple,
-          set_properties,
-          exchange,
-          restart,
-          change_definition,
-          autodelete,
-          validation,
-          security_validation
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    Config2 = rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()),
-    Config2.
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-simple(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              set_param(Config,
-                        <<"test">>, [{<<"src-queue">>,  <<"src">>},
-                                     {<<"dest-queue">>, <<"dest">>}]),
-              publish_expect(Ch, <<>>, <<"src">>, <<"dest">>, <<"hello">>)
-      end).
-
-set_properties(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              Ps = [{<<"src-queue">>,      <<"src">>},
-                    {<<"dest-queue">>,     <<"dest">>},
-                    {<<"publish-properties">>, [{<<"cluster_id">>, <<"x">>}]}],
-              set_param(Config, <<"test">>, Ps),
-              #amqp_msg{props = #'P_basic'{cluster_id = Cluster}} =
-                  publish_expect(Ch, <<>>, <<"src">>, <<"dest">>, <<"hi">>),
-              <<"x">> = Cluster
-      end).
-
-exchange(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              amqp_channel:call(Ch, #'queue.declare'{queue   = <<"queue">>,
-                                                     durable = true}),
-              amqp_channel:call(
-                Ch, #'queue.bind'{queue       = <<"queue">>,
-                                  exchange    = <<"amq.topic">>,
-                                  routing_key = <<"test-key">>}),
-              set_param(Config,
-                        <<"test">>, [{<<"src-exchange">>,    <<"amq.direct">>},
-                                     {<<"src-exchange-key">>,<<"test-key">>},
-                                     {<<"dest-exchange">>,   <<"amq.topic">>}]),
-              publish_expect(Ch, <<"amq.direct">>, <<"test-key">>,
-                             <<"queue">>, <<"hello">>),
-              set_param(Config,
-                        <<"test">>, [{<<"src-exchange">>,     <<"amq.direct">>},
-                                     {<<"src-exchange-key">>, <<"test-key">>},
-                                     {<<"dest-exchange">>,    <<"amq.topic">>},
-                                     {<<"dest-exchange-key">>,<<"new-key">>}]),
-              publish(Ch, <<"amq.direct">>, <<"test-key">>, <<"hello">>),
-              expect_empty(Ch, <<"queue">>),
-              amqp_channel:call(
-                Ch, #'queue.bind'{queue       = <<"queue">>,
-                                  exchange    = <<"amq.topic">>,
-                                  routing_key = <<"new-key">>}),
-              publish_expect(Ch, <<"amq.direct">>, <<"test-key">>,
-                             <<"queue">>, <<"hello">>)
-      end).
-
-restart(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              set_param(Config,
-                        <<"test">>, [{<<"src-queue">>,  <<"src">>},
-                                     {<<"dest-queue">>, <<"dest">>}]),
-              %% The catch is because connections link to the shovel,
-              %% so one connection will die, kill the shovel, kill
-              %% the other connection, then we can't close it
-              Conns = rabbit_ct_broker_helpers:rpc(Config, 0,
-                rabbit_direct, list, []),
-              [catch amqp_connection:close(C) || C <- Conns],
-              publish_expect(Ch, <<>>, <<"src">>, <<"dest">>, <<"hello">>)
-      end).
-
-change_definition(Config) ->
-    with_ch(Config,
-      fun (Ch) ->
-              set_param(Config,
-                        <<"test">>, [{<<"src-queue">>,  <<"src">>},
-                                     {<<"dest-queue">>, <<"dest">>}]),
-              publish_expect(Ch, <<>>, <<"src">>, <<"dest">>, <<"hello">>),
-              set_param(Config,
-                        <<"test">>, [{<<"src-queue">>,  <<"src">>},
-                                     {<<"dest-queue">>, <<"dest2">>}]),
-              publish_expect(Ch, <<>>, <<"src">>, <<"dest2">>, <<"hello">>),
-              expect_empty(Ch, <<"dest">>),
-              clear_param(Config, <<"test">>),
-              publish_expect(Ch, <<>>, <<"src">>, <<"src">>, <<"hello">>),
-              expect_empty(Ch, <<"dest">>),
-              expect_empty(Ch, <<"dest2">>)
-      end).
-
-autodelete(Config) ->
-    autodelete_case(Config, {<<"on-confirm">>, <<"queue-length">>,  0, 100}),
-    autodelete_case(Config, {<<"on-confirm">>, 50,                 50,  50}),
-    autodelete_case(Config, {<<"on-publish">>, <<"queue-length">>,  0, 100}),
-    autodelete_case(Config, {<<"on-publish">>, 50,                 50,  50}),
-    %% no-ack is not compatible with explicit count
-    autodelete_case(Config, {<<"no-ack">>,     <<"queue-length">>,  0, 100}).
-
-autodelete_case(Config, Args) ->
-    with_ch(Config, autodelete_do(Config, Args)).
-
-autodelete_do(Config, {AckMode, After, ExpSrc, ExpDest}) ->
-    fun (Ch) ->
-            amqp_channel:call(Ch, #'confirm.select'{}),
-            amqp_channel:call(Ch, #'queue.declare'{queue = <<"src">>}),
-            publish_count(Ch, <<>>, <<"src">>, <<"hello">>, 100),
-            amqp_channel:wait_for_confirms(Ch),
-            set_param_nowait(Config,
-                             <<"test">>, [{<<"src-queue">>,    <<"src">>},
-                                          {<<"dest-queue">>,   <<"dest">>},
-                                          {<<"ack-mode">>,     AckMode},
-                                          {<<"delete-after">>, After}]),
-            await_autodelete(Config, <<"test">>),
-            expect_count(Ch, <<"src">>, <<"hello">>, ExpSrc),
-            expect_count(Ch, <<"dest">>, <<"hello">>, ExpDest)
-    end.
-
-validation(Config) ->
-    URIs = [{<<"src-uri">>,  <<"amqp://">>},
-            {<<"dest-uri">>, <<"amqp://">>}],
-
-    %% Need valid src and dest URIs
-    invalid_param(Config, []),
-    invalid_param(Config,
-                  [{<<"src-queue">>, <<"test">>},
-                   {<<"src-uri">>,   <<"derp">>},
-                   {<<"dest-uri">>,  <<"amqp://">>}]),
-    invalid_param(Config,
-                  [{<<"src-queue">>, <<"test">>},
-                   {<<"src-uri">>,   [<<"derp">>]},
-                   {<<"dest-uri">>,  <<"amqp://">>}]),
-    invalid_param(Config,
-                  [{<<"src-queue">>, <<"test">>},
-                   {<<"dest-uri">>,  <<"amqp://">>}]),
-
-    %% Also need src exchange or queue
-    invalid_param(Config,
-                  URIs),
-    valid_param(Config,
-                [{<<"src-exchange">>, <<"test">>} | URIs]),
-    QURIs =     [{<<"src-queue">>,    <<"test">>} | URIs],
-    valid_param(Config, QURIs),
-
-    %% But not both
-    invalid_param(Config,
-                  [{<<"src-exchange">>, <<"test">>} | QURIs]),
-
-    %% Check these are of right type
-    invalid_param(Config,
-                  [{<<"prefetch-count">>,  <<"three">>} | QURIs]),
-    invalid_param(Config,
-                  [{<<"reconnect-delay">>, <<"three">>} | QURIs]),
-    invalid_param(Config,
-                  [{<<"ack-mode">>,        <<"whenever">>} | QURIs]),
-    invalid_param(Config,
-                  [{<<"delete-after">>,    <<"whenever">>} | QURIs]),
-
-    %% Check properties have to look property-ish
-    invalid_param(Config,
-                  [{<<"publish-properties">>, [{<<"nonexistent">>, <<>>}]}]),
-    invalid_param(Config,
-                  [{<<"publish-properties">>, [{<<"cluster_id">>, 2}]}]),
-    invalid_param(Config,
-                  [{<<"publish-properties">>, <<"something">>}]),
-
-    %% Can't use explicit message count and no-ack together
-    invalid_param(Config,
-                  [{<<"delete-after">>,    1},
-                   {<<"ack-mode">>,        <<"no-ack">>} | QURIs]),
-    ok.
-
-security_validation(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, security_validation_add_user, []),
-
-    Qs = [{<<"src-queue">>, <<"test">>},
-          {<<"dest-queue">>, <<"test2">>}],
-
-    A = lookup_user(Config, <<"a">>),
-    valid_param(Config, [{<<"src-uri">>,  <<"amqp:///a">>},
-                 {<<"dest-uri">>, <<"amqp:///a">>} | Qs], A),
-    invalid_param(Config,
-                  [{<<"src-uri">>,  <<"amqp:///a">>},
-                   {<<"dest-uri">>, <<"amqp:///b">>} | Qs], A),
-    invalid_param(Config,
-                  [{<<"src-uri">>,  <<"amqp:///b">>},
-                   {<<"dest-uri">>, <<"amqp:///a">>} | Qs], A),
-
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, security_validation_remove_user, []),
-    ok.
-
-security_validation_add_user() ->
-    [begin
-         rabbit_vhost:add(U),
-         rabbit_auth_backend_internal:add_user(U, <<>>),
-         rabbit_auth_backend_internal:set_permissions(
-           U, U, <<".*">>, <<".*">>, <<".*">>)
-     end || U <- [<<"a">>, <<"b">>]],
-    ok.
-
-security_validation_remove_user() ->
-    [begin
-         rabbit_vhost:delete(U),
-         rabbit_auth_backend_internal:delete_user(U)
-     end || U <- [<<"a">>, <<"b">>]],
-    ok.
-
-%%----------------------------------------------------------------------------
-
-with_ch(Config, Fun) ->
-    Ch = rabbit_ct_client_helpers:open_channel(Config, 0),
-    Fun(Ch),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    cleanup(Config),
-    ok.
-
-publish(Ch, X, Key, Payload) when is_binary(Payload) ->
-    publish(Ch, X, Key, #amqp_msg{payload = Payload});
-
-publish(Ch, X, Key, Msg = #amqp_msg{}) ->
-    amqp_channel:cast(Ch, #'basic.publish'{exchange    = X,
-                                           routing_key = Key}, Msg).
-
-publish_expect(Ch, X, Key, Q, Payload) ->
-    publish(Ch, X, Key, Payload),
-    expect(Ch, Q, Payload).
-
-expect(Ch, Q, Payload) ->
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue  = Q,
-                                                no_ack = true}, self()),
-    CTag = receive
-        #'basic.consume_ok'{consumer_tag = CT} -> CT
-    end,
-    Msg = receive
-              {#'basic.deliver'{}, #amqp_msg{payload = Payload} = M} ->
-                  M
-          after 1000 ->
-                  exit({not_received, Payload})
-          end,
-    amqp_channel:call(Ch, #'basic.cancel'{consumer_tag = CTag}),
-    Msg.
-
-expect_empty(Ch, Q) ->
-    #'basic.get_empty'{} = amqp_channel:call(Ch, #'basic.get'{ queue = Q }).
-
-publish_count(Ch, X, Key, M, Count) ->
-    [publish(Ch, X, Key, M) || _ <- lists:seq(1, Count)].
-
-expect_count(Ch, Q, M, Count) ->
-    [expect(Ch, Q, M) || _ <- lists:seq(1, Count)],
-    expect_empty(Ch, Q).
-
-set_param(Config, Name, Value) ->
-    set_param_nowait(Config, Name, Value),
-    await_shovel(Config, Name).
-
-set_param_nowait(Config, Name, Value) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      rabbit_runtime_parameters, set, [
-        <<"/">>, <<"shovel">>, Name, [{<<"src-uri">>,  <<"amqp://">>},
-                                      {<<"dest-uri">>, [<<"amqp://">>]} |
-                                      Value], none]).
-
-invalid_param(Config, Value, User) ->
-    {error_string, _} = rabbit_ct_broker_helpers:rpc(Config, 0,
-      rabbit_runtime_parameters, set,
-      [<<"/">>, <<"shovel">>, <<"invalid">>, Value, User]).
-
-valid_param(Config, Value, User) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, valid_param1, [Config, Value, User]).
-
-valid_param1(_Config, Value, User) ->
-    ok = rabbit_runtime_parameters:set(
-           <<"/">>, <<"shovel">>, <<"a">>, Value, User),
-    ok = rabbit_runtime_parameters:clear(<<"/">>, <<"shovel">>, <<"a">>).
-
-invalid_param(Config, Value) -> invalid_param(Config, Value, none).
-valid_param(Config, Value) -> valid_param(Config, Value, none).
-
-lookup_user(Config, Name) ->
-    {ok, User} = rabbit_ct_broker_helpers:rpc(Config, 0,
-      rabbit_access_control, check_user_login, [Name, []]),
-    User.
-
-clear_param(Config, Name) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-      rabbit_runtime_parameters, clear, [<<"/">>, <<"shovel">>, Name]).
-
-cleanup(Config) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, cleanup1, [Config]).
-
-cleanup1(_Config) ->
-    [rabbit_runtime_parameters:clear(rabbit_misc:pget(vhost, P),
-                                     rabbit_misc:pget(component, P),
-                                     rabbit_misc:pget(name, P)) ||
-        P <- rabbit_runtime_parameters:list()],
-    [rabbit_amqqueue:delete(Q, false, false) || Q <- rabbit_amqqueue:list()].
-
-await_shovel(Config, Name) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, await_shovel1, [Config, Name]).
-
-await_shovel1(_Config, Name) ->
-    await(fun () -> lists:member(Name, shovels_from_status()) end).
-
-await_autodelete(Config, Name) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, await_autodelete1, [Config, Name]).
-
-await_autodelete1(_Config, Name) ->
-    await(fun () -> not lists:member(Name, shovels_from_parameters()) end),
-    await(fun () -> not lists:member(Name, shovels_from_status()) end).
-
-await(Pred) ->
-    case Pred() of
-        true  -> ok;
-        false -> timer:sleep(100),
-                 await(Pred)
-    end.
-
-shovels_from_status() ->
-    S = rabbit_shovel_status:status(),
-    [N || {{<<"/">>, N}, dynamic, {running, _}, _} <- S].
-
-shovels_from_parameters() ->
-    L = rabbit_runtime_parameters:list(<<"/">>, <<"shovel">>),
-    [rabbit_misc:pget(name, Shovel) || Shovel <- L].
diff --git a/rabbitmq-server/deps/rabbitmq_shovel_management/Makefile b/rabbitmq-server/deps/rabbitmq_shovel_management/Makefile
deleted file mode 100644 (file)
index 5063da2..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-PROJECT = rabbitmq_shovel_management
-
-DEPS = rabbitmq_management rabbitmq_shovel webmachine
-TEST_DEPS += rabbit
-
-DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
-
-# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
-# reviewed and merged.
-
-ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
-ERLANG_MK_COMMIT = rabbitmq-tmp
-
-include rabbitmq-components.mk
-
-# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now.
-TEST_DEPS := $(filter-out rabbitmq_test,$(TEST_DEPS))
-
-include erlang.mk
diff --git a/rabbitmq-server/deps/rabbitmq_shovel_management/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_shovel_management/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_shovel_management/test/http_SUITE.erl b/rabbitmq-server/deps/rabbitmq_shovel_management/test/http_SUITE.erl
deleted file mode 100644 (file)
index f71fd12..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2010-2014 GoPivotal, Inc.  All rights reserved.
-%%
-
--module(http_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("rabbitmq_management/include/rabbit_mgmt_test.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-          shovels,
-          dynamic_plugin_enable_disable
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1, [
-        fun configure_shovels/1,
-        fun start_inets/1
-      ] ++
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-configure_shovels(Config) ->
-    rabbit_ct_helpers:merge_app_env(Config,
-      {rabbitmq_shovel, [
-          {shovels,
-            [{'my-static',
-                [{sources, [
-                      {broker, "amqp://"},
-                      {declarations, [
-                          {'queue.declare', [{queue, <<"static">>}]}]}
-                    ]},
-                  {destinations, [{broker, "amqp://"}]},
-                  {queue, <<"static">>},
-                  {publish_fields, [
-                      {exchange, <<"">>},
-                      {routing_key, <<"static2">>}
-                    ]}
-                ]}
-            ]}
-        ]}).
-
-start_inets(Config) ->
-    ok = application:start(inets),
-    Config.
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-shovels(Config) ->
-    http_put(Config, "/users/admin",
-      [{password, <<"admin">>}, {tags, <<"administrator">>}], ?NO_CONTENT),
-    http_put(Config, "/users/mon",
-      [{password, <<"mon">>}, {tags, <<"monitoring">>}], ?NO_CONTENT),
-    http_put(Config, "/vhosts/v", none, ?NO_CONTENT),
-    Perms = [{configure, <<".*">>},
-             {write,     <<".*">>},
-             {read,      <<".*">>}],
-    http_put(Config, "/permissions/v/guest",  Perms, ?NO_CONTENT),
-    http_put(Config, "/permissions/v/admin",  Perms, ?NO_CONTENT),
-    http_put(Config, "/permissions/v/mon",    Perms, ?NO_CONTENT),
-
-    [http_put(Config, "/parameters/shovel/" ++ V ++ "/my-dynamic",
-              [{value, [{'src-uri', <<"amqp://">>},
-                        {'dest-uri', <<"amqp://">>},
-                        {'src-queue', <<"test">>},
-                        {'dest-queue', <<"test2">>}]}], ?NO_CONTENT)
-     || V <- ["%2f", "v"]],
-    Static = [{name,  <<"my-static">>},
-              {type,  <<"static">>}],
-    Dynamic1 = [{name,  <<"my-dynamic">>},
-                {vhost, <<"/">>},
-                {type,  <<"dynamic">>}],
-    Dynamic2 = [{name,  <<"my-dynamic">>},
-                {vhost, <<"v">>},
-                {type,  <<"dynamic">>}],
-    Assert = fun (Req, User, Res) ->
-                     assert_list(Res, http_get(Config, Req, User, User, ?OK))
-             end,
-    Assert("/shovels",     "guest", [Static, Dynamic1, Dynamic2]),
-    Assert("/shovels/%2f", "guest", [Dynamic1]),
-    Assert("/shovels/v",   "guest", [Dynamic2]),
-    Assert("/shovels",     "admin", [Static, Dynamic2]),
-    Assert("/shovels/%2f", "admin", []),
-    Assert("/shovels/v",   "admin", [Dynamic2]),
-    Assert("/shovels",     "mon", [Dynamic2]),
-    Assert("/shovels/%2f", "mon", []),
-    Assert("/shovels/v",   "mon", [Dynamic2]),
-
-    http_delete(Config, "/vhosts/v", ?NO_CONTENT),
-    http_delete(Config, "/users/admin", ?NO_CONTENT),
-    http_delete(Config, "/users/mon", ?NO_CONTENT),
-    ok.
-
-%% It's a bit arbitrary to be testing this here, but we want to be
-%% able to test that mgmt extensions can be started and stopped
-%% *somewhere*, and here is as good a place as any.
-dynamic_plugin_enable_disable(Config) ->
-    http_get(Config, "/shovels", ?OK),
-    rabbit_ct_broker_helpers:disable_plugin(Config, 0,
-      "rabbitmq_shovel_management"),
-    http_get(Config, "/shovels", ?NOT_FOUND),
-    http_get(Config, "/overview", ?OK),
-    rabbit_ct_broker_helpers:disable_plugin(Config, 0,
-      "rabbitmq_management"),
-    http_fail(Config, "/shovels"),
-    http_fail(Config, "/overview"),
-    rabbit_ct_broker_helpers:enable_plugin(Config, 0,
-      "rabbitmq_management"),
-    http_get(Config, "/shovels", ?NOT_FOUND),
-    http_get(Config, "/overview", ?OK),
-    rabbit_ct_broker_helpers:enable_plugin(Config, 0,
-      "rabbitmq_shovel_management"),
-    http_get(Config, "/shovels", ?OK),
-    http_get(Config, "/overview", ?OK),
-    passed.
-
-%%---------------------------------------------------------------------------
-%% TODO this is mostly copypasta from the mgmt tests
-
-http_get(Config, Path) ->
-    http_get(Config, Path, ?OK).
-
-http_get(Config, Path, CodeExp) ->
-    http_get(Config, Path, "guest", "guest", CodeExp).
-
-http_get(Config, Path, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, get, Path, [auth_header(User, Pass)]),
-    assert_code(CodeExp, CodeAct, "GET", Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-http_fail(Config, Path) ->
-    {error, {failed_connect, _}} = req(Config, get, Path, []).
-
-http_put(Config, Path, List, CodeExp) ->
-    http_put_raw(Config, Path, format_for_upload(List), CodeExp).
-
-http_put(Config, Path, List, User, Pass, CodeExp) ->
-    http_put_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp).
-
-http_post(Config, Path, List, CodeExp) ->
-    http_post_raw(Config, Path, format_for_upload(List), CodeExp).
-
-http_post(Config, Path, List, User, Pass, CodeExp) ->
-    http_post_raw(Config, Path, format_for_upload(List), User, Pass, CodeExp).
-
-format_for_upload(none) ->
-    <<"">>;
-format_for_upload(List) ->
-    iolist_to_binary(mochijson2:encode({struct, List})).
-
-http_put_raw(Config, Path, Body, CodeExp) ->
-    http_upload_raw(Config, put, Path, Body, "guest", "guest", CodeExp).
-
-http_put_raw(Config, Path, Body, User, Pass, CodeExp) ->
-    http_upload_raw(Config, put, Path, Body, User, Pass, CodeExp).
-
-http_post_raw(Config, Path, Body, CodeExp) ->
-    http_upload_raw(Config, post, Path, Body, "guest", "guest", CodeExp).
-
-http_post_raw(Config, Path, Body, User, Pass, CodeExp) ->
-    http_upload_raw(Config, post, Path, Body, User, Pass, CodeExp).
-
-http_upload_raw(Config, Type, Path, Body, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, Type, Path, [auth_header(User, Pass)], Body),
-    assert_code(CodeExp, CodeAct, Type, Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-http_delete(Config, Path, CodeExp) ->
-    http_delete(Config, Path, "guest", "guest", CodeExp).
-
-http_delete(Config, Path, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, delete, Path, [auth_header(User, Pass)]),
-    assert_code(CodeExp, CodeAct, "DELETE", Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-assert_code(CodeExp, CodeAct, _Type, _Path, _Body) ->
-    ?assertEqual(CodeExp, CodeAct).
-
-req_uri(Config, Path) ->
-    rabbit_misc:format("~s/api~s", [
-        rabbit_ct_broker_helpers:node_uri(Config, 0, management),
-        Path
-      ]).
-
-req(Config, Type, Path, Headers) ->
-    httpc:request(Type,
-      {req_uri(Config, Path), Headers},
-      ?HTTPC_OPTS, []).
-
-req(Config, Type, Path, Headers, Body) ->
-    httpc:request(Type,
-      {req_uri(Config, Path), Headers, "application/json", Body},
-      ?HTTPC_OPTS, []).
-
-decode(?OK, _Headers,  ResBody) -> cleanup(mochijson2:decode(ResBody));
-decode(_,    Headers, _ResBody) -> Headers.
-
-cleanup(L) when is_list(L) ->
-    [cleanup(I) || I <- L];
-cleanup({struct, I}) ->
-    cleanup(I);
-cleanup({K, V}) when is_binary(K) ->
-    {list_to_atom(binary_to_list(K)), cleanup(V)};
-cleanup(I) ->
-    I.
-
-auth_header(Username, Password) ->
-    {"Authorization",
-     "Basic " ++ binary_to_list(base64:encode(Username ++ ":" ++ Password))}.
-
-assert_list(Exp, Act) ->
-    ?assertEqual(length(Exp), length(Act)),
-    [?assertEqual(1,
-        length(lists:filter(
-            fun(ActI) -> test_item(ExpI, ActI) end, Act)))
-      || ExpI <- Exp].
-
-assert_item(Exp, Act) ->
-    ?assertEqual([], test_item0(Exp, Act)).
-
-test_item(Exp, Act) ->
-    case test_item0(Exp, Act) of
-        [] -> true;
-        _  -> false
-    end.
-
-test_item0(Exp, Act) ->
-    [{did_not_find, ExpI, in, Act} || ExpI <- Exp,
-                                      not lists:member(ExpI, Act)].
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/build.config b/rabbitmq-server/deps/rabbitmq_stomp/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/erlang.mk b/rabbitmq-server/deps/rabbitmq_stomp/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_stomp/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/amqqueue_SUITE.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/amqqueue_SUITE.erl
deleted file mode 100644 (file)
index 300e86d..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(amqqueue_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include("rabbit_stomp.hrl").
--include("rabbit_stomp_frame.hrl").
--include("rabbit_stomp_headers.hrl").
-
--define(QUEUE, <<"TestQueue">>).
--define(DESTINATION, "/amq/queue/TestQueue").
-
-all() ->
-    [{group, list_to_atom("version_" ++ V)} || V <- ?SUPPORTED_VERSIONS].
-
-groups() ->
-    Tests = [
-        publish_no_dest_error,
-        publish_unauthorized_error,
-        subscribe_error,
-        subscribe,
-        unsubscribe_ack,
-        subscribe_ack,
-        send,
-        delete_queue_subscribe,
-        temp_destination_queue,
-        temp_destination_in_send,
-        blank_destination_in_send
-    ],
-
-    [{list_to_atom("version_" ++ V), [sequence], Tests}
-     || V <- ?SUPPORTED_VERSIONS].
-
-init_per_suite(Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config,
-                                           [{rmq_nodename_suffix, ?MODULE}]),
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(Group, Config) ->
-    Version = string:sub_string(atom_to_list(Group), 9),
-    rabbit_ct_helpers:set_config(Config, [{version, Version}]).
-
-end_per_group(_Group, Config) -> Config.
-
-init_per_testcase(TestCase, Config) ->
-    Version = ?config(version, Config),
-    StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
-    {ok, Connection} = amqp_connection:start(#amqp_params_direct{
-        node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename)
-    }),
-    {ok, Channel} = amqp_connection:open_channel(Connection),
-    {ok, Client} = rabbit_stomp_client:connect(Version, StompPort),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {amqp_connection, Connection},
-        {amqp_channel, Channel},
-        {stomp_client, Client}
-      ]),
-    init_per_testcase0(TestCase, Config1).
-
-end_per_testcase(TestCase, Config) ->
-    Connection = ?config(amqp_connection, Config),
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    rabbit_stomp_client:disconnect(Client),
-    amqp_channel:close(Channel),
-    amqp_connection:close(Connection),
-    end_per_testcase0(TestCase, Config).
-
-init_per_testcase0(publish_unauthorized_error, Config) ->
-    Channel = ?config(amqp_channel, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = <<"RestrictedQueue">>,
-                                                    auto_delete = true}),
-
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, add_user, [<<"user">>, <<"pass">>]),
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, set_permissions, [
-        <<"user">>, <<"/">>, <<"nothing">>, <<"nothing">>, <<"nothing">>]),
-    Version = ?config(version, Config),
-    StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
-    {ok, ClientFoo} = rabbit_stomp_client:connect(Version, "user", "pass", StompPort),
-    rabbit_ct_helpers:set_config(Config, [{client_foo, ClientFoo}]);
-init_per_testcase0(_, Config) ->
-    Config.
-
-end_per_testcase0(publish_unauthorized_error, Config) ->
-    ClientFoo = ?config(client_foo, Config),
-    rabbit_stomp_client:disconnect(ClientFoo),
-    rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_auth_backend_internal, delete_user, [<<"user">>]),
-    Config;
-end_per_testcase0(_, Config) ->
-    Config.
-
-publish_no_dest_error(Config) ->
-    Client = ?config(stomp_client, Config),
-    rabbit_stomp_client:send(
-      Client, "SEND", [{"destination", "/exchange/non-existent"}], ["hello"]),
-    {ok, _Client1, Hdrs, _} = stomp_receive(Client, "ERROR"),
-    "not_found" = proplists:get_value("message", Hdrs),
-    ok.
-
-publish_unauthorized_error(Config) ->
-    ClientFoo = ?config(client_foo, Config),
-    rabbit_stomp_client:send(
-      ClientFoo, "SEND", [{"destination", "/amq/queue/RestrictedQueue"}], ["hello"]),
-    {ok, _Client1, Hdrs, _} = stomp_receive(ClientFoo, "ERROR"),
-    "access_refused" = proplists:get_value("message", Hdrs),
-    ok.
-
-subscribe_error(Config) ->
-    Client = ?config(stomp_client, Config),
-    %% SUBSCRIBE to missing queue
-    rabbit_stomp_client:send(
-      Client, "SUBSCRIBE", [{"destination", ?DESTINATION}]),
-    {ok, _Client1, Hdrs, _} = stomp_receive(Client, "ERROR"),
-    "not_found" = proplists:get_value("message", Hdrs),
-    ok.
-
-subscribe(Config) ->
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = ?QUEUE,
-                                                    auto_delete = true}),
-
-    %% subscribe and wait for receipt
-    rabbit_stomp_client:send(
-      Client, "SUBSCRIBE", [{"destination", ?DESTINATION}, {"receipt", "foo"}]),
-    {ok, Client1, _, _} = stomp_receive(Client, "RECEIPT"),
-
-    %% send from amqp
-    Method = #'basic.publish'{exchange = <<"">>, routing_key = ?QUEUE},
-
-    amqp_channel:call(Channel, Method, #amqp_msg{props = #'P_basic'{},
-                                                 payload = <<"hello">>}),
-
-    {ok, _Client2, _, [<<"hello">>]} = stomp_receive(Client1, "MESSAGE"),
-    ok.
-
-unsubscribe_ack(Config) ->
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    Version = ?config(version, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = ?QUEUE,
-                                                    auto_delete = true}),
-    %% subscribe and wait for receipt
-    rabbit_stomp_client:send(
-      Client, "SUBSCRIBE", [{"destination", ?DESTINATION},
-                            {"receipt", "rcpt1"},
-                            {"ack", "client"},
-                            {"id", "subscription-id"}]),
-    {ok, Client1, _, _} = stomp_receive(Client, "RECEIPT"),
-
-    %% send from amqp
-    Method = #'basic.publish'{exchange = <<"">>, routing_key = ?QUEUE},
-
-    amqp_channel:call(Channel, Method, #amqp_msg{props = #'P_basic'{},
-                                                 payload = <<"hello">>}),
-
-    {ok, Client2, Hdrs1, [<<"hello">>]} = stomp_receive(Client1, "MESSAGE"),
-
-    rabbit_stomp_client:send(
-      Client2, "UNSUBSCRIBE", [{"destination", ?DESTINATION},
-                              {"id", "subscription-id"}]),
-
-    rabbit_stomp_client:send(
-      Client2, "ACK", [{rabbit_stomp_util:ack_header_name(Version),
-                        proplists:get_value(
-                          rabbit_stomp_util:msg_header_name(Version), Hdrs1)},
-                       {"receipt", "rcpt2"}]),
-
-    {ok, _Client3, Hdrs2, _Body2} = stomp_receive(Client2, "ERROR"),
-    ?assertEqual("Subscription not found",
-                 proplists:get_value("message", Hdrs2)),
-    ok.
-
-subscribe_ack(Config) ->
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    Version = ?config(version, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = ?QUEUE,
-                                                    auto_delete = true}),
-
-    %% subscribe and wait for receipt
-    rabbit_stomp_client:send(
-      Client, "SUBSCRIBE", [{"destination", ?DESTINATION},
-                            {"receipt",     "foo"},
-                            {"ack",         "client"}]),
-    {ok, Client1, _, _} = stomp_receive(Client, "RECEIPT"),
-
-    %% send from amqp
-    Method = #'basic.publish'{exchange = <<"">>, routing_key = ?QUEUE},
-
-    amqp_channel:call(Channel, Method, #amqp_msg{props = #'P_basic'{},
-                                                 payload = <<"hello">>}),
-
-    {ok, _Client2, Headers, [<<"hello">>]} = stomp_receive(Client1, "MESSAGE"),
-    false = (Version == "1.2") xor proplists:is_defined(?HEADER_ACK, Headers),
-
-    MsgHeader = rabbit_stomp_util:msg_header_name(Version),
-    AckValue  = proplists:get_value(MsgHeader, Headers),
-    AckHeader = rabbit_stomp_util:ack_header_name(Version),
-
-    rabbit_stomp_client:send(Client, "ACK", [{AckHeader, AckValue}]),
-    #'basic.get_empty'{} =
-        amqp_channel:call(Channel, #'basic.get'{queue = ?QUEUE}),
-    ok.
-
-send(Config) ->
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = ?QUEUE,
-                                                    auto_delete = true}),
-
-    %% subscribe and wait for receipt
-    rabbit_stomp_client:send(
-      Client, "SUBSCRIBE", [{"destination", ?DESTINATION}, {"receipt", "foo"}]),
-    {ok, Client1, _, _} = stomp_receive(Client, "RECEIPT"),
-
-    %% send from stomp
-    rabbit_stomp_client:send(
-      Client1, "SEND", [{"destination", ?DESTINATION}], ["hello"]),
-
-    {ok, _Client2, _, [<<"hello">>]} = stomp_receive(Client1, "MESSAGE"),
-    ok.
-
-delete_queue_subscribe(Config) ->
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = ?QUEUE,
-                                                    auto_delete = true}),
-
-    %% subscribe and wait for receipt
-    rabbit_stomp_client:send(
-      Client, "SUBSCRIBE", [{"destination", ?DESTINATION}, {"receipt", "bah"}]),
-    {ok, Client1, _, _} = stomp_receive(Client, "RECEIPT"),
-
-    %% delete queue while subscribed
-    #'queue.delete_ok'{} =
-        amqp_channel:call(Channel, #'queue.delete'{queue = ?QUEUE}),
-
-    {ok, _Client2, Headers, _} = stomp_receive(Client1, "ERROR"),
-
-    ?DESTINATION = proplists:get_value("subscription", Headers),
-
-    % server closes connection
-    ok.
-
-temp_destination_queue(Config) ->
-    Channel = ?config(amqp_channel, Config),
-    Client = ?config(stomp_client, Config),
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = ?QUEUE,
-                                                    auto_delete = true}),
-    rabbit_stomp_client:send( Client, "SEND", [{"destination", ?DESTINATION},
-                                               {"reply-to", "/temp-queue/foo"}],
-                                              ["ping"]),
-    amqp_channel:call(Channel,#'basic.consume'{queue  = ?QUEUE, no_ack = true}),
-    receive #'basic.consume_ok'{consumer_tag = _Tag} -> ok end,
-    ReplyTo = receive {#'basic.deliver'{delivery_tag = _DTag},
-             #'amqp_msg'{payload = <<"ping">>,
-                         props   = #'P_basic'{reply_to = RT}}} -> RT
-    end,
-    ok = amqp_channel:call(Channel,
-                           #'basic.publish'{routing_key = ReplyTo},
-                           #amqp_msg{payload = <<"pong">>}),
-    {ok, _Client1, _, [<<"pong">>]} = stomp_receive(Client, "MESSAGE"),
-    ok.
-
-temp_destination_in_send(Config) ->
-    Client = ?config(stomp_client, Config),
-    rabbit_stomp_client:send( Client, "SEND", [{"destination", "/temp-queue/foo"}],
-                                              ["poing"]),
-    {ok, _Client1, Hdrs, _} = stomp_receive(Client, "ERROR"),
-    "Invalid destination" = proplists:get_value("message", Hdrs),
-    ok.
-
-blank_destination_in_send(Config) ->
-    Client = ?config(stomp_client, Config),
-    rabbit_stomp_client:send( Client, "SEND", [{"destination", ""}],
-                                              ["poing"]),
-    {ok, _Client1, Hdrs, _} = stomp_receive(Client, "ERROR"),
-    "Invalid destination" = proplists:get_value("message", Hdrs),
-    ok.
-
-stomp_receive(Client, Command) ->
-    {#stomp_frame{command     = Command,
-                  headers     = Hdrs,
-                  body_iolist = Body},   Client1} =
-    rabbit_stomp_client:recv(Client),
-    {ok, Client1, Hdrs, Body}.
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/connections_SUITE.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/connections_SUITE.erl
deleted file mode 100644 (file)
index 1971c54..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(connections_SUITE).
--compile(export_all).
-
--import(rabbit_misc, [pget/2]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include("rabbit_stomp_frame.hrl").
--define(DESTINATION, "/queue/bulk-test").
-
-all() ->
-    [
-        messages_not_dropped_on_disconnect,
-        direct_client_connections_are_not_leaked
-    ].
-
-init_per_suite(Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config,
-                                           [{rmq_nodename_suffix, ?MODULE}]),
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps()).
-
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
--define(GARBAGE, <<"bdaf63dda9d78b075c748b740e7c3510ad203b07\nbdaf63dd">>).
-
-count_connections(Config) ->
-    StompPort = get_stomp_port(Config),
-    %% The default port is 61613 but it's in the middle of the ephemeral
-    %% ports range on many operating systems. Therefore, there is a
-    %% chance this port is already in use. Let's use a port close to the
-    %% AMQP default port.
-    IPv4Count = try
-        %% Count IPv4 connections. On some platforms, the IPv6 listener
-        %% implicitely listens to IPv4 connections too so the IPv4
-        %% listener doesn't exist. Thus this try/catch. This is the case
-        %% with Linux where net.ipv6.bindv6only is disabled (default in
-        %% most cases).
-        rpc_count_connections(Config, {acceptor, {0,0,0,0}, StompPort})
-    catch
-        _:{badarg, _} -> 0;
-        _:Other -> exit({foo, Other})
-    end,
-    IPv6Count = try
-        %% Count IPv6 connections. We also use a try/catch block in case
-        %% the host is not configured for IPv6.
-        rpc_count_connections(Config, {acceptor, {0,0,0,0,0,0,0,0}, StompPort})
-    catch
-        _:{badarg, _} -> 0;
-        _:Other1 -> exit({foo, Other1})
-    end,
-    IPv4Count + IPv6Count.
-
-rpc_count_connections(Config, ConnSpec) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-                                 ranch_server, count_connections, [ConnSpec]).
-
-direct_client_connections_are_not_leaked(Config) ->
-    StompPort = get_stomp_port(Config),
-    N = count_connections(Config),
-    lists:foreach(fun (_) ->
-                          {ok, Client = {Socket, _}} = rabbit_stomp_client:connect(StompPort),
-                          %% send garbage which trips up the parser
-                          gen_tcp:send(Socket, ?GARBAGE),
-                          rabbit_stomp_client:send(
-                           Client, "LOL", [{"", ""}])
-                  end,
-                  lists:seq(1, 100)),
-    timer:sleep(5000),
-    N = count_connections(Config),
-    ok.
-
-messages_not_dropped_on_disconnect(Config) ->
-    StompPort = get_stomp_port(Config),
-    N = count_connections(Config),
-    {ok, Client} = rabbit_stomp_client:connect(StompPort),
-    N1 = N + 1,
-    N1 = count_connections(Config),
-    [rabbit_stomp_client:send(
-       Client, "SEND", [{"destination", ?DESTINATION}],
-       [integer_to_list(Count)]) || Count <- lists:seq(1, 1000)],
-    rabbit_stomp_client:disconnect(Client),
-    QName = rabbit_misc:r(<<"/">>, queue, <<"bulk-test">>),
-    timer:sleep(3000),
-    N = count_connections(Config),
-    {ok, Q} = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_amqqueue, lookup, [QName]),
-    Messages = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_amqqueue, info, [Q, [messages]]),
-    1000 = pget(messages, Messages),
-    ok.
-
-get_stomp_port(Config) ->
-    rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp).
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/frame_SUITE.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/frame_SUITE.erl
deleted file mode 100644 (file)
index 006d3b6..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(frame_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include("rabbit_stomp_frame.hrl").
--include("rabbit_stomp_headers.hrl").
--compile(export_all).
-
-all() ->
-    [
-    parse_simple_frame,
-    parse_simple_frame_crlf,
-    parse_command_only,
-    parse_ignore_empty_frames,
-    parse_heartbeat_interframe,
-    parse_crlf_interframe,
-    parse_carriage_return_not_ignored_interframe,
-    parse_carriage_return_mid_command,
-    parse_carriage_return_end_command,
-    parse_resume_mid_command,
-    parse_resume_mid_header_key,
-    parse_resume_mid_header_val,
-    parse_resume_mid_body,
-    parse_no_header_stripping,
-    parse_multiple_headers,
-    header_no_colon,
-    no_nested_escapes,
-    header_name_with_cr,
-    header_value_with_cr,
-    header_value_with_colon,
-    headers_escaping_roundtrip,
-    headers_escaping_roundtrip_without_trailing_lf
-    ].
-
-parse_simple_frame(_) ->
-    parse_simple_frame_gen("\n").
-
-parse_simple_frame_crlf(_) ->
-    parse_simple_frame_gen("\r\n").
-
-parse_simple_frame_gen(Term) ->
-    Headers = [{"header1", "value1"}, {"header2", "value2"}],
-    Content = frame_string("COMMAND",
-                           Headers,
-                           "Body Content",
-                           Term),
-    {"COMMAND", Frame, _State} = parse_complete(Content),
-    [?assertEqual({ok, Value},
-                  rabbit_stomp_frame:header(Frame, Key)) ||
-        {Key, Value} <- Headers],
-    #stomp_frame{body_iolist = Body} = Frame,
-    ?assertEqual(<<"Body Content">>, iolist_to_binary(Body)).
-
-parse_command_only(_) ->
-    {ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("COMMAND\n\n\0").
-
-parse_ignore_empty_frames(_) ->
-    {ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("\0\0COMMAND\n\n\0").
-
-parse_heartbeat_interframe(_) ->
-    {ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("\nCOMMAND\n\n\0").
-
-parse_crlf_interframe(_) ->
-    {ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse("\r\nCOMMAND\n\n\0").
-
-parse_carriage_return_not_ignored_interframe(_) ->
-    {error, {unexpected_chars_between_frames, "\rC"}} = parse("\rCOMMAND\n\n\0").
-
-parse_carriage_return_mid_command(_) ->
-    {error, {unexpected_chars_in_command, "\rA"}} = parse("COMM\rAND\n\n\0").
-
-parse_carriage_return_end_command(_) ->
-    {error, {unexpected_chars_in_command, "\r\r"}} = parse("COMMAND\r\r\n\n\0").
-
-parse_resume_mid_command(_) ->
-    First = "COMM",
-    Second = "AND\n\n\0",
-    {more, Resume} = parse(First),
-    {ok, #stomp_frame{command = "COMMAND"}, _Rest} = parse(Second, Resume).
-
-parse_resume_mid_header_key(_) ->
-    First = "COMMAND\nheade",
-    Second = "r1:value1\n\n\0",
-    {more, Resume} = parse(First),
-    {ok, Frame = #stomp_frame{command = "COMMAND"}, _Rest} =
-        parse(Second, Resume),
-    ?assertEqual({ok, "value1"},
-                 rabbit_stomp_frame:header(Frame, "header1")).
-
-parse_resume_mid_header_val(_) ->
-    First = "COMMAND\nheader1:val",
-    Second = "ue1\n\n\0",
-    {more, Resume} = parse(First),
-    {ok, Frame = #stomp_frame{command = "COMMAND"}, _Rest} =
-        parse(Second, Resume),
-    ?assertEqual({ok, "value1"},
-                 rabbit_stomp_frame:header(Frame, "header1")).
-
-parse_resume_mid_body(_) ->
-    First = "COMMAND\n\nABC",
-    Second = "DEF\0",
-    {more, Resume} = parse(First),
-    {ok, #stomp_frame{command = "COMMAND", body_iolist = Body}, _Rest} =
-         parse(Second, Resume),
-    ?assertEqual([<<"ABC">>, <<"DEF">>], Body).
-
-parse_no_header_stripping(_) ->
-    Content = "COMMAND\nheader: foo \n\n\0",
-    {ok, Frame, _} = parse(Content),
-    {ok, Val} = rabbit_stomp_frame:header(Frame, "header"),
-    ?assertEqual(" foo ", Val).
-
-parse_multiple_headers(_) ->
-    Content = "COMMAND\nheader:correct\nheader:incorrect\n\n\0",
-    {ok, Frame, _} = parse(Content),
-    {ok, Val} = rabbit_stomp_frame:header(Frame, "header"),
-    ?assertEqual("correct", Val).
-
-header_no_colon(_) ->
-    Content = "COMMAND\n"
-              "hdr1:val1\n"
-              "hdrerror\n"
-              "hdr2:val2\n"
-              "\n\0",
-    ?assertEqual(parse(Content), {error, {header_no_value, "hdrerror"}}).
-
-no_nested_escapes(_) ->
-    Content = "COM\\\\rAND\n"      % no escapes
-              "hdr\\\\rname:"      % one escape
-              "hdr\\\\rval\n\n\0", % one escape
-    {ok, Frame, _} = parse(Content),
-    ?assertEqual(Frame,
-                 #stomp_frame{command = "COM\\\\rAND",
-                              headers = [{"hdr\\rname", "hdr\\rval"}],
-                              body_iolist = []}).
-
-header_name_with_cr(_) ->
-    Content = "COMMAND\nhead\rer:val\n\n\0",
-    {error, {unexpected_chars_in_header, "\re"}} = parse(Content).
-
-header_value_with_cr(_) ->
-    Content = "COMMAND\nheader:val\rue\n\n\0",
-    {error, {unexpected_chars_in_header, "\ru"}} = parse(Content).
-
-header_value_with_colon(_) ->
-    Content = "COMMAND\nheader:val:ue\n\n\0",
-    {ok, Frame, _} = parse(Content),
-    ?assertEqual(Frame,
-                 #stomp_frame{ command     = "COMMAND",
-                               headers     = [{"header", "val:ue"}],
-                               body_iolist = []}).
-
-test_frame_serialization(Expected, TrailingLF) ->
-    {ok, Frame, _} = parse(Expected),
-    {ok, Val} = rabbit_stomp_frame:header(Frame, "head\r:\ner"),
-    ?assertEqual(":\n\r\\", Val),
-    Serialized = lists:flatten(rabbit_stomp_frame:serialize(Frame, TrailingLF)),
-    ?assertEqual(Expected, rabbit_misc:format("~s", [Serialized])).
-
-headers_escaping_roundtrip(_) ->
-    test_frame_serialization("COMMAND\nhead\\r\\c\\ner:\\c\\n\\r\\\\\n\n\0\n", true).
-
-headers_escaping_roundtrip_without_trailing_lf(_) ->
-    test_frame_serialization("COMMAND\nhead\\r\\c\\ner:\\c\\n\\r\\\\\n\n\0", false).
-
-parse(Content) ->
-    parse(Content, rabbit_stomp_frame:initial_state()).
-parse(Content, State) ->
-    rabbit_stomp_frame:parse(list_to_binary(Content), State).
-
-parse_complete(Content) ->
-    {ok, Frame = #stomp_frame{command = Command}, State} = parse(Content),
-    {Command, Frame, State}.
-
-frame_string(Command, Headers, BodyContent, Term) ->
-    HeaderString =
-        lists:flatten([Key ++ ":" ++ Value ++ Term || {Key, Value} <- Headers]),
-    Command ++ Term ++ HeaderString ++ Term ++ BodyContent ++ "\0" ++ "\n".
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE.erl
deleted file mode 100644 (file)
index b6098a3..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
--module(python_SUITE).
--compile(export_all).
--include_lib("common_test/include/ct.hrl").
-
-all() ->
-    [
-    common,
-    ssl,
-    connect_options
-    ].
-
-init_per_testcase(_, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config,
-                                           [{rmq_certspwd, "bunnychow"},
-                                            {rmq_nodename_suffix, ?MODULE}]),
-    rabbit_ct_helpers:log_environment(),
-    Config2 = rabbit_ct_helpers:run_setup_steps(
-        Config1,
-        rabbit_ct_broker_helpers:setup_steps()),
-    DataDir = ?config(data_dir, Config2),
-    PikaDir = filename:join([DataDir, "deps", "pika"]),
-    StomppyDir = filename:join([DataDir, "deps", "stomppy"]),
-    rabbit_ct_helpers:make(Config2, PikaDir, []),
-    rabbit_ct_helpers:make(Config2, StomppyDir, []),
-    Config2.
-
-end_per_testcase(_, Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-
-common(Config) ->
-    run(Config, filename:join("src", "test.py")).
-
-connect_options(Config) ->
-    run(Config, filename:join("src", "test_connect_options.py")).
-
-ssl(Config) ->
-    run(Config, filename:join("src", "test_ssl.py")).
-
-run(Config, Test) ->
-    DataDir = ?config(data_dir, Config),
-    CertsDir = rabbit_ct_helpers:get_config(Config, rmq_certsdir),
-    StompPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp),
-    StompPortTls = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stomp_tls),
-    AmqpPort = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp),
-    NodeName = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    PythonPath = os:getenv("PYTHONPATH"),
-    os:putenv("PYTHONPATH", filename:join([DataDir, "deps", "pika","pika"])
-                            ++":"++
-                            filename:join([DataDir, "deps", "stomppy", "stomppy"])
-                            ++ ":" ++
-                            PythonPath),
-    os:putenv("AMQP_PORT", integer_to_list(AmqpPort)),
-    os:putenv("STOMP_PORT", integer_to_list(StompPort)),
-    os:putenv("STOMP_PORT_TLS", integer_to_list(StompPortTls)),
-    os:putenv("RABBITMQ_NODENAME", atom_to_list(NodeName)),
-    os:putenv("SSL_CERTS_PATH", CertsDir),
-    {ok, _} = rabbit_ct_helpers:exec([filename:join(DataDir, Test)]).
-
-
-cur_dir() ->
-    {Src, _} = filename:find_src(?MODULE),
-    filename:dirname(Src).
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/ack.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/ack.py
deleted file mode 100644 (file)
index 6132e49..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-import unittest
-import stomp
-import base
-import time
-import os
-
-class TestAck(base.BaseTest):
-
-    def test_ack_client(self):
-        destination = "/queue/ack-test"
-
-        # subscribe and send message
-        self.listener.reset(2) ## expecting 2 messages
-        self.subscribe_dest(self.conn, destination, None,
-                            ack='client',
-                            headers={'prefetch-count': '10'})
-        self.conn.send(destination, "test1")
-        self.conn.send(destination, "test2")
-        self.assertTrue(self.listener.await(4), "initial message not received")
-        self.assertEquals(2, len(self.listener.messages))
-
-        # disconnect with no ack
-        self.conn.disconnect()
-
-        # now reconnect
-        conn2 = self.create_connection()
-        try:
-            listener2 = base.WaitableListener()
-            listener2.reset(2)
-            conn2.set_listener('', listener2)
-            self.subscribe_dest(conn2, destination, None,
-                                ack='client',
-                                headers={'prefetch-count': '10'})
-            self.assertTrue(listener2.await(), "message not received again")
-            self.assertEquals(2, len(listener2.messages))
-
-            # now ack only the last message - expecting cumulative behaviour
-            mid = listener2.messages[1]['headers'][self.ack_id_source_header]
-            self.ack_message(conn2, mid, None)
-        finally:
-            conn2.disconnect()
-
-        # now reconnect again, shouldn't see the message
-        conn3 = self.create_connection()
-        try:
-            listener3 = base.WaitableListener()
-            conn3.set_listener('', listener3)
-            self.subscribe_dest(conn3, destination, None)
-            self.assertFalse(listener3.await(3),
-                             "unexpected message. ACK not working?")
-        finally:
-            conn3.disconnect()
-
-    def test_ack_client_individual(self):
-        destination = "/queue/ack-test-individual"
-
-        # subscribe and send message
-        self.listener.reset(2) ## expecting 2 messages
-        self.subscribe_dest(self.conn, destination, None,
-                            ack='client-individual',
-                            headers={'prefetch-count': '10'})
-        self.conn.send(destination, "test1")
-        self.conn.send(destination, "test2")
-        self.assertTrue(self.listener.await(4), "Both initial messages not received")
-        self.assertEquals(2, len(self.listener.messages))
-
-        # disconnect without acks
-        self.conn.disconnect()
-
-        # now reconnect
-        conn2 = self.create_connection()
-        try:
-            listener2 = base.WaitableListener()
-            listener2.reset(2) ## expect 2 messages
-            conn2.set_listener('', listener2)
-            self.subscribe_dest(conn2, destination, None,
-                                ack='client-individual',
-                                headers={'prefetch-count': '10'})
-            self.assertTrue(listener2.await(2.5), "Did not receive 2 messages")
-            self.assertEquals(2, len(listener2.messages), "Not exactly 2 messages received")
-
-            # now ack only the 'test2' message - expecting individual behaviour
-            nummsgs = len(listener2.messages)
-            mid = None
-            for ind in range(nummsgs):
-                if listener2.messages[ind]['message']=="test2":
-                    mid = listener2.messages[ind]['headers'][self.ack_id_source_header]
-                    self.assertEquals(1, ind, 'Expecting test2 to be second message')
-                    break
-            self.assertTrue(mid, "Did not find test2 message id.")
-            self.ack_message(conn2, mid, None)
-        finally:
-            conn2.disconnect()
-
-        # now reconnect again, shouldn't see the message
-        conn3 = self.create_connection()
-        try:
-            listener3 = base.WaitableListener()
-            listener3.reset(2) ## expecting a single message, but wait for two
-            conn3.set_listener('', listener3)
-            self.subscribe_dest(conn3, destination, None)
-            self.assertFalse(listener3.await(2.5),
-                             "Expected to see only one message. ACK not working?")
-            self.assertEquals(1, len(listener3.messages), "Expecting exactly one message")
-            self.assertEquals("test1", listener3.messages[0]['message'], "Unexpected message remains")
-        finally:
-            conn3.disconnect()
-
-    def test_ack_client_tx(self):
-        destination = "/queue/ack-test-tx"
-
-        # subscribe and send message
-        self.listener.reset()
-        self.subscribe_dest(self.conn, destination, None, ack='client')
-        self.conn.send(destination, "test")
-        self.assertTrue(self.listener.await(3), "initial message not received")
-        self.assertEquals(1, len(self.listener.messages))
-
-        # disconnect with no ack
-        self.conn.disconnect()
-
-        # now reconnect
-        conn2 = self.create_connection()
-        try:
-            tx = "abc"
-            listener2 = base.WaitableListener()
-            conn2.set_listener('', listener2)
-            conn2.begin(transaction=tx)
-            self.subscribe_dest(conn2, destination, None, ack='client')
-            self.assertTrue(listener2.await(), "message not received again")
-            self.assertEquals(1, len(listener2.messages))
-
-            # now ack
-            mid = listener2.messages[0]['headers'][self.ack_id_source_header]
-            self.ack_message(conn2, mid, None, transaction=tx)
-
-            #now commit
-            conn2.commit(transaction=tx)
-        finally:
-            conn2.disconnect()
-
-        # now reconnect again, shouldn't see the message
-        conn3 = self.create_connection()
-        try:
-            listener3 = base.WaitableListener()
-            conn3.set_listener('', listener3)
-            self.subscribe_dest(conn3, destination, None)
-            self.assertFalse(listener3.await(3),
-                             "unexpected message. TX ACK not working?")
-        finally:
-            conn3.disconnect()
-
-    def test_topic_prefetch(self):
-        destination = "/topic/prefetch-test"
-
-        # subscribe and send message
-        self.listener.reset(6) ## expect 6 messages
-        self.subscribe_dest(self.conn, destination, None,
-                            ack='client',
-                            headers={'prefetch-count': '5'})
-
-        for x in range(10):
-            self.conn.send(destination, "test" + str(x))
-
-        self.assertFalse(self.listener.await(3),
-                         "Should not have been able to see 6 messages")
-        self.assertEquals(5, len(self.listener.messages))
-
-    def test_nack(self):
-        destination = "/queue/nack-test"
-
-        #subscribe and send
-        self.subscribe_dest(self.conn, destination, None,
-                            ack='client-individual')
-        self.conn.send(destination, "nack-test")
-
-        self.assertTrue(self.listener.await(), "Not received message")
-        message_id = self.listener.messages[0]['headers'][self.ack_id_source_header]
-        self.listener.reset()
-
-        self.nack_message(self.conn, message_id, None)
-        self.assertTrue(self.listener.await(), "Not received message after NACK")
-        message_id = self.listener.messages[0]['headers'][self.ack_id_source_header]
-        self.ack_message(self.conn, message_id, None)
-
-    def test_nack_multi(self):
-        destination = "/queue/nack-multi"
-
-        self.listener.reset(2)
-
-        #subscribe and send
-        self.subscribe_dest(self.conn, destination, None,
-                            ack='client',
-                            headers = {'prefetch-count' : '10'})
-        self.conn.send(destination, "nack-test1")
-        self.conn.send(destination, "nack-test2")
-
-        self.assertTrue(self.listener.await(), "Not received messages")
-        message_id = self.listener.messages[1]['headers'][self.ack_id_source_header]
-        self.listener.reset(2)
-
-        self.nack_message(self.conn, message_id, None)
-        self.assertTrue(self.listener.await(), "Not received message again")
-        message_id = self.listener.messages[1]['headers'][self.ack_id_source_header]
-        self.ack_message(self.conn, message_id, None)
-
-    def test_nack_without_requeueing(self):
-        destination = "/queue/nack-test-no-requeue"
-
-        self.subscribe_dest(self.conn, destination, None,
-                            ack='client-individual')
-        self.conn.send(destination, "nack-test")
-
-        self.assertTrue(self.listener.await(), "Not received message")
-        message_id = self.listener.messages[0]['headers'][self.ack_id_source_header]
-        self.listener.reset()
-
-        self.conn.send_frame("NACK", {self.ack_id_header: message_id, "requeue": False})
-        self.assertFalse(self.listener.await(4), "Received message after NACK with requeue = False")
-
-class TestAck11(TestAck):
-
-   def create_connection_obj(self, version='1.1', vhost='/', heartbeats=(0, 0)):
-       conn = stomp.StompConnection11(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))],
-                                      vhost=vhost,
-                                      heartbeats=heartbeats)
-       self.ack_id_source_header = 'message-id'
-       self.ack_id_header = 'message-id'
-       return conn
-
-   def test_version(self):
-       self.assertEquals('1.1', self.conn.version)
-
-class TestAck12(TestAck):
-
-   def create_connection_obj(self, version='1.2', vhost='/', heartbeats=(0, 0)):
-       conn = stomp.StompConnection12(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))],
-                                      vhost=vhost,
-                                      heartbeats=heartbeats)
-       self.ack_id_source_header = 'ack'
-       self.ack_id_header = 'id'
-       return conn
-
-   def test_version(self):
-       self.assertEquals('1.2', self.conn.version)
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/base.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/base.py
deleted file mode 100644 (file)
index 134f5c4..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-import unittest
-import stomp
-import sys
-import threading
-import os
-
-
-class BaseTest(unittest.TestCase):
-
-   def create_connection_obj(self, version='1.0', vhost='/', heartbeats=(0, 0)):
-       if version == '1.0':
-           conn = stomp.StompConnection10(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))])
-           self.ack_id_source_header = 'message-id'
-           self.ack_id_header = 'message-id'
-       elif version == '1.1':
-           conn = stomp.StompConnection11(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))],
-                                          vhost=vhost,
-                                          heartbeats=heartbeats)
-           self.ack_id_source_header = 'message-id'
-           self.ack_id_header = 'message-id'
-       elif version == '1.2':
-           conn = stomp.StompConnection12(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))],
-                                          vhost=vhost,
-                                          heartbeats=heartbeats)
-           self.ack_id_source_header = 'ack'
-           self.ack_id_header = 'id'
-       else:
-           conn = stomp.StompConnection12(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))],
-                                          vhost=vhost,
-                                          heartbeats=heartbeats)
-           conn.version = version
-       return conn
-
-   def create_connection(self, user='guest', passcode='guest', wait=True, **kwargs):
-       conn = self.create_connection_obj(**kwargs)
-       conn.start()
-       conn.connect(user, passcode, wait=wait)
-       return conn
-
-   def subscribe_dest(self, conn, destination, sub_id, **kwargs):
-       if type(conn) is stomp.StompConnection10:
-           # 'id' is optional in STOMP 1.0.
-           if sub_id != None:
-               kwargs['id'] = sub_id
-           conn.subscribe(destination, **kwargs)
-       else:
-           # 'id' is required in STOMP 1.1+.
-           if sub_id == None:
-               sub_id = 'ctag'
-           conn.subscribe(destination, sub_id, **kwargs)
-
-   def unsubscribe_dest(self, conn, destination, sub_id, **kwargs):
-       if type(conn) is stomp.StompConnection10:
-           # 'id' is optional in STOMP 1.0.
-           if sub_id != None:
-               conn.unsubscribe(id=sub_id, **kwargs)
-           else:
-               conn.unsubscribe(destination=destination, **kwargs)
-       else:
-           # 'id' is required in STOMP 1.1+.
-           if sub_id == None:
-               sub_id = 'ctag'
-           conn.unsubscribe(sub_id, **kwargs)
-
-   def ack_message(self, conn, msg_id, sub_id, **kwargs):
-       if type(conn) is stomp.StompConnection10:
-           conn.ack(msg_id, **kwargs)
-       elif type(conn) is stomp.StompConnection11:
-           if sub_id == None:
-               sub_id = 'ctag'
-           conn.ack(msg_id, sub_id, **kwargs)
-       elif type(conn) is stomp.StompConnection12:
-           conn.ack(msg_id, **kwargs)
-
-   def nack_message(self, conn, msg_id, sub_id, **kwargs):
-       if type(conn) is stomp.StompConnection10:
-           # Normally unsupported by STOMP 1.0.
-           conn.send_frame("NACK", {"message-id": msg_id})
-       elif type(conn) is stomp.StompConnection11:
-           if sub_id == None:
-               sub_id = 'ctag'
-           conn.nack(msg_id, sub_id, **kwargs)
-       elif type(conn) is stomp.StompConnection12:
-           conn.nack(msg_id, **kwargs)
-
-   def create_subscriber_connection(self, dest):
-       conn = self.create_connection()
-       listener = WaitableListener()
-       conn.set_listener('', listener)
-       self.subscribe_dest(conn, dest, None, receipt="sub.receipt")
-       listener.await()
-       self.assertEquals(1, len(listener.receipts))
-       listener.reset()
-       return conn, listener
-
-   def setUp(self):
-        self.conn = self.create_connection()
-        self.listener = WaitableListener()
-        self.conn.set_listener('', self.listener)
-
-   def tearDown(self):
-        if self.conn.is_connected():
-            self.conn.disconnect()
-            self.conn.stop()
-
-   def simple_test_send_rec(self, dest, route = None):
-        self.listener.reset()
-
-        self.subscribe_dest(self.conn, dest, None)
-        self.conn.send(dest, "foo")
-
-        self.assertTrue(self.listener.await(), "Timeout, no message received")
-
-        # assert no errors
-        if len(self.listener.errors) > 0:
-            self.fail(self.listener.errors[0]['message'])
-
-        # check header content
-        msg = self.listener.messages[0]
-        self.assertEquals("foo", msg['message'])
-        self.assertEquals(dest, msg['headers']['destination'])
-
-   def assertListener(self, errMsg, numMsgs=0, numErrs=0, numRcts=0, timeout=10):
-        if numMsgs + numErrs + numRcts > 0:
-            self._assertTrue(self.listener.await(timeout), errMsg + " (#awaiting)")
-        else:
-            self._assertFalse(self.listener.await(timeout), errMsg + " (#awaiting)")
-        self._assertEquals(numMsgs, len(self.listener.messages), errMsg + " (#messages)")
-        self._assertEquals(numErrs, len(self.listener.errors), errMsg + " (#errors)")
-        self._assertEquals(numRcts, len(self.listener.receipts), errMsg + " (#receipts)")
-
-   def _assertTrue(self, bool, msg):
-       if not bool:
-           self.listener.print_state(msg, True)
-           self.assertTrue(bool, msg)
-
-   def _assertFalse(self, bool, msg):
-       if bool:
-           self.listener.print_state(msg, True)
-           self.assertFalse(bool, msg)
-
-   def _assertEquals(self, expected, actual, msg):
-       if expected != actual:
-           self.listener.print_state(msg, True)
-           self.assertEquals(expected, actual, msg)
-
-   def assertListenerAfter(self, verb, errMsg="", numMsgs=0, numErrs=0, numRcts=0, timeout=5):
-        num = numMsgs + numErrs + numRcts
-        self.listener.reset(num if num>0 else 1)
-        verb()
-        self.assertListener(errMsg=errMsg, numMsgs=numMsgs, numErrs=numErrs, numRcts=numRcts, timeout=timeout)
-
-class WaitableListener(object):
-
-    def __init__(self):
-        self.debug = False
-        if self.debug:
-            print '(listener) init'
-        self.messages = []
-        self.errors = []
-        self.receipts = []
-        self.latch = Latch(1)
-        self.msg_no = 0
-
-    def _next_msg_no(self):
-        self.msg_no += 1
-        return self.msg_no
-
-    def _append(self, array, msg, hdrs):
-        mno = self._next_msg_no()
-        array.append({'message' : msg, 'headers' : hdrs, 'msg_no' : mno})
-        self.latch.countdown()
-
-    def on_receipt(self, headers, message):
-        if self.debug:
-            print '(on_receipt) message:', message, 'headers:', headers
-        self._append(self.receipts, message, headers)
-
-    def on_error(self, headers, message):
-        if self.debug:
-            print '(on_error) message:', message, 'headers:', headers
-        self._append(self.errors, message, headers)
-
-    def on_message(self, headers, message):
-        if self.debug:
-            print '(on_message) message:', message, 'headers:', headers
-        self._append(self.messages, message, headers)
-
-    def reset(self, count=1):
-        if self.debug:
-            self.print_state('(reset listener--old state)')
-        self.messages = []
-        self.errors = []
-        self.receipts = []
-        self.latch = Latch(count)
-        self.msg_no = 0
-        if self.debug:
-            self.print_state('(reset listener--new state)')
-
-    def await(self, timeout=10):
-        return self.latch.await(timeout)
-
-    def print_state(self, hdr="", full=False):
-        print hdr,
-        print '#messages:', len(self.messages),
-        print '#errors:', len(self.errors),
-        print '#receipts:', len(self.receipts),
-        print 'Remaining count:', self.latch.get_count()
-        if full:
-            if len(self.messages) != 0: print 'Messages:', self.messages
-            if len(self.errors) != 0: print 'Messages:', self.errors
-            if len(self.receipts) != 0: print 'Messages:', self.receipts
-
-class Latch(object):
-
-   def __init__(self, count=1):
-      self.cond = threading.Condition()
-      self.cond.acquire()
-      self.count = count
-      self.cond.release()
-
-   def countdown(self):
-      self.cond.acquire()
-      if self.count > 0:
-         self.count -= 1
-      if self.count == 0:
-         self.cond.notify_all()
-      self.cond.release()
-
-   def await(self, timeout=None):
-      try:
-         self.cond.acquire()
-         if self.count == 0:
-            return True
-         else:
-            self.cond.wait(timeout)
-            return self.count == 0
-      finally:
-         self.cond.release()
-
-   def get_count(self):
-      try:
-         self.cond.acquire()
-         return self.count
-      finally:
-         self.cond.release()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/connect_options.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/connect_options.py
deleted file mode 100644 (file)
index d53457f..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-import unittest
-import stomp
-import base
-import test_util
-import os
-
-class TestConnectOptions(base.BaseTest):
-
-    def test_implicit_connect(self):
-        ''' Implicit connect with receipt on first command '''
-        self.conn.disconnect()
-        test_util.enable_implicit_connect()
-        listener = base.WaitableListener()
-        new_conn = stomp.Connection(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))])
-        new_conn.set_listener('', listener)
-
-        new_conn.start() # not going to issue connect
-        self.subscribe_dest(new_conn, "/topic/implicit", 'sub_implicit',
-                            receipt='implicit')
-
-        try:
-            self.assertTrue(listener.await(5))
-            self.assertEquals(1, len(listener.receipts),
-                              'Missing receipt. Likely not connected')
-            self.assertEquals('implicit', listener.receipts[0]['headers']['receipt-id'])
-        finally:
-            new_conn.disconnect()
-            test_util.disable_implicit_connect()
-
-    def test_default_user(self):
-        ''' Default user connection '''
-        self.conn.disconnect()
-        test_util.enable_default_user()
-        listener = base.WaitableListener()
-        new_conn = stomp.Connection(host_and_ports=[('localhost', int(os.environ["STOMP_PORT"]))])
-        new_conn.set_listener('', listener)
-        new_conn.start()
-        new_conn.connect()
-        try:
-            self.assertFalse(listener.await(3)) # no error back
-            self.assertTrue(new_conn.is_connected())
-        finally:
-            new_conn.disconnect()
-            test_util.disable_default_user()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/destinations.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/destinations.py
deleted file mode 100644 (file)
index bf7c1c8..0000000
+++ /dev/null
@@ -1,529 +0,0 @@
-import unittest
-import stomp
-import base
-import time
-
-class TestExchange(base.BaseTest):
-
-
-    def test_amq_direct(self):
-        ''' Test basic send/receive for /exchange/amq.direct '''
-        self.__test_exchange_send_rec("amq.direct", "route")
-
-    def test_amq_topic(self):
-        ''' Test basic send/receive for /exchange/amq.topic '''
-        self.__test_exchange_send_rec("amq.topic", "route")
-
-    def test_amq_fanout(self):
-        ''' Test basic send/receive for /exchange/amq.fanout '''
-        self.__test_exchange_send_rec("amq.fanout", "route")
-
-    def test_amq_fanout_no_route(self):
-        ''' Test basic send/receive, /exchange/amq.direct, no routing key'''
-        self.__test_exchange_send_rec("amq.fanout")
-
-    def test_invalid_exchange(self):
-        ''' Test invalid exchange error '''
-        self.listener.reset(1)
-        self.subscribe_dest(self.conn, "/exchange/does.not.exist", None,
-                            ack="auto")
-        self.assertListener("Expecting an error", numErrs=1)
-        err = self.listener.errors[0]
-        self.assertEquals("not_found", err['headers']['message'])
-        self.assertEquals(
-            "NOT_FOUND - no exchange 'does.not.exist' in vhost '/'\n",
-            err['message'])
-        time.sleep(1)
-        self.assertFalse(self.conn.is_connected())
-
-    def __test_exchange_send_rec(self, exchange, route = None):
-        if exchange != "amq.topic":
-            dest = "/exchange/" + exchange
-        else:
-            dest = "/topic"
-        if route != None:
-            dest += "/" + route
-
-        self.simple_test_send_rec(dest)
-
-class TestQueue(base.BaseTest):
-
-    def test_send_receive(self):
-        ''' Test basic send/receive for /queue '''
-        destination = '/queue/test'
-        self.simple_test_send_rec(destination)
-
-    def test_send_receive_in_other_conn(self):
-        ''' Test send in one connection, receive in another '''
-        destination = '/queue/test2'
-
-        # send
-        self.conn.send(destination, "hello")
-
-        # now receive
-        conn2 = self.create_connection()
-        try:
-            listener2 = base.WaitableListener()
-            conn2.set_listener('', listener2)
-
-            self.subscribe_dest(conn2, destination, None, ack="auto")
-            self.assertTrue(listener2.await(10), "no receive")
-        finally:
-            conn2.disconnect()
-
-    def test_send_receive_in_other_conn_with_disconnect(self):
-        ''' Test send, disconnect, receive '''
-        destination = '/queue/test3'
-
-        # send
-        self.conn.send(destination, "hello thar", receipt="foo")
-        self.listener.await(3)
-        self.conn.disconnect()
-
-        # now receive
-        conn2 = self.create_connection()
-        try:
-            listener2 = base.WaitableListener()
-            conn2.set_listener('', listener2)
-
-            self.subscribe_dest(conn2, destination, None, ack="auto")
-            self.assertTrue(listener2.await(10), "no receive")
-        finally:
-            conn2.disconnect()
-
-
-    def test_multi_subscribers(self):
-        ''' Test multiple subscribers against a single /queue destination '''
-        destination = '/queue/test-multi'
-
-        ## set up two subscribers
-        conn1, listener1 = self.create_subscriber_connection(destination)
-        conn2, listener2 = self.create_subscriber_connection(destination)
-
-        try:
-            ## now send
-            self.conn.send(destination, "test1")
-            self.conn.send(destination, "test2")
-
-            ## expect both consumers to get a message?
-            self.assertTrue(listener1.await(2))
-            self.assertEquals(1, len(listener1.messages),
-                              "unexpected message count")
-            self.assertTrue(listener2.await(2))
-            self.assertEquals(1, len(listener2.messages),
-                              "unexpected message count")
-        finally:
-            conn1.disconnect()
-            conn2.disconnect()
-
-    def test_send_with_receipt(self):
-        destination = '/queue/test-receipt'
-        def noop(): pass
-        self.__test_send_receipt(destination, noop, noop)
-
-    def test_send_with_receipt_tx(self):
-        destination = '/queue/test-receipt-tx'
-        tx = 'receipt.tx'
-
-        def before():
-            self.conn.begin(transaction=tx)
-
-        def after():
-            self.assertFalse(self.listener.await(1))
-            self.conn.commit(transaction=tx)
-
-        self.__test_send_receipt(destination, before, after, {'transaction': tx})
-
-    def test_interleaved_receipt_no_receipt(self):
-        ''' Test i-leaved receipt/no receipt, no-r bracketed by rs '''
-
-        destination = '/queue/ir'
-
-        self.listener.reset(5)
-
-        self.subscribe_dest(self.conn, destination, None, ack="auto")
-        self.conn.send(destination, 'first', receipt='a')
-        self.conn.send(destination, 'second')
-        self.conn.send(destination, 'third', receipt='b')
-
-        self.assertListener("Missing messages/receipts", numMsgs=3, numRcts=2, timeout=3)
-
-        self.assertEquals(set(['a','b']), self.__gather_receipts())
-
-    def test_interleaved_receipt_no_receipt_tx(self):
-        ''' Test i-leaved receipt/no receipt, no-r bracketed by r+xactions '''
-
-        destination = '/queue/ir'
-        tx = 'tx.ir'
-
-        # three messages and two receipts
-        self.listener.reset(5)
-
-        self.subscribe_dest(self.conn, destination, None, ack="auto")
-        self.conn.begin(transaction=tx)
-
-        self.conn.send(destination, 'first', receipt='a', transaction=tx)
-        self.conn.send(destination, 'second', transaction=tx)
-        self.conn.send(destination, 'third', receipt='b', transaction=tx)
-        self.conn.commit(transaction=tx)
-
-        self.assertListener("Missing messages/receipts", numMsgs=3, numRcts=2, timeout=40)
-
-        expected = set(['a', 'b'])
-        missing = expected.difference(self.__gather_receipts())
-
-        self.assertEquals(set(), missing, "Missing receipts: " + str(missing))
-
-    def test_interleaved_receipt_no_receipt_inverse(self):
-        ''' Test i-leaved receipt/no receipt, r bracketed by no-rs '''
-
-        destination = '/queue/ir'
-
-        self.listener.reset(4)
-
-        self.subscribe_dest(self.conn, destination, None, ack="auto")
-        self.conn.send(destination, 'first')
-        self.conn.send(destination, 'second', receipt='a')
-        self.conn.send(destination, 'third')
-
-        self.assertListener("Missing messages/receipt", numMsgs=3, numRcts=1, timeout=3)
-
-        self.assertEquals(set(['a']), self.__gather_receipts())
-
-    def __test_send_receipt(self, destination, before, after, headers = {}):
-        count = 50
-        self.listener.reset(count)
-
-        before()
-        expected_receipts = set()
-
-        for x in range(0, count):
-            receipt = "test" + str(x)
-            expected_receipts.add(receipt)
-            self.conn.send(destination, "test receipt",
-                           receipt=receipt, headers=headers)
-        after()
-
-        self.assertTrue(self.listener.await(5))
-
-        missing_receipts = expected_receipts.difference(
-                    self.__gather_receipts())
-
-        self.assertEquals(set(), missing_receipts,
-                          "missing receipts: " + str(missing_receipts))
-
-    def __gather_receipts(self):
-        result = set()
-        for r in self.listener.receipts:
-            result.add(r['headers']['receipt-id'])
-        return result
-
-class TestTopic(base.BaseTest):
-
-      def test_send_receive(self):
-        ''' Test basic send/receive for /topic '''
-        destination = '/topic/test'
-        self.simple_test_send_rec(destination)
-
-      def test_send_multiple(self):
-          ''' Test /topic with multiple consumers '''
-          destination = '/topic/multiple'
-
-          ## set up two subscribers
-          conn1, listener1 = self.create_subscriber_connection(destination)
-          conn2, listener2 = self.create_subscriber_connection(destination)
-
-          try:
-              ## listeners are expecting 2 messages
-              listener1.reset(2)
-              listener2.reset(2)
-
-              ## now send
-              self.conn.send(destination, "test1")
-              self.conn.send(destination, "test2")
-
-              ## expect both consumers to get both messages
-              self.assertTrue(listener1.await(5))
-              self.assertEquals(2, len(listener1.messages),
-                                "unexpected message count")
-              self.assertTrue(listener2.await(5))
-              self.assertEquals(2, len(listener2.messages),
-                                "unexpected message count")
-          finally:
-              conn1.disconnect()
-              conn2.disconnect()
-
-      def test_send_multiple_with_a_large_message(self):
-          ''' Test /topic with multiple consumers '''
-          destination = '/topic/16mb'
-          # payload size
-          s = 1024 * 1024 * 16
-          message = 'x' * s
-
-          conn1, listener1 = self.create_subscriber_connection(destination)
-          conn2, listener2 = self.create_subscriber_connection(destination)
-
-          try:
-              listener1.reset(2)
-              listener2.reset(2)
-
-              self.conn.send(destination, message)
-              self.conn.send(destination, message)
-
-              self.assertTrue(listener1.await(10))
-              self.assertEquals(2, len(listener1.messages),
-                                "unexpected message count")
-              self.assertTrue(len(listener2.messages[0]['message']) == s,
-                              "unexpected message size")
-
-              self.assertTrue(listener2.await(10))
-              self.assertEquals(2, len(listener2.messages),
-                                "unexpected message count")
-          finally:
-              conn1.disconnect()
-              conn2.disconnect()
-
-class TestReplyQueue(base.BaseTest):
-
-    def test_reply_queue(self):
-        ''' Test with two separate clients. Client 1 sends
-        message to a known destination with a defined reply
-        queue. Client 2 receives on known destination and replies
-        on the reply destination. Client 1 gets the reply message'''
-
-        known = '/queue/known'
-        reply = '/temp-queue/0'
-
-        ## Client 1 uses pre-supplied connection and listener
-        ## Set up client 2
-        conn2, listener2 = self.create_subscriber_connection(known)
-
-        try:
-            self.conn.send(known, "test",
-                           headers = {"reply-to": reply})
-
-            self.assertTrue(listener2.await(5))
-            self.assertEquals(1, len(listener2.messages))
-
-            reply_to = listener2.messages[0]['headers']['reply-to']
-            self.assertTrue(reply_to.startswith('/reply-queue/'))
-
-            conn2.send(reply_to, "reply")
-            self.assertTrue(self.listener.await(5))
-            self.assertEquals("reply", self.listener.messages[0]['message'])
-        finally:
-            conn2.disconnect()
-
-    def test_reuse_reply_queue(self):
-        ''' Test re-use of reply-to queue '''
-
-        known2 = '/queue/known2'
-        known3 = '/queue/known3'
-        reply = '/temp-queue/foo'
-
-        def respond(cntn, listna):
-            self.assertTrue(listna.await(5))
-            self.assertEquals(1, len(listna.messages))
-            reply_to = listna.messages[0]['headers']['reply-to']
-            self.assertTrue(reply_to.startswith('/reply-queue/'))
-            cntn.send(reply_to, "reply")
-
-        ## Client 1 uses pre-supplied connection and listener
-        ## Set up clients 2 and 3
-        conn2, listener2 = self.create_subscriber_connection(known2)
-        conn3, listener3 = self.create_subscriber_connection(known3)
-        try:
-            self.listener.reset(2)
-            self.conn.send(known2, "test2",
-                           headers = {"reply-to": reply})
-            self.conn.send(known3, "test3",
-                           headers = {"reply-to": reply})
-            respond(conn2, listener2)
-            respond(conn3, listener3)
-
-            self.assertTrue(self.listener.await(5))
-            self.assertEquals(2, len(self.listener.messages))
-            self.assertEquals("reply", self.listener.messages[0]['message'])
-            self.assertEquals("reply", self.listener.messages[1]['message'])
-        finally:
-            conn2.disconnect()
-            conn3.disconnect()
-
-    def test_perm_reply_queue(self):
-        '''As test_reply_queue, but with a non-temp reply queue'''
-
-        known = '/queue/known'
-        reply = '/queue/reply'
-
-        ## Client 1 uses pre-supplied connection and listener
-        ## Set up client 2
-        conn1, listener1 = self.create_subscriber_connection(reply)
-        conn2, listener2 = self.create_subscriber_connection(known)
-
-        try:
-            conn1.send(known, "test",
-                       headers = {"reply-to": reply})
-
-            self.assertTrue(listener2.await(5))
-            self.assertEquals(1, len(listener2.messages))
-
-            reply_to = listener2.messages[0]['headers']['reply-to']
-            self.assertTrue(reply_to == reply)
-
-            conn2.send(reply_to, "reply")
-            self.assertTrue(listener1.await(5))
-            self.assertEquals("reply", listener1.messages[0]['message'])
-        finally:
-            conn1.disconnect()
-            conn2.disconnect()
-
-class TestDurableSubscription(base.BaseTest):
-
-    ID = 'test.subscription'
-
-    def __subscribe(self, dest, conn=None, id=None):
-        if not conn:
-            conn = self.conn
-        if not id:
-            id = TestDurableSubscription.ID
-
-        self.subscribe_dest(conn, dest, id, ack="auto",
-                            headers = {'durable': 'true',
-                                       'receipt': 1,
-                                       'auto-delete': False})
-
-    def __assert_receipt(self, listener=None, pos=None):
-        if not listener:
-            listener = self.listener
-
-        self.assertTrue(listener.await(5))
-        self.assertEquals(1, len(self.listener.receipts))
-        if pos is not None:
-            self.assertEquals(pos, self.listener.receipts[0]['msg_no'])
-
-    def __assert_message(self, msg, listener=None, pos=None):
-        if not listener:
-            listener = self.listener
-
-        self.assertTrue(listener.await(5))
-        self.assertEquals(1, len(listener.messages))
-        self.assertEquals(msg, listener.messages[0]['message'])
-        if pos is not None:
-            self.assertEquals(pos, self.listener.messages[0]['msg_no'])
-
-    def do_test_durable_subscription(self, durability_header):
-        destination = '/topic/durable'
-
-        self.__subscribe(destination)
-        self.__assert_receipt()
-
-        # send first message without unsubscribing
-        self.listener.reset(1)
-        self.conn.send(destination, "first")
-        self.__assert_message("first")
-
-        # now unsubscribe (disconnect only)
-        self.unsubscribe_dest(self.conn, destination, TestDurableSubscription.ID)
-
-        # send again
-        self.listener.reset(2)
-        self.conn.send(destination, "second")
-
-        # resubscribe and expect receipt
-        self.__subscribe(destination)
-        self.__assert_receipt(pos=1)
-        # and message
-        self.__assert_message("second", pos=2)
-
-        # now unsubscribe (cancel)
-        self.unsubscribe_dest(self.conn, destination, TestDurableSubscription.ID,
-                              headers={durability_header: 'true'})
-
-        # send again
-        self.listener.reset(1)
-        self.conn.send(destination, "third")
-
-        # resubscribe and expect no message
-        self.__subscribe(destination)
-        self.assertTrue(self.listener.await(3))
-        self.assertEquals(0, len(self.listener.messages))
-        self.assertEquals(1, len(self.listener.receipts))
-
-    def test_durable_subscription(self):
-        self.do_test_durable_subscription('durable')
-
-    def test_durable_subscription_and_legacy_header(self):
-        self.do_test_durable_subscription('persistent')
-
-    def test_share_subscription(self):
-        destination = '/topic/durable-shared'
-
-        conn2 = self.create_connection()
-        conn2.set_listener('', self.listener)
-
-        try:
-            self.__subscribe(destination)
-            self.__assert_receipt()
-            self.listener.reset(1)
-            self.__subscribe(destination, conn2)
-            self.__assert_receipt()
-
-            self.listener.reset(100)
-
-            # send 100 messages
-            for x in xrange(0, 100):
-                self.conn.send(destination, "msg" + str(x))
-
-            self.assertTrue(self.listener.await(5))
-            self.assertEquals(100, len(self.listener.messages))
-        finally:
-            conn2.disconnect()
-
-    def test_separate_ids(self):
-        destination = '/topic/durable-separate'
-
-        conn2 = self.create_connection()
-        listener2 = base.WaitableListener()
-        conn2.set_listener('', listener2)
-
-        try:
-            # ensure durable subscription exists for each ID
-            self.__subscribe(destination)
-            self.__assert_receipt()
-            self.__subscribe(destination, conn2, "other.id")
-            self.__assert_receipt(listener2)
-            self.unsubscribe_dest(self.conn, destination, TestDurableSubscription.ID)
-            self.unsubscribe_dest(conn2, destination, "other.id")
-
-            self.listener.reset(101)
-            listener2.reset(101) ## 100 messages and 1 receipt
-
-            # send 100 messages
-            for x in xrange(0, 100):
-                self.conn.send(destination, "msg" + str(x))
-
-            self.__subscribe(destination)
-            self.__subscribe(destination, conn2, "other.id")
-
-            for l in [self.listener, listener2]:
-                self.assertTrue(l.await(15))
-                self.assertTrue(len(l.messages) >= 90)
-                self.assertTrue(len(l.messages) <= 100)
-
-        finally:
-            conn2.disconnect()
-
-    def do_test_durable_subscribe_no_id_and_header(self, header):
-        destination = '/topic/durable-invalid'
-
-        self.conn.send_frame('SUBSCRIBE',
-            {'destination': destination, 'ack': 'auto', header: 'true'})
-        self.listener.await(3)
-        self.assertEquals(1, len(self.listener.errors))
-        self.assertEquals("Missing Header", self.listener.errors[0]['headers']['message'])
-
-    def test_durable_subscribe_no_id(self):
-        self.do_test_durable_subscribe_no_id_and_header('durable')
-
-    def test_durable_subscribe_no_id_and_legacy_header(self):
-        self.do_test_durable_subscribe_no_id_and_header('persistent')
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/errors.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/errors.py
deleted file mode 100644 (file)
index d3fa60a..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-import unittest
-import stomp
-import base
-import time
-
-class TestErrorsAndCloseConnection(base.BaseTest):
-    def __test_duplicate_consumer_tag_with_headers(self, destination, headers):
-        self.subscribe_dest(self.conn, destination, None,
-                            headers = headers)
-
-        self.subscribe_dest(self.conn, destination, None,
-                            headers = headers)
-
-        self.assertTrue(self.listener.await())
-
-        self.assertEquals(1, len(self.listener.errors))
-        errorReceived = self.listener.errors[0]
-        self.assertEquals("Duplicated subscription identifier", errorReceived['headers']['message'])
-        self.assertEquals("A subscription identified by 'T_1' alredy exists.", errorReceived['message'])
-        time.sleep(2)
-        self.assertFalse(self.conn.is_connected())
-
-
-    def test_duplicate_consumer_tag_with_transient_destination(self):
-        destination = "/exchange/amq.direct/duplicate-consumer-tag-test1"
-        self.__test_duplicate_consumer_tag_with_headers(destination, {'id': 1})
-
-    def test_duplicate_consumer_tag_with_durable_destination(self):
-        destination = "/queue/duplicate-consumer-tag-test2"
-        self.__test_duplicate_consumer_tag_with_headers(destination, {'id': 1,
-                                                                      'persistent': True})
-
-
-class TestErrors(base.BaseTest):
-
-    def test_invalid_queue_destination(self):
-        self.__test_invalid_destination("queue", "/bah/baz")
-
-    def test_invalid_empty_queue_destination(self):
-        self.__test_invalid_destination("queue", "")
-
-    def test_invalid_topic_destination(self):
-        self.__test_invalid_destination("topic", "/bah/baz")
-
-    def test_invalid_empty_topic_destination(self):
-        self.__test_invalid_destination("topic", "")
-
-    def test_invalid_exchange_destination(self):
-        self.__test_invalid_destination("exchange", "/bah/baz/boo")
-
-    def test_invalid_empty_exchange_destination(self):
-        self.__test_invalid_destination("exchange", "")
-
-    def test_invalid_default_exchange_destination(self):
-        self.__test_invalid_destination("exchange", "//foo")
-
-    def test_unknown_destination(self):
-        self.listener.reset()
-        self.conn.send("/something/interesting", 'test_unknown_destination')
-
-        self.assertTrue(self.listener.await())
-        self.assertEquals(1, len(self.listener.errors))
-
-        err = self.listener.errors[0]
-        self.assertEquals("Unknown destination", err['headers']['message'])
-
-    def test_send_missing_destination(self):
-        self.__test_missing_destination("SEND")
-
-    def test_send_missing_destination(self):
-        self.__test_missing_destination("SUBSCRIBE")
-
-    def __test_missing_destination(self, command):
-        self.listener.reset()
-        self.conn.send_frame(command)
-
-        self.assertTrue(self.listener.await())
-        self.assertEquals(1, len(self.listener.errors))
-
-        err = self.listener.errors[0]
-        self.assertEquals("Missing destination", err['headers']['message'])
-
-    def __test_invalid_destination(self, dtype, content):
-        self.listener.reset()
-        self.conn.send("/" + dtype + content, '__test_invalid_destination:' + dtype + content)
-
-        self.assertTrue(self.listener.await())
-        self.assertEquals(1, len(self.listener.errors))
-
-        err = self.listener.errors[0]
-        self.assertEquals("Invalid destination", err['headers']['message'])
-        self.assertEquals("'" + content + "' is not a valid " +
-                              dtype + " destination\n",
-                          err['message'])
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/lifecycle.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/lifecycle.py
deleted file mode 100644 (file)
index ff9b119..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-import unittest
-import stomp
-import base
-import time
-
-class TestLifecycle(base.BaseTest):
-
-    def test_unsubscribe_exchange_destination(self):
-        ''' Test UNSUBSCRIBE command with exchange'''
-        d = "/exchange/amq.fanout"
-        self.unsub_test(d, self.sub_and_send(d))
-
-    def test_unsubscribe_exchange_destination_with_receipt(self):
-        ''' Test receipted UNSUBSCRIBE command with exchange'''
-        d = "/exchange/amq.fanout"
-        self.unsub_test(d, self.sub_and_send(d, receipt="unsub.rct"), numRcts=1)
-
-    def test_unsubscribe_queue_destination(self):
-        ''' Test UNSUBSCRIBE command with queue'''
-        d = "/queue/unsub01"
-        self.unsub_test(d, self.sub_and_send(d))
-
-    def test_unsubscribe_queue_destination_with_receipt(self):
-        ''' Test receipted UNSUBSCRIBE command with queue'''
-        d = "/queue/unsub02"
-        self.unsub_test(d, self.sub_and_send(d, receipt="unsub.rct"), numRcts=1)
-
-    def test_unsubscribe_exchange_id(self):
-        ''' Test UNSUBSCRIBE command with exchange by id'''
-        d = "/exchange/amq.fanout"
-        self.unsub_test(d, self.sub_and_send(d, subid="exchid"))
-
-    def test_unsubscribe_exchange_id_with_receipt(self):
-        ''' Test receipted UNSUBSCRIBE command with exchange by id'''
-        d = "/exchange/amq.fanout"
-        self.unsub_test(d, self.sub_and_send(d, subid="exchid", receipt="unsub.rct"), numRcts=1)
-
-    def test_unsubscribe_queue_id(self):
-        ''' Test UNSUBSCRIBE command with queue by id'''
-        d = "/queue/unsub03"
-        self.unsub_test(d, self.sub_and_send(d, subid="queid"))
-
-    def test_unsubscribe_queue_id_with_receipt(self):
-        ''' Test receipted UNSUBSCRIBE command with queue by id'''
-        d = "/queue/unsub04"
-        self.unsub_test(d, self.sub_and_send(d, subid="queid", receipt="unsub.rct"), numRcts=1)
-
-    def test_connect_version_1_0(self):
-        ''' Test CONNECT with version 1.0'''
-        self.conn.disconnect()
-        new_conn = self.create_connection(version="1.0")
-        try:
-            self.assertTrue(new_conn.is_connected())
-        finally:
-            new_conn.disconnect()
-            self.assertFalse(new_conn.is_connected())
-
-    def test_connect_version_1_1(self):
-        ''' Test CONNECT with version 1.1'''
-        self.conn.disconnect()
-        new_conn = self.create_connection(version="1.1")
-        try:
-            self.assertTrue(new_conn.is_connected())
-        finally:
-            new_conn.disconnect()
-            self.assertFalse(new_conn.is_connected())
-
-    def test_connect_version_1_2(self):
-        ''' Test CONNECT with version 1.2'''
-        self.conn.disconnect()
-        new_conn = self.create_connection(version="1.2")
-        try:
-            self.assertTrue(new_conn.is_connected())
-        finally:
-            new_conn.disconnect()
-            self.assertFalse(new_conn.is_connected())
-
-    def test_heartbeat_disconnects_client(self):
-        ''' Test heart-beat disconnection'''
-        self.conn.disconnect()
-        new_conn = self.create_connection(version='1.1', heartbeats=(1500, 0))
-        try:
-            self.assertTrue(new_conn.is_connected())
-            time.sleep(1)
-            self.assertTrue(new_conn.is_connected())
-            time.sleep(3)
-            self.assertFalse(new_conn.is_connected())
-        finally:
-            if new_conn.is_connected():
-                new_conn.disconnect()
-
-    def test_unsupported_version(self):
-        ''' Test unsupported version on CONNECT command'''
-        self.bad_connect("Supported versions are 1.0,1.1,1.2\n", version='100.1')
-
-    def test_bad_username(self):
-        ''' Test bad username'''
-        self.bad_connect("Access refused for user 'gust'\n", user='gust')
-
-    def test_bad_password(self):
-        ''' Test bad password'''
-        self.bad_connect("Access refused for user 'guest'\n", passcode='gust')
-
-    def test_bad_vhost(self):
-        ''' Test bad virtual host'''
-        self.bad_connect("Virtual host '//' access denied", version='1.1', vhost='//')
-
-    def bad_connect(self, expected, user='guest', passcode='guest', **kwargs):
-        self.conn.disconnect()
-        new_conn = self.create_connection_obj(**kwargs)
-        listener = base.WaitableListener()
-        new_conn.set_listener('', listener)
-        try:
-            new_conn.start()
-            new_conn.connect(user, passcode)
-            self.assertTrue(listener.await())
-            self.assertEquals(expected, listener.errors[0]['message'])
-        finally:
-            if new_conn.is_connected():
-                new_conn.disconnect()
-
-    def test_bad_header_on_send(self):
-        ''' Test disallowed header on SEND '''
-        self.listener.reset(1)
-        self.conn.send_frame("SEND", {"destination":"a", "message-id":"1"})
-        self.assertTrue(self.listener.await())
-        self.assertEquals(1, len(self.listener.errors))
-        errorReceived = self.listener.errors[0]
-        self.assertEquals("Invalid header", errorReceived['headers']['message'])
-        self.assertEquals("'message-id' is not allowed on 'SEND'.\n", errorReceived['message'])
-
-    def test_disconnect(self):
-        ''' Test DISCONNECT command'''
-        self.conn.disconnect()
-        self.assertFalse(self.conn.is_connected())
-
-    def test_disconnect_with_receipt(self):
-        ''' Test the DISCONNECT command with receipts '''
-        time.sleep(3)
-        self.listener.reset(1)
-        self.conn.send_frame("DISCONNECT", {"receipt": "test"})
-        self.assertTrue(self.listener.await())
-        self.assertEquals(1, len(self.listener.receipts))
-        receiptReceived = self.listener.receipts[0]['headers']['receipt-id']
-        self.assertEquals("test", receiptReceived
-                         , "Wrong receipt received: '" + receiptReceived + "'")
-
-    def unsub_test(self, dest, verbs, numRcts=0):
-        def afterfun():
-            self.conn.send(dest, "after-test")
-        subverb, unsubverb = verbs
-        self.assertListenerAfter(subverb, numMsgs=1,
-                           errMsg="FAILED to subscribe and send")
-        self.assertListenerAfter(unsubverb, numRcts=numRcts,
-                           errMsg="Incorrect responses from UNSUBSCRIBE")
-        self.assertListenerAfter(afterfun,
-                           errMsg="Still receiving messages")
-
-    def sub_and_send(self, dest, subid=None, receipt=None):
-        def subfun():
-            self.subscribe_dest(self.conn, dest, subid)
-            self.conn.send(dest, "test")
-        def unsubfun():
-            headers = {}
-            if receipt != None:
-                headers['receipt'] = receipt
-            self.unsubscribe_dest(self.conn, dest, subid, **headers)
-        return subfun, unsubfun
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/parsing.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/parsing.py
deleted file mode 100644 (file)
index bd37977..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-'''
-Few tests for a rabbitmq-stomp adaptor. They intend to increase code coverage
-of the erlang stomp code.
-'''
-import unittest
-import re
-import socket
-import functools
-import time
-import sys
-import os
-
-def connect(cnames):
-    ''' Decorator that creates stomp connections and issues CONNECT '''
-    cmd=('CONNECT\n'
-        'login:guest\n'
-        'passcode:guest\n'
-        '\n'
-        '\n\0')
-    resp = ('CONNECTED\n'
-            'server:RabbitMQ/(.*)\n'
-            'session:(.*)\n'
-            'heart-beat:0,0\n'
-            'version:1.0\n'
-            '\n\x00')
-    def w(m):
-        @functools.wraps(m)
-        def wrapper(self, *args, **kwargs):
-            for cname in cnames:
-                sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-                sd.settimeout(30000)
-                sd.connect((self.host, self.port))
-                sd.sendall(cmd)
-                self.match(resp, sd.recv(4096))
-                setattr(self, cname, sd)
-            try:
-                r = m(self, *args, **kwargs)
-            finally:
-                for cname in cnames:
-                    try:
-                        getattr(self, cname).close()
-                    except IOError:
-                        pass
-            return r
-        return wrapper
-    return w
-
-
-class TestParsing(unittest.TestCase):
-    host='127.0.0.1'
-    # The default port is 61613 but it's in the middle of the ephemeral
-    # ports range on many operating systems. Therefore, there is a
-    # chance this port is already in use. Let's use a port close to the
-    # AMQP default port.
-    port=int(os.environ["STOMP_PORT"])
-
-
-    def match(self, pattern, data):
-        ''' helper: try to match a regexp with a string.
-            Fail test if they do not match.
-        '''
-        matched = re.match(pattern, data)
-        if matched:
-            return matched.groups()
-        self.assertTrue(False, 'No match:\n%r\n%r' % (pattern, data) )
-
-    def recv_atleast(self, bufsize):
-        recvhead = []
-        rl = bufsize
-        while rl > 0:
-            buf = self.cd.recv(rl)
-            bl = len(buf)
-            if bl==0: break
-            recvhead.append( buf )
-            rl -= bl
-        return ''.join(recvhead)
-
-
-    @connect(['cd'])
-    def test_newline_after_nul(self):
-        self.cd.sendall('\n'
-                        'SUBSCRIBE\n'
-                        'destination:/exchange/amq.fanout\n'
-                        '\n\x00\n'
-                        'SEND\n'
-                        'content-type:text/plain\n'
-                        'destination:/exchange/amq.fanout\n\n'
-                        'hello\n\x00\n')
-        resp = ('MESSAGE\n'
-                'destination:/exchange/amq.fanout\n'
-                'message-id:Q_/exchange/amq.fanout@@session-(.*)\n'
-                'redelivered:false\n'
-                'content-type:text/plain\n'
-                'content-length:6\n'
-                '\n'
-                'hello\n\0')
-        self.match(resp, self.cd.recv(4096))
-
-    @connect(['cd'])
-    def test_send_without_content_type(self):
-        self.cd.sendall('\n'
-                        'SUBSCRIBE\n'
-                        'destination:/exchange/amq.fanout\n'
-                        '\n\x00\n'
-                        'SEND\n'
-                        'destination:/exchange/amq.fanout\n\n'
-                        'hello\n\x00')
-        resp = ('MESSAGE\n'
-                'destination:/exchange/amq.fanout\n'
-                'message-id:Q_/exchange/amq.fanout@@session-(.*)\n'
-                'redelivered:false\n'
-                'content-length:6\n'
-                '\n'
-                'hello\n\0')
-        self.match(resp, self.cd.recv(4096))
-
-    @connect(['cd'])
-    def test_send_without_content_type_binary(self):
-        msg = u'\u0ca0\ufffd\x00\n\x01hello\x00'.encode('utf-8')
-        self.cd.sendall('\n'
-                        'SUBSCRIBE\n'
-                        'destination:/exchange/amq.fanout\n'
-                        '\n\x00\n'
-                        'SEND\n'
-                        'destination:/exchange/amq.fanout\n'
-                        'content-length:'+str(len(msg))+'\n\n'
-                        + msg + '\x00')
-        resp = ('MESSAGE\n'
-                'destination:/exchange/amq.fanout\n'
-                'message-id:Q_/exchange/amq.fanout@@session-(.*)\n'
-                'redelivered:false\n'
-                'content-length:'+str(len(msg))+'\n'
-                '\n'
-                + msg + '\0')
-        self.match(resp, self.cd.recv(4096))
-
-    @connect(['cd'])
-    def test_newline_after_nul_and_leading_nul(self):
-        self.cd.sendall('\n'
-                        '\x00SUBSCRIBE\n'
-                        'destination:/exchange/amq.fanout\n'
-                        '\n\x00\n'
-                        '\x00SEND\n'
-                        'destination:/exchange/amq.fanout\n'
-                        'content-type:text/plain\n'
-                        '\nhello\n\x00\n')
-        resp = ('MESSAGE\n'
-                'destination:/exchange/amq.fanout\n'
-                'message-id:Q_/exchange/amq.fanout@@session-(.*)\n'
-                'redelivered:false\n'
-                'content-type:text/plain\n'
-                'content-length:6\n'
-                '\n'
-                'hello\n\0')
-        self.match(resp, self.cd.recv(4096))
-
-    @connect(['cd'])
-    def test_bad_command(self):
-        ''' Trigger an error message. '''
-        self.cd.sendall('WRONGCOMMAND\n'
-                        'destination:a\n'
-                        'exchange:amq.fanout\n'
-                        '\n\0')
-        resp = ('ERROR\n'
-                'message:Bad command\n'
-                'content-type:text/plain\n'
-                'version:1.0,1.1,1.2\n'
-                'content-length:43\n'
-                '\n'
-                'Could not interpret command "WRONGCOMMAND"\n'
-                '\0')
-        self.match(resp, self.cd.recv(4096))
-
-    @connect(['sd', 'cd1', 'cd2'])
-    def test_broadcast(self):
-        ''' Single message should be delivered to two consumers:
-            amq.topic --routing_key--> first_queue --> first_connection
-                     \--routing_key--> second_queue--> second_connection
-        '''
-        subscribe=( 'SUBSCRIBE\n'
-                    'id: XsKNhAf\n'
-                    'destination:/exchange/amq.topic/da9d4779\n'
-                    '\n\0')
-        for cd in [self.cd1, self.cd2]:
-            cd.sendall(subscribe)
-
-        time.sleep(0.1)
-
-        self.sd.sendall('SEND\n'
-                        'content-type:text/plain\n'
-                        'destination:/exchange/amq.topic/da9d4779\n'
-                        '\n'
-                        'message'
-                        '\n\0')
-
-        resp=('MESSAGE\n'
-            'subscription:(.*)\n'
-            'destination:/topic/da9d4779\n'
-            'message-id:(.*)\n'
-            'redelivered:false\n'
-            'content-type:text/plain\n'
-            'content-length:8\n'
-            '\n'
-            'message'
-            '\n\x00')
-        for cd in [self.cd1, self.cd2]:
-            self.match(resp, cd.recv(4096))
-
-    @connect(['cd'])
-    def test_message_with_embedded_nulls(self):
-        ''' Test sending/receiving message with embedded nulls. '''
-        dest='destination:/exchange/amq.topic/test_embed_nulls_message\n'
-        resp_dest='destination:/topic/test_embed_nulls_message\n'
-        subscribe=( 'SUBSCRIBE\n'
-                    'id:xxx\n'
-                    +dest+
-                    '\n\0')
-        self.cd.sendall(subscribe)
-
-        boilerplate = '0123456789'*1024 # large enough boilerplate
-        message = '01'
-        oldi = 2
-        for i in [5, 90, 256-1, 384-1, 512, 1024, 1024+256+64+32]:
-            message = message + '\0' + boilerplate[oldi+1:i]
-            oldi = i
-        msg_len = len(message)
-
-        self.cd.sendall('SEND\n'
-                        +dest+
-                        'content-type:text/plain\n'
-                        'content-length:%i\n'
-                        '\n'
-                        '%s'
-                        '\0' % (len(message), message) )
-
-        headresp=('MESSAGE\n'            # 8
-            'subscription:(.*)\n'        # 14 + subscription
-            +resp_dest+                  # 44
-            'message-id:(.*)\n'          # 12 + message-id
-            'redelivered:false\n'        # 18
-            'content-type:text/plain\n'  # 24
-            'content-length:%i\n'        # 16 + 4==len('1024')
-            '\n'                         # 1
-            '(.*)$'                      # prefix of body+null (potentially)
-             % len(message) )
-        headlen = 8 + 24 + 14 + (3) + 44 + 12 + 18 + (48) + 16 + (4) + 1 + (1)
-
-        headbuf = self.recv_atleast(headlen)
-        self.assertFalse(len(headbuf) == 0)
-
-        (sub, msg_id, bodyprefix) = self.match(headresp, headbuf)
-        bodyresp=( '%s\0' % message )
-        bodylen = len(bodyresp);
-
-        bodybuf = ''.join([bodyprefix,
-                           self.recv_atleast(bodylen - len(bodyprefix))])
-
-        self.assertEqual(len(bodybuf), msg_len+1,
-            "body received not the same length as message sent")
-        self.assertEqual(bodybuf, bodyresp,
-            "   body (...'%s')\nincorrectly returned as (...'%s')"
-            % (bodyresp[-10:], bodybuf[-10:]))
-
-    @connect(['cd'])
-    def test_message_in_packets(self):
-        ''' Test sending/receiving message in packets. '''
-        base_dest='topic/test_embed_nulls_message\n'
-        dest='destination:/exchange/amq.' + base_dest
-        resp_dest='destination:/'+ base_dest
-        subscribe=( 'SUBSCRIBE\n'
-                    'id:xxx\n'
-                    +dest+
-                    '\n\0')
-        self.cd.sendall(subscribe)
-
-        boilerplate = '0123456789'*1024 # large enough boilerplate
-
-        message = boilerplate[:1024 + 512 + 256 + 32]
-        msg_len = len(message)
-
-        msg_to_send = ('SEND\n'
-                       +dest+
-                       'content-type:text/plain\n'
-                       '\n'
-                       '%s'
-                       '\0' % (message) )
-        packet_size = 191
-        part_index = 0
-        msg_to_send_len = len(msg_to_send)
-        while part_index < msg_to_send_len:
-            part = msg_to_send[part_index:part_index+packet_size]
-            time.sleep(0.1)
-            self.cd.sendall(part)
-            part_index += packet_size
-
-        headresp=('MESSAGE\n'           # 8
-            'subscription:(.*)\n'       # 14 + subscription
-            +resp_dest+                 # 44
-            'message-id:(.*)\n'         # 12 + message-id
-            'redelivered:false\n'       # 18
-            'content-type:text/plain\n' # 24
-            'content-length:%i\n'       # 16 + 4==len('1024')
-            '\n'                        # 1
-            '(.*)$'                     # prefix of body+null (potentially)
-             % len(message) )
-        headlen = 8 + 24 + 14 + (3) + 44 + 12 + 18 + (48) + 16 + (4) + 1 + (1)
-
-        headbuf = self.recv_atleast(headlen)
-        self.assertFalse(len(headbuf) == 0)
-
-        (sub, msg_id, bodyprefix) = self.match(headresp, headbuf)
-        bodyresp=( '%s\0' % message )
-        bodylen = len(bodyresp);
-
-        bodybuf = ''.join([bodyprefix,
-                           self.recv_atleast(bodylen - len(bodyprefix))])
-
-        self.assertEqual(len(bodybuf), msg_len+1,
-            "body received not the same length as message sent")
-        self.assertEqual(bodybuf, bodyresp,
-            "   body ('%s')\nincorrectly returned as ('%s')"
-            % (bodyresp, bodybuf))
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/queue_properties.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/queue_properties.py
deleted file mode 100644 (file)
index f18072e..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-import unittest
-import stomp
-import pika
-import base
-import time
-import os
-
-class TestQueueProperties(base.BaseTest):
-
-    def test_subscribe(self):
-        destination = "/queue/queue-properties-subscribe-test"
-
-        # subscribe
-        self.subscribe_dest(self.conn, destination, None,
-                            headers={
-                                'x-message-ttl': 60000,
-                                'x-expires': 70000,
-                                'x-max-length': 10,
-                                'x-max-length-bytes': 20000,
-                                'x-dead-letter-exchange': 'dead-letter-exchange',
-                                'x-dead-letter-routing-key': 'dead-letter-routing-key',
-                                'x-max-priority': 6,
-                                })
-
-        # now try to declare the queue using pika
-        # if the properties are the same we should
-        # not get any error
-        connection = pika.BlockingConnection(pika.ConnectionParameters(
-                    host='localhost', port=int(os.environ["AMQP_PORT"])))
-        channel = connection.channel()
-        channel.queue_declare(queue='queue-properties-subscribe-test',
-                              durable=True,
-                              arguments={
-                                  'x-message-ttl': 60000,
-                                  'x-expires': 70000,
-                                  'x-max-length': 10,
-                                  'x-max-length-bytes': 20000,
-                                  'x-dead-letter-exchange': 'dead-letter-exchange',
-                                  'x-dead-letter-routing-key': 'dead-letter-routing-key',
-                                  'x-max-priority': 6,
-                                  })
-
-        self.conn.disconnect()
-        connection.close()
-
-    def test_send(self):
-        destination = "/queue/queue-properties-send-test"
-
-        # send
-        self.conn.send(destination, "test1",
-                       headers={
-                           'x-message-ttl': 60000,
-                           'x-expires': 70000,
-                           'x-max-length': 10,
-                           'x-max-length-bytes': 20000,
-                           'x-dead-letter-exchange': 'dead-letter-exchange',
-                           'x-dead-letter-routing-key': 'dead-letter-routing-key',
-                           'x-max-priority': 6,
-                           })
-
-        # now try to declare the queue using pika
-        # if the properties are the same we should
-        # not get any error
-        connection = pika.BlockingConnection(pika.ConnectionParameters(
-                    host='localhost', port=int(os.environ["AMQP_PORT"])))
-        channel = connection.channel()
-        channel.queue_declare(queue='queue-properties-send-test',
-                              durable=True,
-                              arguments={
-                                  'x-message-ttl': 60000,
-                                  'x-expires': 70000,
-                                  'x-max-length': 10,
-                                  'x-max-length-bytes': 20000,
-                                  'x-dead-letter-exchange': 'dead-letter-exchange',
-                                  'x-dead-letter-routing-key': 'dead-letter-routing-key',
-                                  'x-max-priority': 6,
-                                  })
-
-        self.conn.disconnect()
-        connection.close()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/redelivered.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/redelivered.py
deleted file mode 100644 (file)
index bbabd3f..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-import unittest
-import stomp
-import base
-import time
-
-class TestRedelivered(base.BaseTest):
-
-    def test_redelivered(self):
-        destination = "/queue/redelivered-test"
-
-        # subscribe and send message
-        self.subscribe_dest(self.conn, destination, None, ack='client')
-        self.conn.send(destination, "test1")
-        self.assertTrue(self.listener.await(4), "initial message not received")
-        self.assertEquals(1, len(self.listener.messages))
-        self.assertEquals('false', self.listener.messages[0]['headers']['redelivered'])
-
-        # disconnect with no ack
-        self.conn.disconnect()
-
-        # now reconnect
-        conn2 = self.create_connection()
-        try:
-            listener2 = base.WaitableListener()
-            listener2.reset(1)
-            conn2.set_listener('', listener2)
-            self.subscribe_dest(conn2, destination, None, ack='client')
-            self.assertTrue(listener2.await(), "message not received again")
-            self.assertEquals(1, len(listener2.messages))
-            self.assertEquals('true', listener2.messages[0]['headers']['redelivered'])
-        finally:
-            conn2.disconnect()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/reliability.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/reliability.py
deleted file mode 100644 (file)
index b8bb150..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-import base
-import stomp
-import unittest
-import time
-
-class TestReliability(base.BaseTest):
-
-    def test_send_and_disconnect(self):
-        ''' Test close socket after send does not lose messages '''
-        destination = "/queue/reliability"
-        pub_conn = self.create_connection()
-        try:
-            msg = "0" * (128)
-
-            count = 10000
-
-            listener = base.WaitableListener()
-            listener.reset(count)
-            self.conn.set_listener('', listener)
-            self.subscribe_dest(self.conn, destination, None)
-
-            for x in range(0, count):
-                pub_conn.send(destination, msg + str(x))
-            time.sleep(2.0)
-            pub_conn.disconnect()
-
-            if listener.await(30):
-                self.assertEquals(count, len(listener.messages))
-            else:
-                listener.print_state("Final state of listener:")
-                self.fail("Did not receive %s messages in time" % count)
-        finally:
-            if pub_conn.is_connected():
-                pub_conn.disconnect()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/ssl_lifecycle.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/ssl_lifecycle.py
deleted file mode 100644 (file)
index 17c9f51..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-import unittest
-import os
-import os.path
-import sys
-
-import stomp
-import base
-import ssl
-
-base_path = os.path.dirname(sys.argv[0])
-
-ssl_key_file = os.path.join(os.getenv('SSL_CERTS_PATH'), 'client', 'key.pem')
-ssl_cert_file = os.path.join(os.getenv('SSL_CERTS_PATH'), 'client', 'cert.pem')
-ssl_ca_certs = os.path.join(os.getenv('SSL_CERTS_PATH'), 'testca', 'cacert.pem')
-
-class TestSslClient(unittest.TestCase):
-
-    def __ssl_connect(self):
-        conn = stomp.Connection(host_and_ports = [ ('localhost', int(os.environ["STOMP_PORT_TLS"])) ],
-                                use_ssl = True, ssl_key_file = ssl_key_file,
-                                ssl_cert_file = ssl_cert_file,
-                                ssl_ca_certs = ssl_ca_certs)
-        print "FILE: ", ssl_cert_file
-        conn.start()
-        conn.connect("guest", "guest")
-        return conn
-
-    def __ssl_auth_connect(self):
-        conn = stomp.Connection(host_and_ports = [ ('localhost', int(os.environ["STOMP_PORT_TLS"])) ],
-                                use_ssl = True, ssl_key_file = ssl_key_file,
-                                ssl_cert_file = ssl_cert_file,
-                                ssl_ca_certs = ssl_ca_certs)
-        conn.start()
-        conn.connect()
-        return conn
-
-    def test_ssl_connect(self):
-        conn = self.__ssl_connect()
-        conn.disconnect()
-
-    def test_ssl_auth_connect(self):
-        conn = self.__ssl_auth_connect()
-        conn.disconnect()
-
-    def test_ssl_send_receive(self):
-        conn = self.__ssl_connect()
-        self.__test_conn(conn)
-
-    def test_ssl_auth_send_receive(self):
-        conn = self.__ssl_auth_connect()
-        self.__test_conn(conn)
-
-    def __test_conn(self, conn):
-        try:
-            listener = base.WaitableListener()
-
-            conn.set_listener('', listener)
-
-            d = "/topic/ssl.test"
-            conn.subscribe(destination=d, ack="auto", id="ctag", receipt="sub")
-
-            self.assertTrue(listener.await(1))
-
-            self.assertEquals("sub",
-                              listener.receipts[0]['headers']['receipt-id'])
-
-            listener.reset(1)
-            conn.send(body="Hello SSL!", destination=d)
-
-            self.assertTrue(listener.await())
-
-            self.assertEquals("Hello SSL!", listener.messages[0]['message'])
-        finally:
-            conn.disconnect()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test.py
deleted file mode 100755 (executable)
index ddc674f..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-
-import test_runner
-
-if __name__ == '__main__':
-    modules = [
-        'ack',
-        'destinations',
-        'errors',
-        'lifecycle',
-        'parsing',
-        'queue_properties',
-        'redelivered',
-        'reliability',
-        'transactions',
-        'x_queue_name',
-    ]
-    test_runner.run_unittests(modules)
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_connect_options.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_connect_options.py
deleted file mode 100755 (executable)
index 6822f97..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env python
-
-import test_runner
-
-if __name__ == '__main__':
-    modules = ['connect_options']
-    test_runner.run_unittests(modules)
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_runner.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_runner.py
deleted file mode 100644 (file)
index 31dbcd4..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-
-import unittest
-import sys
-import os
-
-def run_unittests(modules):
-    suite = unittest.TestSuite()
-    for m in modules:
-        mod = __import__(m)
-        for name in dir(mod):
-            obj = getattr(mod, name)
-            if name.startswith("Test") and issubclass(obj, unittest.TestCase):
-                suite.addTest(unittest.TestLoader().loadTestsFromTestCase(obj))
-
-    ts = unittest.TextTestRunner().run(unittest.TestSuite(suite))
-    if ts.errors or ts.failures:
-        sys.exit(1)
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_ssl.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_ssl.py
deleted file mode 100755 (executable)
index e96be6a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-
-import test_runner
-import test_util
-
-if __name__ == '__main__':
-    modules = ['ssl_lifecycle']
-    test_util.ensure_ssl_auth_user()
-    test_runner.run_unittests(modules)
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_util.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/test_util.py
deleted file mode 100644 (file)
index 16f6672..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-import subprocess
-import socket
-import sys
-import os
-import os.path
-
-def ensure_ssl_auth_user():
-    user = 'O=client,CN=%s' % socket.gethostname()
-    rabbitmqctl(['stop_app'])
-    rabbitmqctl(['reset'])
-    rabbitmqctl(['start_app'])
-    rabbitmqctl(['add_user', user, 'foo'])
-    rabbitmqctl(['clear_password', user])
-    rabbitmqctl(['set_permissions', user, '.*', '.*', '.*'])
-
-def enable_implicit_connect():
-    switch_config(implicit_connect='true', default_user='[{login, "guest"}, {passcode, "guest"}]')
-
-def disable_implicit_connect():
-    switch_config(implicit_connect='false', default_user='[]')
-
-def enable_default_user():
-    switch_config(default_user='[{login, "guest"}, {passcode, "guest"}]')
-
-def disable_default_user():
-    switch_config(default_user='[]')
-
-def switch_config(implicit_connect='', default_user=''):
-    cmd = 'application:stop(rabbitmq_stomp),'
-    if implicit_connect:
-        cmd += 'application:set_env(rabbitmq_stomp,implicit_connect,' + implicit_connect + '),'
-    if default_user:
-        cmd += 'application:set_env(rabbitmq_stomp,default_user,' + default_user + '),'
-    cmd += 'application:start(rabbitmq_stomp).'
-    rabbitmqctl(['eval', cmd])
-
-def rabbitmqctl(args):
-    ctl = os.getenv('RABBITMQCTL')
-    cmdline = [ctl, '-n', os.getenv('RABBITMQ_NODENAME')]
-    cmdline.extend(args)
-    subprocess.check_call(cmdline)
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/transactions.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/transactions.py
deleted file mode 100644 (file)
index d4f166b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-import unittest
-import stomp
-import base
-import time
-
-class TestTransactions(base.BaseTest):
-
-    def test_tx_commit(self):
-        ''' Test TX with a COMMIT and ensure messages are delivered '''
-        destination = "/exchange/amq.fanout"
-        tx = "test.tx"
-
-        self.listener.reset()
-        self.subscribe_dest(self.conn, destination, None)
-        self.conn.begin(transaction=tx)
-        self.conn.send(destination, "hello!", transaction=tx)
-        self.conn.send(destination, "again!")
-
-        ## should see the second message
-        self.assertTrue(self.listener.await(3))
-        self.assertEquals(1, len(self.listener.messages))
-        self.assertEquals("again!", self.listener.messages[0]['message'])
-
-        ## now look for the first message
-        self.listener.reset()
-        self.conn.commit(transaction=tx)
-        self.assertTrue(self.listener.await(3))
-        self.assertEquals(1, len(self.listener.messages),
-                          "Missing committed message")
-        self.assertEquals("hello!", self.listener.messages[0]['message'])
-
-    def test_tx_abort(self):
-        ''' Test TX with an ABORT and ensure messages are discarded '''
-        destination = "/exchange/amq.fanout"
-        tx = "test.tx"
-
-        self.listener.reset()
-        self.subscribe_dest(self.conn, destination, None)
-        self.conn.begin(transaction=tx)
-        self.conn.send(destination, "hello!", transaction=tx)
-        self.conn.send(destination, "again!")
-
-        ## should see the second message
-        self.assertTrue(self.listener.await(3))
-        self.assertEquals(1, len(self.listener.messages))
-        self.assertEquals("again!", self.listener.messages[0]['message'])
-
-        ## now look for the first message to be discarded
-        self.listener.reset()
-        self.conn.abort(transaction=tx)
-        self.assertFalse(self.listener.await(3))
-        self.assertEquals(0, len(self.listener.messages),
-                          "Unexpected committed message")
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/x_queue_name.py b/rabbitmq-server/deps/rabbitmq_stomp/test/python_SUITE_data/src/x_queue_name.py
deleted file mode 100644 (file)
index 0829578..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-import unittest
-import stomp
-import pika
-import base
-import time
-import os
-
-class TestUserGeneratedQueueName(base.BaseTest):
-
-    def test_exchange_dest(self):
-        queueName='my-user-generated-queue-name-exchange'
-
-        # subscribe
-        self.subscribe_dest(
-                self.conn,
-                '/exchange/amq.direct/test',
-                None,
-                headers={ 'x-queue-name': queueName }
-                )
-
-        connection = pika.BlockingConnection(
-                pika.ConnectionParameters( host='localhost', port=int(os.environ["AMQP_PORT"])))
-        channel = connection.channel()
-
-        # publish a message to the named queue
-        channel.basic_publish(
-                exchange='',
-                routing_key=queueName,
-                body='Hello World!')
-
-        # check if we receive the message from the STOMP subscription
-        self.assertTrue(self.listener.await(2), "initial message not received")
-        self.assertEquals(1, len(self.listener.messages))
-
-        self.conn.disconnect()
-        connection.close()
-
-    def test_topic_dest(self):
-        queueName='my-user-generated-queue-name-topic'
-
-        # subscribe
-        self.subscribe_dest(
-                self.conn,
-                '/topic/test',
-                None,
-                headers={ 'x-queue-name': queueName }
-                )
-
-        connection = pika.BlockingConnection(
-                pika.ConnectionParameters( host='localhost', port=int(os.environ["AMQP_PORT"])))
-        channel = connection.channel()
-
-        # publish a message to the named queue
-        channel.basic_publish(
-                exchange='',
-                routing_key=queueName,
-                body='Hello World!')
-
-        # check if we receive the message from the STOMP subscription
-        self.assertTrue(self.listener.await(2), "initial message not received")
-        self.assertEquals(1, len(self.listener.messages))
-
-        self.conn.disconnect()
-        connection.close()
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/src/rabbit_stomp_client.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/src/rabbit_stomp_client.erl
deleted file mode 100644 (file)
index a4acb3e..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developers of the Original Code are Rabbit Technologies Ltd.
-%%
-%%   Copyright (C) 2011 Rabbit Technologies Ltd.
-%%
-%%   All Rights Reserved.
-%%
-%%   Contributor(s): ______________________________________.
-%%
-
-%% The stupidest client imaginable, just for testing.
-
--module(rabbit_stomp_client).
-
--export([connect/1, connect/2, connect/4, disconnect/1, send/2, send/3, send/4, recv/1]).
-
--include("rabbit_stomp_frame.hrl").
-
--define(TIMEOUT, 1000). % milliseconds
-
-connect(Port)  -> connect0([], "guest", "guest", Port).
-connect(V, Port) -> connect0([{"accept-version", V}], "guest", "guest", Port).
-connect(V, Login, Pass, Port) -> connect0([{"accept-version", V}], Login, Pass, Port).
-
-connect0(Version, Login, Pass, Port) ->
-    %% The default port is 61613 but it's in the middle of the ephemeral
-    %% ports range on many operating systems. Therefore, there is a
-    %% chance this port is already in use. Let's use a port close to the
-    %% AMQP default port.
-    {ok, Sock} = gen_tcp:connect(localhost, Port, [{active, false}, binary]),
-    Client0 = recv_state(Sock),
-    send(Client0, "CONNECT", [{"login", Login},
-                              {"passcode", Pass} | Version]),
-    {#stomp_frame{command = "CONNECTED"}, Client1} = recv(Client0),
-    {ok, Client1}.
-
-disconnect(Client = {Sock, _}) ->
-    send(Client, "DISCONNECT"),
-    gen_tcp:close(Sock).
-
-send(Client, Command) ->
-    send(Client, Command, []).
-
-send(Client, Command, Headers) ->
-    send(Client, Command, Headers, []).
-
-send({Sock, _}, Command, Headers, Body) ->
-    Frame = rabbit_stomp_frame:serialize(
-              #stomp_frame{command     = list_to_binary(Command),
-                           headers     = Headers,
-                           body_iolist = Body}),
-    gen_tcp:send(Sock, Frame).
-
-recv_state(Sock) ->
-    {Sock, []}.
-
-recv({_Sock, []} = Client) ->
-    recv(Client, rabbit_stomp_frame:initial_state(), 0);
-recv({Sock, [Frame | Frames]}) ->
-    {Frame, {Sock, Frames}}.
-
-recv(Client = {Sock, _}, FrameState, Length) ->
-    {ok, Payload} = gen_tcp:recv(Sock, Length, ?TIMEOUT),
-    parse(Payload, Client, FrameState, Length).
-
-parse(Payload, Client = {Sock, FramesRev}, FrameState, Length) ->
-    case rabbit_stomp_frame:parse(Payload, FrameState) of
-        {ok, Frame, <<>>} ->
-            recv({Sock, lists:reverse([Frame | FramesRev])});
-        {ok, Frame, <<"\n">>} ->
-            recv({Sock, lists:reverse([Frame | FramesRev])});
-        {ok, Frame, Rest} ->
-            parse(Rest, {Sock, [Frame | FramesRev]},
-                  rabbit_stomp_frame:initial_state(), Length);
-        {more, NewState} ->
-            recv(Client, NewState, 0)
-    end.
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/src/rabbit_stomp_publish_test.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/src/rabbit_stomp_publish_test.erl
deleted file mode 100644 (file)
index 6ad509e..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developers of the Original Code are Rabbit Technologies Ltd.
-%%
-%%   Copyright (C) 2011 Rabbit Technologies Ltd.
-%%
-%%   All Rights Reserved.
-%%
-%%   Contributor(s): ______________________________________.
-%%
--module(rabbit_stomp_publish_test).
-
--export([run/0]).
-
--include("rabbit_stomp_frame.hrl").
-
--define(DESTINATION, "/queue/test").
-
--define(MICROS_PER_UPDATE,     5000000).
--define(MICROS_PER_UPDATE_MSG, 100000).
--define(MICROS_PER_SECOND,     1000000).
-
-%% A very simple publish-and-consume-as-fast-as-you-can test.
-
-run() ->
-    [put(K, 0) || K <- [sent, recd, last_sent, last_recd]],
-    put(last_ts, time_compat:monotonic_time()),
-    {ok, Pub} = rabbit_stomp_client:connect(),
-    {ok, Recv} = rabbit_stomp_client:connect(),
-    Self = self(),
-    spawn(fun() -> publish(Self, Pub, 0, time_compat:monotonic_time()) end),
-    rabbit_stomp_client:send(
-      Recv, "SUBSCRIBE", [{"destination", ?DESTINATION}]),
-    spawn(fun() -> recv(Self, Recv, 0, time_compat:monotonic_time()) end),
-    report().
-
-report() ->
-    receive
-        {sent, C} -> put(sent, C);
-        {recd, C} -> put(recd, C)
-    end,
-    Diff = time_compat:convert_time_unit(
-      time_compat:monotonic_time() - get(last_ts), native, microseconds),
-    case Diff > ?MICROS_PER_UPDATE of
-        true  -> S = get(sent) - get(last_sent),
-                 R = get(recd) - get(last_recd),
-                 put(last_sent, get(sent)),
-                 put(last_recd, get(recd)),
-                 put(last_ts, time_compat:monotonic_time()),
-                 io:format("Send ~p msg/s | Recv ~p msg/s~n",
-                           [trunc(S * ?MICROS_PER_SECOND / Diff),
-                            trunc(R * ?MICROS_PER_SECOND / Diff)]);
-        false -> ok
-    end,
-    report().
-
-publish(Owner, Client, Count, TS) ->
-    rabbit_stomp_client:send(
-      Client, "SEND", [{"destination", ?DESTINATION}],
-      [integer_to_list(Count)]),
-    Diff = time_compat:convert_time_unit(
-      time_compat:monotonic_time() - TS, native, microseconds),
-    case Diff > ?MICROS_PER_UPDATE_MSG of
-        true  -> Owner ! {sent, Count + 1},
-                 publish(Owner, Client, Count + 1,
-                         time_compat:monotonic_time());
-        false -> publish(Owner, Client, Count + 1, TS)
-    end.
-
-recv(Owner, Client0, Count, TS) ->
-    {#stomp_frame{body_iolist = Body}, Client1} =
-        rabbit_stomp_client:recv(Client0),
-    BodyInt = list_to_integer(binary_to_list(iolist_to_binary(Body))),
-    Count = BodyInt,
-    Diff = time_compat:convert_time_unit(
-      time_compat:monotonic_time() - TS, native, microseconds),
-    case Diff > ?MICROS_PER_UPDATE_MSG of
-        true  -> Owner ! {recd, Count + 1},
-                 recv(Owner, Client1, Count + 1,
-                      time_compat:monotonic_time());
-        false -> recv(Owner, Client1, Count + 1, TS)
-    end.
-
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/src/test.config b/rabbitmq-server/deps/rabbitmq_stomp/test/src/test.config
deleted file mode 100644 (file)
index 5968824..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-[{rabbitmq_stomp, [{default_user,     []},
-                   {ssl_cert_login,   true},
-                   {tcp_listeners,    [5673]},
-                   {ssl_listeners,    [5674]}
-                  ]},
- {rabbit, [{ssl_options, [{cacertfile,"%%CERTS_DIR%%/testca/cacert.pem"},
-                          {certfile,"%%CERTS_DIR%%/server/cert.pem"},
-                          {keyfile,"%%CERTS_DIR%%/server/key.pem"},
-                          {verify,verify_peer},
-                          {fail_if_no_peer_cert,true}
-                         ]}
-          ]}
-].
diff --git a/rabbitmq-server/deps/rabbitmq_stomp/test/util_SUITE.erl b/rabbitmq-server/deps/rabbitmq_stomp/test/util_SUITE.erl
deleted file mode 100644 (file)
index c234d58..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(util_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include_lib("amqp_client/include/rabbit_routing_prefixes.hrl").
--include("rabbit_stomp_frame.hrl").
--compile(export_all).
-
-all() -> [
-    longstr_field,
-    message_properties,
-    message_headers,
-    minimal_message_headers_with_no_custom,
-    headers_post_process,
-    headers_post_process_noop_replyto,
-    headers_post_process_noop2,
-    negotiate_version_both_empty,
-    negotiate_version_no_common,
-    negotiate_version_simple_common,
-    negotiate_version_two_choice_common,
-    negotiate_version_two_choice_common_out_of_order,
-    negotiate_version_two_choice_big_common,
-    negotiate_version_choice_mismatched_length,
-    negotiate_version_choice_duplicates,
-    trim_headers,
-    ack_mode_auto,
-    ack_mode_auto_default,
-    ack_mode_client,
-    ack_mode_client_individual,
-    consumer_tag_id,
-    consumer_tag_destination,
-    consumer_tag_invalid,
-    parse_valid_message_id,
-    parse_invalid_message_id
-    ].
-
-
-%%--------------------------------------------------------------------
-%% Header Processing Tests
-%%--------------------------------------------------------------------
-
-longstr_field(_) ->
-    {<<"ABC">>, longstr, <<"DEF">>} =
-        rabbit_stomp_util:longstr_field("ABC", "DEF").
-
-message_properties(_) ->
-    Headers = [
-                {"content-type", "text/plain"},
-                {"content-encoding", "UTF-8"},
-                {"persistent", "true"},
-                {"priority", "1"},
-                {"correlation-id", "123"},
-                {"reply-to", "something"},
-                {"expiration", "my-expiration"},
-                {"amqp-message-id", "M123"},
-                {"timestamp", "123456"},
-                {"type", "freshly-squeezed"},
-                {"user-id", "joe"},
-                {"app-id", "joe's app"},
-                {"str", "foo"},
-                {"int", "123"}
-              ],
-
-    #'P_basic'{
-                content_type     = <<"text/plain">>,
-                content_encoding = <<"UTF-8">>,
-                delivery_mode    = 2,
-                priority         = 1,
-                correlation_id   = <<"123">>,
-                reply_to         = <<"something">>,
-                expiration       = <<"my-expiration">>,
-                message_id       = <<"M123">>,
-                timestamp        = 123456,
-                type             = <<"freshly-squeezed">>,
-                user_id          = <<"joe">>,
-                app_id           = <<"joe's app">>,
-                headers          = [{<<"str">>, longstr, <<"foo">>},
-                                    {<<"int">>, longstr, <<"123">>}]
-              } =
-        rabbit_stomp_util:message_properties(#stomp_frame{headers = Headers}).
-
-message_headers(_) ->
-    Properties = #'P_basic'{
-      headers          = [{<<"str">>, longstr, <<"foo">>},
-                          {<<"int">>, signedint, 123}],
-      content_type     = <<"text/plain">>,
-      content_encoding = <<"UTF-8">>,
-      delivery_mode    = 2,
-      priority         = 1,
-      correlation_id   = 123,
-      reply_to         = <<"something">>,
-      message_id       = <<"M123">>,
-      timestamp        = 123456,
-      type             = <<"freshly-squeezed">>,
-      user_id          = <<"joe">>,
-      app_id           = <<"joe's app">>},
-
-    Headers = rabbit_stomp_util:message_headers(Properties),
-
-    Expected = [
-                {"content-type", "text/plain"},
-                {"content-encoding", "UTF-8"},
-                {"persistent", "true"},
-                {"priority", "1"},
-                {"correlation-id", "123"},
-                {"reply-to", "something"},
-                {"expiration", "my-expiration"},
-                {"amqp-message-id", "M123"},
-                {"timestamp", "123456"},
-                {"type", "freshly-squeezed"},
-                {"user-id", "joe"},
-                {"app-id", "joe's app"},
-                {"str", "foo"},
-                {"int", "123"}
-               ],
-
-    [] = lists:subtract(Headers, Expected).
-
-minimal_message_headers_with_no_custom(_) ->
-    Properties = #'P_basic'{},
-
-    Headers = rabbit_stomp_util:message_headers(Properties),
-    Expected = [
-                {"content-type", "text/plain"},
-                {"content-encoding", "UTF-8"},
-                {"amqp-message-id", "M123"}
-               ],
-
-    [] = lists:subtract(Headers, Expected).
-
-headers_post_process(_) ->
-    Headers  = [{"header1", "1"},
-                {"header2", "12"},
-                {"reply-to", "something"}],
-    Expected = [{"header1", "1"},
-                {"header2", "12"},
-                {"reply-to", "/reply-queue/something"}],
-    [] = lists:subtract(
-           rabbit_stomp_util:headers_post_process(Headers), Expected).
-
-headers_post_process_noop_replyto(_) ->
-    [begin
-         Headers = [{"reply-to", Prefix ++ "/something"}],
-         Headers = rabbit_stomp_util:headers_post_process(Headers)
-     end || Prefix <- rabbit_routing_util:dest_prefixes()].
-
-headers_post_process_noop2(_) ->
-    Headers  = [{"header1", "1"},
-                {"header2", "12"}],
-    Expected = [{"header1", "1"},
-                {"header2", "12"}],
-    [] = lists:subtract(
-           rabbit_stomp_util:headers_post_process(Headers), Expected).
-
-negotiate_version_both_empty(_) ->
-    {error, no_common_version} = rabbit_stomp_util:negotiate_version([],[]).
-
-negotiate_version_no_common(_) ->
-    {error, no_common_version} =
-        rabbit_stomp_util:negotiate_version(["1.2"],["1.3"]).
-
-negotiate_version_simple_common(_) ->
-    {ok, "1.2"} =
-        rabbit_stomp_util:negotiate_version(["1.2"],["1.2"]).
-
-negotiate_version_two_choice_common(_) ->
-    {ok, "1.3"} =
-        rabbit_stomp_util:negotiate_version(["1.2", "1.3"],["1.2", "1.3"]).
-
-negotiate_version_two_choice_common_out_of_order(_) ->
-    {ok, "1.3"} =
-        rabbit_stomp_util:negotiate_version(["1.3", "1.2"],["1.2", "1.3"]).
-
-negotiate_version_two_choice_big_common(_) ->
-    {ok, "1.20.23"} =
-        rabbit_stomp_util:negotiate_version(["1.20.23", "1.30.456"],
-                                            ["1.20.23", "1.30.457"]).
-negotiate_version_choice_mismatched_length(_) ->
-    {ok, "1.2.3"} =
-        rabbit_stomp_util:negotiate_version(["1.2", "1.2.3"],
-                                            ["1.2.3", "1.2"]).
-negotiate_version_choice_duplicates(_) ->
-    {ok, "1.2"} =
-        rabbit_stomp_util:negotiate_version(["1.2", "1.2"],
-                                            ["1.2", "1.2"]).
-trim_headers(_) ->
-    #stomp_frame{headers = [{"one", "foo"}, {"two", "baz "}]} =
-        rabbit_stomp_util:trim_headers(
-          #stomp_frame{headers = [{"one", "  foo"}, {"two", " baz "}]}).
-
-%%--------------------------------------------------------------------
-%% Frame Parsing Tests
-%%--------------------------------------------------------------------
-
-ack_mode_auto(_) ->
-    Frame = #stomp_frame{headers = [{"ack", "auto"}]},
-    {auto, _} = rabbit_stomp_util:ack_mode(Frame).
-
-ack_mode_auto_default(_) ->
-    Frame = #stomp_frame{headers = []},
-    {auto, _} = rabbit_stomp_util:ack_mode(Frame).
-
-ack_mode_client(_) ->
-    Frame = #stomp_frame{headers = [{"ack", "client"}]},
-    {client, true} = rabbit_stomp_util:ack_mode(Frame).
-
-ack_mode_client_individual(_) ->
-    Frame = #stomp_frame{headers = [{"ack", "client-individual"}]},
-    {client, false} = rabbit_stomp_util:ack_mode(Frame).
-
-consumer_tag_id(_) ->
-    Frame = #stomp_frame{headers = [{"id", "foo"}]},
-    {ok, <<"T_foo">>, _} = rabbit_stomp_util:consumer_tag(Frame).
-
-consumer_tag_destination(_) ->
-    Frame = #stomp_frame{headers = [{"destination", "foo"}]},
-    {ok, <<"Q_foo">>, _} = rabbit_stomp_util:consumer_tag(Frame).
-
-consumer_tag_invalid(_) ->
-    Frame = #stomp_frame{headers = []},
-    {error, missing_destination_header} = rabbit_stomp_util:consumer_tag(Frame).
-
-%%--------------------------------------------------------------------
-%% Message ID Parsing Tests
-%%--------------------------------------------------------------------
-
-parse_valid_message_id(_) ->
-    {ok, {<<"bar">>, "abc", 123}} =
-        rabbit_stomp_util:parse_message_id("bar@@abc@@123").
-
-parse_invalid_message_id(_) ->
-    {error, invalid_message_id} =
-        rabbit_stomp_util:parse_message_id("blah").
-
diff --git a/rabbitmq-server/deps/rabbitmq_top/build.config b/rabbitmq-server/deps/rabbitmq_top/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_top/erlang.mk b/rabbitmq-server/deps/rabbitmq_top/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_top/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_top/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_tracing/build.config b/rabbitmq-server/deps/rabbitmq_tracing/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_tracing/erlang.mk b/rabbitmq-server/deps/rabbitmq_tracing/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_tracing/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_tracing/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_tracing/test/rabbit_tracing_SUITE.erl b/rabbitmq-server/deps/rabbitmq_tracing/test/rabbit_tracing_SUITE.erl
deleted file mode 100644 (file)
index 675d87a..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_tracing_SUITE).
-
--compile(export_all).
-
--define(LOG_DIR, "/var/tmp/rabbitmq-tracing/").
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
--include_lib("rabbitmq_management/include/rabbit_mgmt_test.hrl").
-
--import(rabbit_misc, [pget/2]).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                tracing_test,
-                                tracing_validation_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    %% initializes httpc
-    inets:start(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-
-tracing_test(Config) ->
-    case filelib:is_dir(?LOG_DIR) of
-        true -> {ok, Files} = file:list_dir(?LOG_DIR),
-                [ok = file:delete(?LOG_DIR ++ F) || F <- Files];
-        _    -> ok
-    end,
-
-    [] = http_get(Config, "/traces/%2f/"),
-    [] = http_get(Config, "/trace-files/"),
-
-    Args = [{format,  <<"json">>},
-            {pattern, <<"#">>}],
-    http_put(Config, "/traces/%2f/test", Args, ?NO_CONTENT),
-    assert_list([[{name,    <<"test">>},
-                  {format,  <<"json">>},
-                  {pattern, <<"#">>}]], http_get(Config, "/traces/%2f/")),
-    assert_item([{name,    <<"test">>},
-                 {format,  <<"json">>},
-                 {pattern, <<"#">>}], http_get(Config, "/traces/%2f/test")),
-
-    Ch = rabbit_ct_client_helpers:open_channel(Config),
-    amqp_channel:cast(Ch, #'basic.publish'{ exchange    = <<"amq.topic">>,
-                                            routing_key = <<"key">> },
-                      #amqp_msg{props   = #'P_basic'{},
-                                payload = <<"Hello world">>}),
-
-    rabbit_ct_client_helpers:close_channel(Ch),
-
-    timer:sleep(100),
-
-    http_delete(Config, "/traces/%2f/test", ?NO_CONTENT),
-    [] = http_get(Config, "/traces/%2f/"),
-    assert_list([[{name, <<"test.log">>}]], http_get(Config, "/trace-files/")),
-    %% This is a bit cheeky as the log is actually one JSON doc per
-    %% line and we assume here it's only one line
-    assert_item([{type,         <<"published">>},
-                 {exchange,     <<"amq.topic">>},
-                 {routing_keys, [<<"key">>]},
-                 {payload,      base64:encode(<<"Hello world">>)}],
-                http_get(Config, "/trace-files/test.log")),
-    http_delete(Config, "/trace-files/test.log", ?NO_CONTENT),
-
-    passed.
-
-tracing_validation_test(Config) ->
-    Path = "/traces/%2f/test",
-    http_put(Config, Path, [{pattern,           <<"#">>}],    ?BAD_REQUEST),
-    http_put(Config, Path, [{format,            <<"json">>}], ?BAD_REQUEST),
-    http_put(Config, Path, [{format,            <<"ebcdic">>},
-                    {pattern,           <<"#">>}],    ?BAD_REQUEST),
-    http_put(Config, Path, [{format,            <<"text">>},
-                    {pattern,           <<"#">>},
-                    {max_payload_bytes, <<"abc">>}],  ?BAD_REQUEST),
-    http_put(Config, Path, [{format,            <<"json">>},
-                    {pattern,           <<"#">>},
-                    {max_payload_bytes, 1000}],       ?NO_CONTENT),
-    http_delete(Config, Path, ?NO_CONTENT),
-
-    passed.
-
-%%---------------------------------------------------------------------------
-%% TODO: Below is copied from rabbit_mgmt_test_http,
-%%       should be moved to use rabbit_mgmt_test_util once rabbitmq_management
-%%       is moved to Common Test
-
-http_get(Config, Path) ->
-    http_get(Config, Path, ?OK).
-
-http_get(Config, Path, CodeExp) ->
-    http_get(Config, Path, "guest", "guest", CodeExp).
-
-http_get(Config, Path, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, get, Path, [auth_header(User, Pass)]),
-    assert_code(CodeExp, CodeAct, "GET", Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-http_put(Config, Path, List, CodeExp) ->
-    http_put_raw(Config, Path, format_for_upload(List), CodeExp).
-
-format_for_upload(List) ->
-    iolist_to_binary(mochijson2:encode({struct, List})).
-
-http_put_raw(Config, Path, Body, CodeExp) ->
-    http_upload_raw(Config, put, Path, Body, "guest", "guest", CodeExp).
-
-http_upload_raw(Config, Type, Path, Body, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, Type, Path, [auth_header(User, Pass)], Body),
-    assert_code(CodeExp, CodeAct, Type, Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-http_delete(Config, Path, CodeExp) ->
-    http_delete(Config, Path, "guest", "guest", CodeExp).
-
-http_delete(Config, Path, User, Pass, CodeExp) ->
-    {ok, {{_HTTP, CodeAct, _}, Headers, ResBody}} =
-        req(Config, delete, Path, [auth_header(User, Pass)]),
-    assert_code(CodeExp, CodeAct, "DELETE", Path, ResBody),
-    decode(CodeExp, Headers, ResBody).
-
-assert_code(CodeExp, CodeAct, Type, Path, Body) ->
-    case CodeExp of
-        CodeAct -> ok;
-        _       -> throw({expected, CodeExp, got, CodeAct, type, Type,
-                          path, Path, body, Body})
-    end.
-
-mgmt_port(Config) ->
-    config_port(Config, tcp_port_mgmt).
-
-config_port(Config, PortKey) ->
-    rabbit_ct_broker_helpers:get_node_config(Config, 0, PortKey).
-
-uri_base_from(Config) ->
-    binary_to_list(
-      rabbit_mgmt_format:print(
-        "http://localhost:~w/api",
-        [mgmt_port(Config)])).
-
-req(Config, Type, Path, Headers) ->
-    httpc:request(Type, {uri_base_from(Config) ++ Path, Headers}, ?HTTPC_OPTS, []).
-
-req(Config, Type, Path, Headers, Body) ->
-    httpc:request(Type, {uri_base_from(Config) ++ Path, Headers, "application/json", Body},
-                  ?HTTPC_OPTS, []).
-
-decode(?OK, _Headers,  ResBody) -> cleanup(mochijson2:decode(ResBody));
-decode(_,    Headers, _ResBody) -> Headers.
-
-cleanup(L) when is_list(L) ->
-    [cleanup(I) || I <- L];
-cleanup({struct, I}) ->
-    cleanup(I);
-cleanup({K, V}) when is_binary(K) ->
-    {list_to_atom(binary_to_list(K)), cleanup(V)};
-cleanup(I) ->
-    I.
-
-auth_header(Username, Password) ->
-    {"Authorization",
-     "Basic " ++ binary_to_list(base64:encode(Username ++ ":" ++ Password))}.
-
-%%---------------------------------------------------------------------------
-
-assert_list(Exp, Act) ->
-    case length(Exp) == length(Act) of
-        true  -> ok;
-        false -> throw({expected, Exp, actual, Act})
-    end,
-    [case length(lists:filter(fun(ActI) -> test_item(ExpI, ActI) end, Act)) of
-         1 -> ok;
-         N -> throw({found, N, ExpI, in, Act})
-     end || ExpI <- Exp].
-
-assert_item(Exp, Act) ->
-    case test_item0(Exp, Act) of
-        [] -> ok;
-        Or -> throw(Or)
-    end.
-
-test_item(Exp, Act) ->
-    case test_item0(Exp, Act) of
-        [] -> true;
-        _  -> false
-    end.
-
-test_item0(Exp, Act) ->
-    [{did_not_find, ExpI, in, Act} || ExpI <- Exp,
-                                      not lists:member(ExpI, Act)].
diff --git a/rabbitmq-server/deps/rabbitmq_trust_store/build.config b/rabbitmq-server/deps/rabbitmq_trust_store/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_trust_store/erlang.mk b/rabbitmq-server/deps/rabbitmq_trust_store/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_trust_store/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_trust_store/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_trust_store/test/system_SUITE.erl b/rabbitmq-server/deps/rabbitmq_trust_store/test/system_SUITE.erl
deleted file mode 100644 (file)
index c9a51b3..0000000
+++ /dev/null
@@ -1,679 +0,0 @@
--module(system_SUITE).
--compile([export_all]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--define(SERVER_REJECT_CLIENT, {tls_alert, "unknown ca"}).
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                 library,
-                                 invasive_SSL_option_change,
-                                 validation_success_for_AMQP_client,
-                                 validation_failure_for_AMQP_client,
-                                 validate_chain,
-                                 validate_longer_chain,
-                                 validate_chain_without_whitelisted,
-                                 whitelisted_certificate_accepted_from_AMQP_client_regardless_of_validation_to_root,
-                                 removed_certificate_denied_from_AMQP_client,
-                                 installed_certificate_accepted_from_AMQP_client,
-                                 whitelist_directory_DELTA,
-                                 replaced_whitelisted_certificate_should_be_accepted,
-                                 ensure_configuration_using_binary_strings_is_handled,
-                                 ignore_corrupt_cert,
-                                 ignore_same_cert_with_different_name,
-                                 list
-                               ]}
-    ].
-
-suite() ->
-    [{timetrap, {seconds, 60}}].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_extra_tcp_ports, [tcp_port_amqp_tls_extra]}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    TestCaseDir = rabbit_ct_helpers:config_to_testcase_name(Config, Testcase),
-    WhitelistDir = filename:join([?config(rmq_certsdir, Config), "trust_store", TestCaseDir]),
-    ok = filelib:ensure_dir(WhitelistDir),
-    ok = file:make_dir(WhitelistDir),
-    Config1 = rabbit_ct_helpers:set_config(Config, {whitelist_dir, WhitelistDir}),
-    rabbit_ct_helpers:testcase_started(Config1, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-
-%% -------------------------------------------------------------------
-%% Testsuite cases
-%% -------------------------------------------------------------------
-
-library(_) ->
-     %% Given: Makefile.
-     {_Root, _Certificate, _Key} = ct_helper:make_certs(),
-     ok.
-
-invasive_SSL_option_change(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-          ?MODULE, invasive_SSL_option_change1, []).
-
-invasive_SSL_option_change1() ->
-    %% Given: Rabbit is started with the boot-steps in the
-    %% Trust-Store's OTP Application file.
-
-    %% When: we get Rabbit's SSL options.
-    {ok, Options} = application:get_env(rabbit, ssl_options),
-
-    %% Then: all necessary settings are correct.
-    verify_peer             = proplists:get_value(verify, Options),
-    true                    = proplists:get_value(fail_if_no_peer_cert, Options),
-    {Verifyfun, _UserState} = proplists:get_value(verify_fun, Options),
-
-    {module, rabbit_trust_store} = erlang:fun_info(Verifyfun, module),
-    {name,   whitelisted}        = erlang:fun_info(Verifyfun, name),
-    ok.
-
-validation_success_for_AMQP_client(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, validation_success_for_AMQP_client1, [Config]).
-
-validation_success_for_AMQP_client1(Config) ->
-    AuthorityInfo = {Root, _AuthorityKey} = erl_make_certs:make_cert([{key, dsa}]),
-    {Certificate, Key} = chain(AuthorityInfo),
-    {Certificate2, Key2} = chain(AuthorityInfo),
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-    %% When: Rabbit accepts just this one authority's certificate
-    %% (i.e. these are options that'd be in the configuration
-    %% file).
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                     {cert, Certificate2},
-                                                     {key, Key2} | cfg()], 1),
-
-    %% Then: a client presenting a certifcate rooted at the same
-    %% authority connects successfully.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                           port = Port,
-                                                           ssl_options = [{cert, Certificate},
-                                                                          {key, Key}]}),
-
-    %% Clean: client & server TLS/TCP.
-    ok = amqp_connection:close(Con),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-
-validation_failure_for_AMQP_client(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, validation_failure_for_AMQP_client1, [Config]).
-
-validation_failure_for_AMQP_client1(Config) ->
-    %% Given: a root certificate and a certificate rooted with another
-    %% authority.
-    {Root, Cert, Key}      = ct_helper:make_certs(),
-    {_,  CertOther, KeyOther}    = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    %% When: Rabbit accepts certificates rooted with just one
-    %% particular authority.
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                     {cert, Cert},
-                                                     {key, Key} | cfg()], 1),
-
-    %% Then: a client presenting a certificate rooted with another
-    %% authority is REJECTED.
-    {error, ?SERVER_REJECT_CLIENT} =
-     amqp_connection:start(#amqp_params_network{host = Host,
-                                                port = Port,
-                                                ssl_options = [{cert, CertOther},
-                                                               {key, KeyOther}]}),
-
-    %% Clean: server TLS/TCP.
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-validate_chain(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, validate_chain1, [Config]).
-
-validate_chain1(Config) ->
-    %% Given: a whitelisted certificate `CertTrusted` AND a CA `RootTrusted`
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {RootTrusted,  CertTrusted, KeyTrusted} = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    ok = whitelist(Config, "alice", CertTrusted,  KeyTrusted),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)}]),
-
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                     {cert, Cert},
-                                                     {key, Key} | cfg()], 1),
-
-    %% When: a client connects and present `RootTrusted` as well as the `CertTrusted`
-    %% Then: the connection is successful.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                           port = Port,
-                                                           ssl_options = [{cacerts, [RootTrusted]},
-                                                                          {cert, CertTrusted},
-                                                                          {key, KeyTrusted}]}),
-
-    %% Clean: client & server TLS/TCP
-    ok = amqp_connection:close(Con),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-validate_longer_chain(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, validate_longer_chain1, [Config]).
-
-validate_longer_chain1(Config) ->
-
-    {Root, Cert, Key} = ct_helper:make_certs(),
-
-    %% Given: a whitelisted certificate `CertTrusted`
-    %% AND a certificate `CertUntrusted` that is not whitelisted with the same root as `CertTrusted`
-    %% AND `CertInter` intermediate CA
-    %% AND `RootTrusted` CA
-    AuthorityInfo = {RootCA, _AuthorityKey} = erl_make_certs:make_cert([{key, dsa}]),
-    Inter = {CertInter, {KindInter, KeyDataInter, _}} = erl_make_certs:make_cert([{key, dsa}, {issuer, AuthorityInfo}]),
-    KeyInter = {KindInter, KeyDataInter},
-    {CertUntrusted, {KindUntrusted, KeyDataUntrusted, _}} = erl_make_certs:make_cert([{key, dsa}, {issuer, Inter}]),
-    KeyUntrusted = {KindUntrusted, KeyDataUntrusted},
-    {CertTrusted, {Kind, KeyData, _}} = erl_make_certs:make_cert([{key, dsa}, {issuer, Inter}]),
-    KeyTrusted = {Kind, KeyData},
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    ok = whitelist(Config, "alice", CertTrusted,  KeyTrusted),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)}]),
-
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                     {cert, Cert},
-                                                     {key, Key} | cfg()], 1),
-
-    %% When: a client connects and present `CertInter` as well as the `CertTrusted`
-    %% Then: the connection is successful.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                           port = Port,
-                                                           ssl_options = [{cacerts, [CertInter]},
-                                                                          {cert, CertTrusted},
-                                                                          {key, KeyTrusted}]}),
-
-    %% When: a client connects and present `RootTrusted` and `CertInter` as well as the `CertTrusted`
-    %% Then: the connection is successful.
-    {ok, Con2} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                            port = Port,
-                                                            ssl_options = [{cacerts, [RootCA, CertInter]},
-                                                                           {cert, CertTrusted},
-                                                                           {key, KeyTrusted}]}),
-
-    %% When: a client connects and present `CertInter` and `RootCA` as well as the `CertTrusted`
-    %% Then: the connection is successful.
-    {ok, Con3} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                            port = Port,
-                                                            ssl_options = [{cacerts, [CertInter, RootCA]},
-                                                                           {cert, CertTrusted},
-                                                                           {key, KeyTrusted}]}),
-
-    % %% When: a client connects and present `CertInter` and `RootCA` but NOT `CertTrusted`
-    % %% Then: the connection is not succcessful
-    {error, ?SERVER_REJECT_CLIENT} =
-        amqp_connection:start(#amqp_params_network{host = Host,
-                                                   port = Port,
-                                                   ssl_options = [{cacerts, [RootCA]},
-                                                                  {cert, CertInter},
-                                                                  {key, KeyInter}]}),
-
-    %% When: a client connects and present `CertUntrusted` and `RootCA` and `CertInter`
-    %% Then: the connection is not succcessful
-    %% TODO: for some reason this returns `bad certifice` rather than `unknown ca`
-    {error, {tls_alert, "bad certificate"}} =
-        amqp_connection:start(#amqp_params_network{host = Host,
-                                                   port = Port,
-                                                   ssl_options = [{cacerts, [RootCA, CertInter]},
-                                                                  {cert, CertUntrusted},
-                                                                  {key, KeyUntrusted}]}),
-    %% Clean: client & server TLS/TCP
-    ok = amqp_connection:close(Con),
-    ok = amqp_connection:close(Con2),
-    ok = amqp_connection:close(Con3),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-validate_chain_without_whitelisted(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, validate_chain_without_whitelisted1, [Config]).
-
-validate_chain_without_whitelisted1(Config) ->
-    %% Given: a certificate `CertUntrusted` that is NOT whitelisted.
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {RootUntrusted,  CertUntrusted, KeyUntrusted} = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)}]),
-
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                     {cert, Cert},
-                                                     {key, Key} | cfg()], 1),
-
-    %% When: Rabbit validates paths
-    %% Then: a client presenting the non-whitelisted certificate `CertUntrusted` and `RootUntrusted`
-    %% is rejected 
-    {error, ?SERVER_REJECT_CLIENT} =
-        amqp_connection:start(#amqp_params_network{host = Host,
-                                                   port = Port,
-                                                   ssl_options = [{cacerts, [RootUntrusted]},
-                                                                  {cert, CertUntrusted},
-                                                                  {key, KeyUntrusted}]}),
-
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-whitelisted_certificate_accepted_from_AMQP_client_regardless_of_validation_to_root(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, whitelisted_certificate_accepted_from_AMQP_client_regardless_of_validation_to_root1, [Config]).
-
-whitelisted_certificate_accepted_from_AMQP_client_regardless_of_validation_to_root1(Config) ->
-    %% Given: a certificate `CertTrusted` AND that it is whitelisted.
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {_,  CertTrusted, KeyTrusted} = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    ok = whitelist(Config, "alice", CertTrusted,  KeyTrusted),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)}]),
-
-    %% When: Rabbit validates paths with a different root `R` than
-    %% that of the certificate `CertTrusted`.
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                      {cert, Cert},
-                                                      {key, Key} | cfg()], 1),
-
-    %% Then: a client presenting the whitelisted certificate `C`
-    %% is allowed.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                          port = Port,
-                                                          ssl_options = [{cert, CertTrusted},
-                                                                         {key, KeyTrusted}]}),
-
-    %% Clean: client & server TLS/TCP
-    ok = amqp_connection:close(Con),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-
-removed_certificate_denied_from_AMQP_client(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, removed_certificate_denied_from_AMQP_client1, [Config]).
-
-removed_certificate_denied_from_AMQP_client1(Config) ->
-    %% Given: a certificate `CertOther` AND that it is whitelisted.
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {_,  CertOther, KeyOther} = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-    ok = whitelist(Config, "bob", CertOther,  KeyOther),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)},
-                                                     {refresh_interval,
-                                                        {seconds, interval()}}]),
-
-    %% When: we wait for at least one second (the accuracy of the
-    %% file system's time), remove the whitelisted certificate,
-    %% then wait for the trust-store to refresh the whitelist.
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                      {cert, Cert},
-                                                      {key, Key} | cfg()], 1),
-
-    wait_for_file_system_time(),
-    ok = delete("bob.pem", Config),
-    wait_for_trust_store_refresh(),
-
-    %% Then: a client presenting the removed whitelisted
-    %% certificate `CertOther` is denied.
-    {error, ?SERVER_REJECT_CLIENT} =
-       amqp_connection:start(#amqp_params_network{host = Host,
-                                                  port = Port,
-                                                  ssl_options = [{cert, CertOther},
-                                                                 {key, KeyOther}]}),
-
-    %% Clean: server TLS/TCP
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-
-installed_certificate_accepted_from_AMQP_client(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, installed_certificate_accepted_from_AMQP_client1, [Config]).
-
-installed_certificate_accepted_from_AMQP_client1(Config) ->
-    %% Given: a certificate `CertOther` which is NOT yet whitelisted.
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {_,  CertOther, KeyOther} = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)},
-                                                    {refresh_interval,
-                                                        {seconds, interval()}}]),
-
-    %% When: we wait for at least one second (the accuracy of the
-    %% file system's time), add a certificate to the directory,
-    %% then wait for the trust-store to refresh the whitelist.
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                      {cert, Cert},
-                                                      {key, Key} | cfg()], 1),
-
-    wait_for_file_system_time(),
-    ok = whitelist(Config, "charlie", CertOther,  KeyOther),
-    wait_for_trust_store_refresh(),
-
-    %% Then: a client presenting the whitelisted certificate `CertOther`
-    %% is allowed.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                          port = Port,
-                                                          ssl_options = [{cert, CertOther},
-                                                                         {key, KeyOther}]}),
-
-    %% Clean: Client & server TLS/TCP
-    ok = amqp_connection:close(Con),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-
-whitelist_directory_DELTA(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, whitelist_directory_DELTA1, [Config]).
-
-whitelist_directory_DELTA1(Config) ->
-    %% Given: a certificate `Root` which Rabbit can use as a
-    %% root certificate to validate agianst AND three
-    %% certificates which clients can present (the first two
-    %% of which are whitelisted).
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-    {Root, Cert, Key} = ct_helper:make_certs(),
-
-    {_,  CertListed1, KeyListed1} = ct_helper:make_certs(),
-    {_,  CertRevoked, KeyRevoked} = ct_helper:make_certs(),
-    {_,  CertListed2, KeyListed2} = ct_helper:make_certs(),
-
-    ok = whitelist(Config, "foo", CertListed1,  KeyListed1),
-    ok = whitelist(Config, "bar", CertRevoked,  KeyRevoked),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)},
-                                                    {refresh_interval,
-                                                     {seconds, interval()}}]),
-
-    %% When: we wait for at least one second (the accuracy
-    %% of the file system's time), delete a certificate and
-    %% a certificate to the directory, then wait for the
-    %% trust-store to refresh the whitelist.
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                      {cert, Cert},
-                                                      {key, Key} | cfg()], 1),
-
-    wait_for_file_system_time(),
-    ok = delete("bar.pem", Config),
-    ok = whitelist(Config, "baz", CertListed2,  KeyListed2),
-    wait_for_trust_store_refresh(),
-
-    %% Then: connectivity to Rabbit is as it should be.
-    {ok, Conn1} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                            port = Port,
-                                                            ssl_options = [{cert, CertListed1},
-                                                                           {key, KeyListed1}]}),
-    {error, ?SERVER_REJECT_CLIENT} =
-        amqp_connection:start(#amqp_params_network{host = Host,
-                                                   port = Port,
-                                                   ssl_options = [{cert, CertRevoked},
-                                                                  {key, KeyRevoked}]}),
-
-    {ok, Conn2} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                            port = Port,
-                                                            ssl_options = [{cert, CertListed2},
-                                                                           {key, KeyListed2}]}),
-
-    %% Clean: delete certificate file, close client & server
-    %% TLS/TCP
-    ok = amqp_connection:close(Conn1),
-    ok = amqp_connection:close(Conn2),
-
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-replaced_whitelisted_certificate_should_be_accepted(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, replaced_whitelisted_certificate_should_be_accepted1, [Config]).
-
-replaced_whitelisted_certificate_should_be_accepted1(Config) ->
-    %% Given: a root certificate and a 2 other certificates
-    {Root, Cert, Key}      = ct_helper:make_certs(),
-    {_,  CertFirst, KeyFirst}    = ct_helper:make_certs(),
-    {_,  CertUpdated, KeyUpdated}    = ct_helper:make_certs(),
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                    {cert, Cert},
-                                                    {key, Key} | cfg()], 1),
-    %% And: the first certificate has been whitelisted
-    ok = whitelist(Config, "bart", CertFirst,  KeyFirst),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, whitelist_dir(Config)},
-                                                  {refresh_interval, {seconds, interval()}}]),
-
-    wait_for_trust_store_refresh(),
-
-    %% verify that the first cert can be used to connect
-    {ok, Con} =
-     amqp_connection:start(#amqp_params_network{host = Host,
-                                                port = Port,
-                                                ssl_options = [{cert, CertFirst},
-                                                               {key, KeyFirst} ]}),
-    %% verify the other certificate is not accepted
-    {error, ?SERVER_REJECT_CLIENT} =
-     amqp_connection:start(#amqp_params_network{host = Host,
-                                                port = Port,
-                                                ssl_options = [{cert, CertUpdated},
-                                                               {key, KeyUpdated} ]}),
-    ok = amqp_connection:close(Con),
-
-    %% When: a whitelisted certicate is replaced with one with the same name
-    ok = whitelist(Config, "bart", CertUpdated,  KeyUpdated),
-
-    wait_for_trust_store_refresh(),
-
-    %% Then: the first certificate should be rejected
-    {error, ?SERVER_REJECT_CLIENT} =
-     amqp_connection:start(#amqp_params_network{host = Host,
-                                                port = Port,
-                                                ssl_options = [{cert, CertFirst},
-                                                               %% disable ssl session caching
-                                                               %% as this ensures the cert
-                                                               %% will be re-verified by the
-                                                               %% server
-                                                               {reuse_sessions, false},
-                                                               {key, KeyFirst} ]}),
-
-    %% And: the updated certificate should allow the user to connect
-    {ok, Con2} =
-     amqp_connection:start(#amqp_params_network{host = Host,
-                                                port = Port,
-                                                ssl_options = [{cert, CertUpdated},
-                                                               {reuse_sessions, false},
-                                                               {key, KeyUpdated} ]}),
-    ok = amqp_connection:close(Con2),
-    %% Clean: server TLS/TCP.
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-
-ensure_configuration_using_binary_strings_is_handled(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, ensure_configuration_using_binary_strings_is_handled1, [Config]).
-
-ensure_configuration_using_binary_strings_is_handled1(Config) ->
-    ok = change_configuration(rabbitmq_trust_store, [{directory, list_to_binary(whitelist_dir(Config))},
-                                                    {refresh_interval,
-                                                        {seconds, interval()}}]).
-
-ignore_corrupt_cert(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, ignore_corrupt_cert1, [Config]).
-
-ignore_corrupt_cert1(Config) ->
-    %% Given: a certificate `CertTrusted` AND that it is whitelisted.
-    %% Given: a corrupt certificate.
-
-    Port = port(Config),
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {_,  CertTrusted, KeyTrusted} = ct_helper:make_certs(),
-
-    WhitelistDir = whitelist_dir(Config),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, WhitelistDir}]),
-    ok = whitelist(Config, "alice", CertTrusted,  KeyTrusted),
-
-    %% When: Rabbit tries to whitelist the corrupt certificate.
-    ok = whitelist(Config, "corrupt", <<48>>,  KeyTrusted),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, WhitelistDir}]),
-
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                      {cert, Cert},
-                                                      {key, Key} | cfg()], 1),
-
-    %% Then: the trust store should keep functioning
-    %% And: a client presenting the whitelisted certificate `CertTrusted`
-    %% is allowed.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                           port = Port,
-                                                           ssl_options = [{cert, CertTrusted},
-                                                                          {key, KeyTrusted}]}),
-
-    %% Clean: client & server TLS/TCP
-    ok = amqp_connection:close(Con),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-ignore_same_cert_with_different_name(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE, ignore_same_cert_with_different_name1, [Config]).
-
-ignore_same_cert_with_different_name1(Config) ->
-    %% Given: a certificate `CertTrusted` AND that it is whitelisted.
-    %% Given: the same certificate saved with a different filename.
-
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-    Port = port(Config),
-    {Root, Cert, Key} = ct_helper:make_certs(),
-    {_,  CertTrusted, KeyTrusted} = ct_helper:make_certs(),
-
-    WhitelistDir = whitelist_dir(Config),
-
-    ok = change_configuration(rabbitmq_trust_store, [{directory, WhitelistDir}]),
-    ok = whitelist(Config, "alice", CertTrusted,  KeyTrusted),
-    %% When: Rabbit tries to insert the duplicate certificate
-    ok = whitelist(Config, "malice", CertTrusted,  KeyTrusted),
-    ok = change_configuration(rabbitmq_trust_store, [{directory, WhitelistDir}]),
-
-    ok = rabbit_networking:start_ssl_listener(Port, [{cacerts, [Root]},
-                                                      {cert, Cert},
-                                                      {key, Key} | cfg()], 1),
-
-    %% Then: the trust store should keep functioning.
-    %% And: a client presenting the whitelisted certificate `CertTrusted`
-    %% is allowed.
-    {ok, Con} = amqp_connection:start(#amqp_params_network{host = Host,
-                                                           port = Port,
-                                                           ssl_options = [{cert, CertTrusted},
-                                                                          {key, KeyTrusted}]}),
-
-    %% Clean: client & server TLS/TCP
-    ok = amqp_connection:close(Con),
-    ok = rabbit_networking:stop_tcp_listener(Port).
-
-list(Config) ->
-    {_Root,  Cert, Key}    = ct_helper:make_certs(),
-    ok = whitelist(Config, "alice", Cert,  Key),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-           ?MODULE,  change_configuration, [rabbitmq_trust_store, [{directory, whitelist_dir(Config)}]]),
-    Certs = rabbit_ct_broker_helpers:rpc(Config, 0,
-           rabbit_trust_store, list, []),
-    % only really tests it isn't totally broken.
-    {match, _} = re:run(Certs, ".*alice\.pem.*").
-
-%% Test Constants
-
-port(Config) ->
-    rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp_tls_extra).
-
-whitelist_dir(Config) ->
-    ?config(whitelist_dir, Config).
-
-interval() ->
-    1.
-
-wait_for_file_system_time() ->
-    timer:sleep(timer:seconds(1)).
-
-wait_for_trust_store_refresh() ->
-    timer:sleep(2 * timer:seconds(interval())).
-
-cfg() ->
-    {ok, Cfg} = application:get_env(rabbit, ssl_options),
-    Cfg.
-
-%% Ancillary
-
-chain(Issuer) ->
-    %% Theses are DER encoded.
-    {Certificate, {Kind, Key, _}} = erl_make_certs:make_cert([{key, dsa}, {issuer, Issuer}]),
-    {Certificate, {Kind, Key}}.
-
-change_configuration(App, Props) ->
-    ok = application:stop(App),
-    ok = change_cfg(App, Props),
-    application:start(App).
-
-change_cfg(_, []) ->
-    ok;
-change_cfg(App, [{Name,Value}|Rest]) ->
-    ok = application:set_env(App, Name, Value),
-    change_cfg(App, Rest).
-
-whitelist(Config, Filename, Certificate, {A, B} = _Key) ->
-    Path = whitelist_dir(Config),
-    ok = erl_make_certs:write_pem(Path, Filename, {Certificate, {A, B, not_encrypted}}),
-    [file:delete(filename:join(Path, K)) || K <- filelib:wildcard("*_key.pem", Path)],
-    ok.
-
-delete(Name, Config) ->
-    F = filename:join([whitelist_dir(Config), Name]),
-    file:delete(F).
diff --git a/rabbitmq-server/deps/rabbitmq_web_dispatch/build.config b/rabbitmq-server/deps/rabbitmq_web_dispatch/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_web_dispatch/erlang.mk b/rabbitmq-server/deps/rabbitmq_web_dispatch/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_web_dispatch/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_web_dispatch/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_web_dispatch/test/priv/www/index.html b/rabbitmq-server/deps/rabbitmq_web_dispatch/test/priv/www/index.html
deleted file mode 100644 (file)
index b9f7cd4..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-  <head>
-    <title>RabbitMQ HTTP Server Test Page</title>
-  </head>
-  <body>
-  </body>
-</html>
diff --git a/rabbitmq-server/deps/rabbitmq_web_dispatch/test/rabbit_web_dispatch_SUITE.erl b/rabbitmq-server/deps/rabbitmq_web_dispatch/test/rabbit_web_dispatch_SUITE.erl
deleted file mode 100644 (file)
index 22acd3e..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_web_dispatch_SUITE).
-
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-                                query_static_resource_test,
-                                add_idempotence_test
-                               ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    inets:start(),
-    rabbit_ct_helpers:log_environment(),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, ?MODULE},
-        {rmq_extra_tcp_ports, [tcp_port_http_extra]}
-      ]),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    Config.
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(_Testcase, Config) ->
-    Config.
-
-end_per_testcase(_Testcase, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-query_static_resource_test(Config) ->
-    Host = rabbit_ct_helpers:get_config(Config, rmq_hostname),
-    Port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_http_extra),
-    rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, query_static_resource_test1, [Config, Host, Port]).
-query_static_resource_test1(_Config, Host, Port) ->
-    %% TODO this is a fairly rubbish test, but not as bad as it was
-    rabbit_web_dispatch:register_static_context(test, [{port, Port}],
-                                                "rabbit_web_dispatch_test",
-                                                ?MODULE, "test/priv/www", "Test"),
-    {ok, {_Status, _Headers, Body}} =
-        httpc:request(format("http://~s:~w/rabbit_web_dispatch_test/index.html", [Host, Port])),
-    ?assert(string:str(Body, "RabbitMQ HTTP Server Test Page") /= 0),
-
-    passed.
-
-add_idempotence_test(Config) ->
-    Port = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_http_extra),
-    rabbit_ct_broker_helpers:rpc(Config, 0, ?MODULE, add_idempotence_test1, [Port]).
-add_idempotence_test1(Port) ->
-    F = fun(_Req) -> ok end,
-    L = {"/foo", "Foo"},
-    rabbit_web_dispatch_registry:add(foo, [{port, Port}], F, F, L),
-    rabbit_web_dispatch_registry:add(foo, [{port, Port}], F, F, L),
-    ?assertEqual(
-       1, length([ok || {"/foo", _, _} <-
-                            rabbit_web_dispatch_registry:list_all()])),
-    passed.
-
-
-
-format(Fmt, Val) ->
-    lists:flatten(io_lib:format(Fmt, Val)).
diff --git a/rabbitmq-server/deps/rabbitmq_web_dispatch/test/rabbit_web_dispatch_unit_SUITE.erl b/rabbitmq-server/deps/rabbitmq_web_dispatch/test/rabbit_web_dispatch_unit_SUITE.erl
deleted file mode 100644 (file)
index 3adcc9d..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_web_dispatch_unit_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-      {group, parallel_tests}
-    ].
-
-groups() ->
-    [
-      {parallel_tests, [parallel], [
-                                    relativise_test,
-                                    unrelativise_test
-                                   ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Test suite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    Config.
-
-end_per_suite(Config) ->
-    Config.
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(_Testcase, Config) ->
-    Config.
-
-end_per_testcase(_Testcase, Config) ->
-    Config.
-
-%% -------------------------------------------------------------------
-%% Test cases.
-%% -------------------------------------------------------------------
-
-relativise_test(_Config) ->
-    Rel = fun rabbit_web_dispatch_util:relativise/2,
-    ?assertEqual("baz",        Rel("/foo/bar/bash", "/foo/bar/baz")),
-    ?assertEqual("../bax/baz", Rel("/foo/bar/bash", "/foo/bax/baz")),
-    ?assertEqual("../bax/baz", Rel("/bar/bash",     "/bax/baz")),
-    ?assertEqual("..",         Rel("/foo/bar/bash", "/foo/bar")),
-    ?assertEqual("../..",      Rel("/foo/bar/bash", "/foo")),
-    ?assertEqual("bar/baz",    Rel("/foo/bar",      "/foo/bar/baz")),
-    ?assertEqual("foo",        Rel("/",             "/foo")),
-
-    passed.
-
-unrelativise_test(_Config) ->
-    Un = fun rabbit_web_dispatch_util:unrelativise/2,
-    ?assertEqual("/foo/bar", Un("/foo/foo", "bar")),
-    ?assertEqual("/foo/bar", Un("/foo/foo", "./bar")),
-    ?assertEqual("bar",      Un("foo", "bar")),
-    ?assertEqual("/baz/bar", Un("/foo/foo", "../baz/bar")),
-
-    passed.
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/build.config b/rabbitmq-server/deps/rabbitmq_web_stomp/build.config
deleted file mode 100644 (file)
index 0855303..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Do *not* comment or remove core modules
-# unless you know what you are doing.
-#
-# Feel free to comment plugins out however.
-
-# Core modules.
-core/core
-index/*
-core/index
-core/deps
-
-# Plugins that must run before Erlang code gets compiled.
-plugins/erlydtl
-plugins/protobuffs
-
-# Core modules, continued.
-core/erlc
-core/docs
-core/rel
-core/test
-core/compat
-
-# Plugins.
-plugins/asciidoc
-plugins/bootstrap
-plugins/c_src
-plugins/ci
-plugins/ct
-plugins/dialyzer
-plugins/edoc
-plugins/elvis
-plugins/escript
-# plugins/eunit
-plugins/relx
-plugins/shell
-plugins/triq
-plugins/xref
-
-# Plugins enhancing the functionality of other plugins.
-plugins/cover
-
-# Core modules which can use variables from plugins.
-core/deps-tools
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/erlang.mk b/rabbitmq-server/deps/rabbitmq_web_stomp/erlang.mk
deleted file mode 100644 (file)
index 9f0c0c3..0000000
+++ /dev/null
@@ -1,6589 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c-dirty
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_web_stomp/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/test/cowboy_websocket_SUITE.erl b/rabbitmq-server/deps/rabbitmq_web_stomp/test/cowboy_websocket_SUITE.erl
deleted file mode 100644 (file)
index 445227e..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(cowboy_websocket_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
-
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-    connection,
-    pubsub,
-    pubsub_binary,
-    disconnect,
-    http_auth
-    ].
-
-init_per_suite(Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config,
-                                           [{rmq_nodename_suffix, ?MODULE}]),
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_testcase(pubsub_binary, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, ws_frame, binary),
-    Config;
-init_per_testcase(http_auth, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, use_http_auth, true),
-    Config;
-init_per_testcase(_, Config) -> Config.
-
-end_per_testcase(pubsub_binary, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, ws_frame, text),
-    Config;
-end_per_testcase(http_auth, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, use_http_auth, false),
-    Config;
-end_per_testcase(_, Config) -> Config.
-
-
-connection(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/ws", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    {close, _} = rfc6455_client:close(WS),
-    ok.
-
-
-raw_send(WS, Command, Headers) ->
-    raw_send(WS, Command, Headers, <<>>).
-raw_send(WS, Command, Headers, Body) ->
-    Frame = stomp:marshal(Command, Headers, Body),
-    rfc6455_client:send(WS, Frame).
-
-raw_recv(WS) ->
-    {ok, P} = rfc6455_client:recv(WS),
-    stomp:unmarshal(P).
-
-
-pubsub(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/ws", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-
-    {<<"CONNECTED">>, _, <<>>} = raw_recv(WS),
-
-    Dst = "/topic/test-" ++ stomp:list_to_hex(binary_to_list(crypto:rand_bytes(8))),
-
-    ok = raw_send(WS, "SUBSCRIBE", [{"destination", Dst},
-                                    {"id", "s0"}]),
-
-    ok = raw_send(WS, "SEND", [{"destination", Dst},
-                              {"content-length", "3"}], <<"a\x00a">>),
-
-    {<<"MESSAGE">>, H, <<"a\x00a">>} = raw_recv(WS),
-    Dst = binary_to_list(proplists:get_value(<<"destination">>, H)),
-
-    {close, _} = rfc6455_client:close(WS),
-    ok.
-
-
-raw_send_binary(WS, Command, Headers) ->
-    raw_send_binary(WS, Command, Headers, <<>>).
-raw_send_binary(WS, Command, Headers, Body) ->
-    Frame = stomp:marshal(Command, Headers, Body),
-    rfc6455_client:send_binary(WS, Frame).
-
-raw_recv_binary(WS) ->
-    {binary, P} = rfc6455_client:recv(WS),
-    stomp:unmarshal(P).
-
-
-pubsub_binary(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/ws", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-
-    {<<"CONNECTED">>, _, <<>>} = raw_recv_binary(WS),
-
-    Dst = "/topic/test-" ++ stomp:list_to_hex(binary_to_list(crypto:rand_bytes(8))),
-
-    ok = raw_send(WS, "SUBSCRIBE", [{"destination", Dst},
-                                    {"id", "s0"}]),
-
-    ok = raw_send(WS, "SEND", [{"destination", Dst},
-                              {"content-length", "3"}], <<"a\x00a">>),
-
-    {<<"MESSAGE">>, H, <<"a\x00a">>} = raw_recv_binary(WS),
-    Dst = binary_to_list(proplists:get_value(<<"destination">>, H)),
-
-    {close, _} = rfc6455_client:close(WS).
-
-disconnect(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/ws", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-
-    {<<"CONNECTED">>, _, <<>>} = raw_recv(WS),
-
-    ok = raw_send(WS, "DISCONNECT", []),
-    {close, {1000, _}} = rfc6455_client:recv(WS),
-
-    ok.
-
-http_auth(Config) ->
-    %% Intentionally put bad credentials in the CONNECT frame,
-    %% and good credentials in the Authorization header, to
-    %% confirm that the right credentials are picked.
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/ws", self(),
-        [{login, "guest"}, {passcode, "guest"}]),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login", "bad"}, {"passcode", "bad"}]),
-    {<<"CONNECTED">>, _, <<>>} = raw_recv(WS),
-    {close, _} = rfc6455_client:close(WS),
-
-    %% Confirm that if no Authorization header is provided,
-    %% the default STOMP plugin credentials are used. We
-    %% expect an error because the default credentials are
-    %% left undefined.
-    WS2 = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS2),
-    ok = raw_send(WS2, "CONNECT", [{"login", "bad"}, {"passcode", "bad"}]),
-    {<<"ERROR">>, _, _} = raw_recv(WS2),
-    {close, _} = rfc6455_client:close(WS2).
\ No newline at end of file
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/test/raw_websocket_SUITE.erl b/rabbitmq-server/deps/rabbitmq_web_stomp/test/raw_websocket_SUITE.erl
deleted file mode 100644 (file)
index 8b5a881..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(raw_websocket_SUITE).
-
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
-
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-    connection,
-    connection_with_protocols,
-    pubsub,
-    disconnect,
-    http_auth
-    ].
-
-init_per_suite(Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config,
-                                           [{rmq_nodename_suffix, ?MODULE}]),
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_testcase(http_auth, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, use_http_auth, true),
-    Config;
-init_per_testcase(_, Config) -> Config.
-
-end_per_testcase(http_auth, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, use_http_auth, false),
-    Config;
-end_per_testcase(_, Config) -> Config.
-
-connection(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    {close, _} = rfc6455_client:close(WS),
-    ok.
-
-connection_with_protocols(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self(),
-        undefined, ["v11.stomp", "v10.stomp", "v12.stomp"]),
-    {ok, _} = rfc6455_client:open(WS),
-    {close, _} = rfc6455_client:close(WS),
-    ok.
-
-
-raw_send(WS, Command, Headers) ->
-    raw_send(WS, Command, Headers, <<>>).
-raw_send(WS, Command, Headers, Body) ->
-    Frame = stomp:marshal(Command, Headers, Body),
-    rfc6455_client:send(WS, Frame).
-
-raw_recv(WS) ->
-    {ok, P} = rfc6455_client:recv(WS),
-    stomp:unmarshal(P).
-
-
-pubsub(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-
-    {<<"CONNECTED">>, _, <<>>} = raw_recv(WS),
-
-    Dst = "/topic/test-" ++ stomp:list_to_hex(binary_to_list(crypto:rand_bytes(8))),
-
-    ok = raw_send(WS, "SUBSCRIBE", [{"destination", Dst},
-                                    {"id", "s0"}]),
-
-    ok = raw_send(WS, "SEND", [{"destination", Dst},
-                              {"content-length", "3"}], <<"a\x00a">>),
-
-    {<<"MESSAGE">>, H, <<"a\x00a">>} = raw_recv(WS),
-    Dst = binary_to_list(proplists:get_value(<<"destination">>, H)),
-
-    {close, _} = rfc6455_client:close(WS),
-    ok.
-
-
-disconnect(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-
-    {<<"CONNECTED">>, _, <<>>} = raw_recv(WS),
-
-    ok = raw_send(WS, "DISCONNECT", []),
-    {close, {1000, _}} = rfc6455_client:recv(WS),
-
-    ok.
-
-http_auth(Config) ->
-    %% Intentionally put bad credentials in the CONNECT frame,
-    %% and good credentials in the Authorization header, to
-    %% confirm that the right credentials are picked.
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self(),
-        [{login, "guest"}, {passcode, "guest"}]),
-    {ok, _} = rfc6455_client:open(WS),
-    ok = raw_send(WS, "CONNECT", [{"login", "bad"}, {"passcode", "bad"}]),
-    {<<"CONNECTED">>, _, <<>>} = raw_recv(WS),
-    {close, _} = rfc6455_client:close(WS),
-
-    %% Confirm that if no Authorization header is provided,
-    %% the default STOMP plugin credentials are used. We
-    %% expect an error because the default credentials are
-    %% left undefined.
-    WS2 = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS2),
-    ok = raw_send(WS2, "CONNECT", [{"login", "bad"}, {"passcode", "bad"}]),
-    {<<"ERROR">>, _, _} = raw_recv(WS2),
-    {close, _} = rfc6455_client:close(WS2).
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/test/sockjs_websocket_SUITE.erl b/rabbitmq-server/deps/rabbitmq_web_stomp/test/sockjs_websocket_SUITE.erl
deleted file mode 100644 (file)
index 7aad557..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(sockjs_websocket_SUITE).
-
--compile(export_all).
-
--include_lib("common_test/include/ct.hrl").
-
--include_lib("eunit/include/eunit.hrl").
-
-all() ->
-    [
-    connection,
-    pubsub,
-    disconnect,
-    http_auth
-    ].
-
-init_per_suite(Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config,
-                                           [{rmq_nodename_suffix, ?MODULE}]),
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config1,
-                                      rabbit_ct_broker_helpers:setup_steps()).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_testcase(http_auth, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, use_http_auth, true),
-    Config;
-init_per_testcase(_, Config) -> Config.
-
-end_per_testcase(http_auth, Config) ->
-    rabbit_ws_test_util:update_app_env(Config, use_http_auth, false),
-    Config;
-end_per_testcase(_, Config) -> Config.
-
-connection(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/0/0/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    {ok, <<"o">>} = rfc6455_client:recv(WS),
-
-    {close, _} = rfc6455_client:close(WS),
-    ok.
-
-
-sjs_send(WS, Command, Headers) ->
-    sjs_send(WS, Command, Headers, <<>>).
-sjs_send(WS, Command, Headers, Body) ->
-    StompFrame = stomp:marshal(Command, Headers, Body),
-    SockJSFrame = sockjs_json:encode([StompFrame]),
-    rfc6455_client:send(WS, SockJSFrame).
-
-sjs_recv(WS) ->
-    {ok, P} = rfc6455_client:recv(WS),
-    case P of
-        <<"a", JsonArr/binary>> ->
-            {ok, [StompFrame]} = sockjs_json:decode(JsonArr),
-            {ok, stomp:unmarshal(StompFrame)};
-        <<"c", JsonArr/binary>> ->
-            {ok, CloseReason} = sockjs_json:decode(JsonArr),
-            {close, CloseReason}
-    end.
-
-pubsub(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/0/0/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    {ok, <<"o">>} = rfc6455_client:recv(WS),
-
-    ok = sjs_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-
-    {ok, {<<"CONNECTED">>, _, <<>>}} = sjs_recv(WS),
-
-    Dst = "/topic/test-" ++ stomp:list_to_hex(binary_to_list(crypto:rand_bytes(8))),
-
-    ok = sjs_send(WS, "SUBSCRIBE", [{"destination", Dst},
-                                    {"id", "s0"}]),
-
-    ok = sjs_send(WS, "SEND", [{"destination", Dst},
-                               {"content-length", "3"}], <<"a\x00a">>),
-
-    {ok, {<<"MESSAGE">>, H, <<"a\x00a">>}} = sjs_recv(WS),
-    Dst = binary_to_list(proplists:get_value(<<"destination">>, H)),
-
-    {close, _} = rfc6455_client:close(WS),
-
-    ok.
-
-
-disconnect(Config) ->
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/0/0/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS),
-    {ok, <<"o">>} = rfc6455_client:recv(WS),
-
-    ok = sjs_send(WS, "CONNECT", [{"login","guest"}, {"passcode", "guest"}]),
-    {ok, {<<"CONNECTED">>, _, <<>>}} = sjs_recv(WS),
-
-    ok = sjs_send(WS, "DISCONNECT", []),
-    {close, [1000, _]} = sjs_recv(WS),
-
-    ok.
-
-http_auth(Config) ->
-    %% Intentionally put bad credentials in the CONNECT frame,
-    %% and good credentials in the Authorization header, to
-    %% confirm that the right credentials are picked.
-    PortStr = rabbit_ws_test_util:get_web_stomp_port_str(Config),
-    WS = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/0/0/websocket", self(),
-        [{login, "guest"}, {passcode, "guest"}]),
-    {ok, _} = rfc6455_client:open(WS),
-    {ok, <<"o">>} = rfc6455_client:recv(WS),
-    ok = sjs_send(WS, "CONNECT", [{"login", "bad"}, {"passcode", "bad"}]),
-    {ok, {<<"CONNECTED">>, _, <<>>}} = sjs_recv(WS),
-    {close, _} = rfc6455_client:close(WS),
-
-    %% Confirm that if no Authorization header is provided,
-    %% the default STOMP plugin credentials are used. We
-    %% expect an error because the default credentials are
-    %% left undefined.
-    WS2 = rfc6455_client:new("ws://127.0.0.1:" ++ PortStr ++ "/stomp/0/0/websocket", self()),
-    {ok, _} = rfc6455_client:open(WS2),
-    {ok, <<"o">>} = rfc6455_client:recv(WS2),
-    ok = sjs_send(WS2, "CONNECT", [{"login", "bad"}, {"passcode", "bad"}]),
-    {ok, {<<"ERROR">>, _, _}} = sjs_recv(WS2),
-    {close, _} = rfc6455_client:close(WS2).
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/test/src/rabbit_ws_test_util.erl b/rabbitmq-server/deps/rabbitmq_web_stomp/test/src/rabbit_ws_test_util.erl
deleted file mode 100644 (file)
index 465565c..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rabbit_ws_test_util).
-
--export([update_app_env/3, get_web_stomp_port_str/1]).
-
-update_app_env(Config, Key, Val) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-                                      application, set_env,
-                                      [rabbitmq_web_stomp, Key, Val]),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-                                      application, stop,
-                                      [rabbitmq_web_stomp]),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-                                      cowboy, stop_listener,
-                                      [http]),
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-                                      application, start,
-                                      [rabbitmq_web_stomp]).
-
-get_web_stomp_port_str(Config) ->
-    Port = rabbit_ct_broker_helpers:get_node_config(Config, 0,
-                                                    tcp_port_web_stomp),
-    integer_to_list(Port).
\ No newline at end of file
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/test/src/rfc6455_client.erl b/rabbitmq-server/deps/rabbitmq_web_stomp/test/src/rfc6455_client.erl
deleted file mode 100644 (file)
index 0a6f9cd..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(rfc6455_client).
-
--export([new/2, new/3, new/4, open/1, recv/1, send/2, close/1, close/2]).
-
--record(state, {host, port, addr, path, ppid, socket, data, phase}).
-
-%% --------------------------------------------------------------------------
-
-new(WsUrl, PPid) ->
-    new(WsUrl, PPid, undefined, []).
-
-new(WsUrl, PPid, AuthInfo) ->
-    new(WsUrl, PPid, AuthInfo, []).
-
-new(WsUrl, PPid, AuthInfo, Protocols) ->
-    crypto:start(),
-    "ws://" ++ Rest = WsUrl,
-    [Addr, Path] = split("/", Rest, 1),
-    [Host, MaybePort] = split(":", Addr, 1, empty),
-    Port = case MaybePort of
-               empty -> 80;
-               V     -> {I, ""} = string:to_integer(V), I
-           end,
-    State = #state{host = Host,
-                   port = Port,
-                   addr = Addr,
-                   path = "/" ++ Path,
-                   ppid = PPid},
-    spawn(fun () ->
-                  start_conn(State, AuthInfo, Protocols)
-          end).
-
-open(WS) ->
-    receive
-        {rfc6455, open, WS, Opts} ->
-            {ok, Opts};
-        {rfc6455, close, WS, R} ->
-            {close, R}
-    end.
-
-recv(WS) ->
-    receive
-        {rfc6455, recv, WS, Payload} ->
-            {ok, Payload};
-        {rfc6455, recv_binary, WS, Payload} ->
-            {binary, Payload};
-        {rfc6455, close, WS, R} ->
-            {close, R}
-    end.
-
-send(WS, IoData) ->
-    WS ! {send, IoData},
-    ok.
-
-send_binary(WS, IoData) ->
-    WS ! {send_binary, IoData},
-    ok.
-
-close(WS) ->
-    close(WS, {1000, ""}).
-
-close(WS, WsReason) ->
-    WS ! {close, WsReason},
-    receive
-        {rfc6455, close, WS, R} ->
-            {close, R}
-    end.
-
-
-%% --------------------------------------------------------------------------
-
-start_conn(State, AuthInfo, Protocols) ->
-    {ok, Socket} = gen_tcp:connect(State#state.host, State#state.port,
-                                   [binary,
-                                    {packet, 0}]),
-
-    AuthHd = case AuthInfo of
-        undefined -> "";
-        _ ->
-            Login    = proplists:get_value(login, AuthInfo),
-            Passcode = proplists:get_value(passcode, AuthInfo),
-            "Authorization: Basic "
-                ++ base64:encode_to_string(Login ++ ":" ++ Passcode)
-                ++ "\r\n"
-    end,
-
-    ProtocolHd = case Protocols of
-        [] -> "";
-        _  -> "Sec-Websocket-Protocol: " ++ string:join(Protocols, ", ")
-    end,
-
-    Key = base64:encode_to_string(crypto:rand_bytes(16)),
-    gen_tcp:send(Socket,
-        "GET " ++ State#state.path ++ " HTTP/1.1\r\n" ++
-        "Host: " ++ State#state.addr ++ "\r\n" ++
-        "Upgrade: websocket\r\n" ++
-        "Connection: Upgrade\r\n" ++
-        AuthHd ++
-        ProtocolHd ++
-        "Sec-WebSocket-Key: " ++ Key ++ "\r\n" ++
-        "Origin: null\r\n" ++
-        "Sec-WebSocket-Version: 13\r\n\r\n"),
-
-    loop(State#state{socket = Socket,
-                     data   = <<>>,
-                     phase = opening}).
-
-do_recv(State = #state{phase = opening, ppid = PPid, data = Data}) ->
-    case split("\r\n\r\n", binary_to_list(Data), 1, empty) of
-        [_Http, empty] -> State;
-        [Http, Data1]   ->
-            %% TODO: don't ignore http response data, verify key
-            PPid ! {rfc6455, open, self(), [{http_response, Http}]},
-            State#state{phase = open,
-                        data = Data1}
-    end;
-do_recv(State = #state{phase = Phase, data = Data, socket = Socket, ppid = PPid})
-  when Phase =:= open orelse Phase =:= closing ->
-    R = case Data of
-            <<F:1, _:3, O:4, 0:1, L:7, Payload:L/binary, Rest/binary>>
-              when L < 126 ->
-                {F, O, Payload, Rest};
-
-            <<F:1, _:3, O:4, 0:1, 126:7, L2:16, Payload:L2/binary, Rest/binary>> ->
-                {F, O, Payload, Rest};
-
-            <<F:1, _:3, O:4, 0:1, 127:7, L2:64, Payload:L2/binary, Rest/binary>> ->
-                {F, O, Payload, Rest};
-
-            <<_:1, _:3, _:4, 1:1, _/binary>> ->
-                %% According o rfc6455 5.1 the server must not mask any frames.
-                die(Socket, PPid, {1006, "Protocol error"}, normal);
-            _ ->
-                moredata
-        end,
-    case R of
-        moredata ->
-            State;
-        _ -> do_recv2(State, R)
-    end.
-
-do_recv2(State = #state{phase = Phase, socket = Socket, ppid = PPid}, R) ->
-    case R of
-        {1, 1, Payload, Rest} ->
-            PPid ! {rfc6455, recv, self(), Payload},
-            State#state{data = Rest};
-        {1, 2, Payload, Rest} ->
-            PPid ! {rfc6455, recv_binary, self(), Payload},
-            State#state{data = Rest};
-        {1, 8, Payload, _Rest} ->
-            WsReason = case Payload of
-                           <<WC:16, WR/binary>> -> {WC, WR};
-                           <<>> -> {1005, "No status received"}
-                       end,
-            case Phase of
-                open -> %% echo
-                    do_close(State, WsReason),
-                    gen_tcp:close(Socket);
-                closing ->
-                    ok
-            end,
-            die(Socket, PPid, WsReason, normal);
-        {_, _, _, Rest2} ->
-            io:format("Unknown frame type~n"),
-            die(Socket, PPid, {1006, "Unknown frame type"}, normal)
-    end.
-
-encode_frame(F, O, Payload) ->
-    Mask = crypto:rand_bytes(4),
-    MaskedPayload = apply_mask(Mask, iolist_to_binary(Payload)),
-
-    L = byte_size(MaskedPayload),
-    IoData = case L of
-                 _ when L < 126 ->
-                     [<<F:1, 0:3, O:4, 1:1, L:7>>, Mask, MaskedPayload];
-                 _ when L < 65536 ->
-                     [<<F:1, 0:3, O:4, 1:1, 126:7, L:16>>, Mask, MaskedPayload];
-                 _ ->
-                     [<<F:1, 0:3, O:4, 1:1, 127:7, L:64>>, Mask, MaskedPayload]
-           end,
-    iolist_to_binary(IoData).
-
-do_send(State = #state{socket = Socket}, Payload) ->
-    gen_tcp:send(Socket, encode_frame(1, 1, Payload)),
-    State.
-
-do_send_binary(State = #state{socket = Socket}, Payload) ->
-    gen_tcp:send(Socket, encode_frame(1, 2, Payload)),
-    State.
-
-do_close(State = #state{socket = Socket}, {Code, Reason}) ->
-    Payload = iolist_to_binary([<<Code:16>>, Reason]),
-    gen_tcp:send(Socket, encode_frame(1, 8, Payload)),
-    State#state{phase = closing}.
-
-
-loop(State = #state{socket = Socket, ppid = PPid, data = Data,
-                    phase = Phase}) ->
-    receive
-        {tcp, Socket, Bin} ->
-            State1 = State#state{data = iolist_to_binary([Data, Bin])},
-            loop(do_recv(State1));
-        {send, Payload} when Phase == open ->
-            loop(do_send(State, Payload));
-        {send_binary, Payload} when Phase == open ->
-            loop(do_send_binary(State, Payload));
-        {tcp_closed, Socket} ->
-            die(Socket, PPid, {1006, "Connection closed abnormally"}, normal);
-        {close, WsReason} when Phase == open ->
-            loop(do_close(State, WsReason))
-    end.
-
-
-die(Socket, PPid, WsReason, Reason) ->
-    gen_tcp:shutdown(Socket, read_write),
-    PPid ! {rfc6455, close, self(), WsReason},
-    exit(Reason).
-
-
-%% --------------------------------------------------------------------------
-
-split(SubStr, Str, Limit) ->
-    split(SubStr, Str, Limit, "").
-
-split(SubStr, Str, Limit, Default) ->
-    Acc = split(SubStr, Str, Limit, [], Default),
-    lists:reverse(Acc).
-split(_SubStr, Str, 0, Acc, _Default) -> [Str | Acc];
-split(SubStr, Str, Limit, Acc, Default) ->
-    {L, R} = case string:str(Str, SubStr) of
-                 0 -> {Str, Default};
-                 I -> {string:substr(Str, 1, I-1),
-                       string:substr(Str, I+length(SubStr))}
-             end,
-    split(SubStr, R, Limit-1, [L | Acc], Default).
-
-
-apply_mask(Mask, Data) when is_number(Mask) ->
-    apply_mask(<<Mask:32>>, Data);
-
-apply_mask(<<0:32>>, Data) ->
-    Data;
-apply_mask(Mask, Data) ->
-    iolist_to_binary(lists:reverse(apply_mask2(Mask, Data, []))).
-
-apply_mask2(M = <<Mask:32>>, <<Data:32, Rest/binary>>, Acc) ->
-    T = Data bxor Mask,
-    apply_mask2(M, Rest, [<<T:32>> | Acc]);
-apply_mask2(<<Mask:24, _:8>>, <<Data:24>>, Acc) ->
-    T = Data bxor Mask,
-    [<<T:24>> | Acc];
-apply_mask2(<<Mask:16, _:16>>, <<Data:16>>, Acc) ->
-    T = Data bxor Mask,
-    [<<T:16>> | Acc];
-apply_mask2(<<Mask:8, _:24>>, <<Data:8>>, Acc) ->
-    T = Data bxor Mask,
-    [<<T:8>> | Acc];
-apply_mask2(_, <<>>, Acc) ->
-    Acc.
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp/test/src/stomp.erl b/rabbitmq-server/deps/rabbitmq_web_stomp/test/src/stomp.erl
deleted file mode 100644 (file)
index 98f0fd5..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-%%   The contents of this file are subject to the Mozilla Public License
-%%   Version 1.1 (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.mozilla.org/MPL/
-%%
-%%   Software distributed under the License is distributed on an "AS IS"
-%%   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%%   License for the specific language governing rights and limitations
-%%   under the License.
-%%
-%%   The Original Code is RabbitMQ Management Console.
-%%
-%%   The Initial Developer of the Original Code is GoPivotal, Inc.
-%%   Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(stomp).
-
--export([marshal/2, marshal/3, unmarshal/1]).
-
--export([list_to_hex/1]).
-
-marshal(Command, Headers) ->
-    marshal(Command, Headers, <<>>).
-marshal(Command, Headers, Body) ->
-    Lines = [Command] ++ [[K, ":", V] || {K, V} <- Headers] ++ [["\n", Body]],
-    iolist_to_binary([iolist_join(Lines, "\n"), "\x00"]).
-
-unmarshal(Frame) ->
-    [Head, Body] = binary:split(Frame, <<"\n\n">>),
-    [Command | HeaderLines] = binary:split(Head, <<"\n">>, [global]),
-    Headers = [list_to_tuple(binary:split(Line, <<":">>)) || Line <- HeaderLines],
-    [Body1, <<>>] = binary:split(Body, [<<0, 10>>],[{scope,{byte_size(Body)-2, 2}}]),
-    {Command, Headers, Body1}.
-
-%% ----------
-
-iolist_join(List, Separator) ->
-    lists:reverse(iolist_join2(List, Separator, [])).
-
-iolist_join2([], _Separator, Acc) ->
-    Acc;
-iolist_join2([E | List], Separator, Acc) ->
-    iolist_join2(List, Separator, [E, Separator | Acc]).
-
-
-list_to_hex(L) ->
-    lists:flatten(lists:map(fun(X) -> int_to_hex(X) end, L)).
-int_to_hex(N) when N < 256 ->
-    [hex(N div 16), hex(N rem 16)].
-hex(N) when N < 10 ->
-    $0+N;
-hex(N) when N >= 10, N < 16 ->
-    $a + (N-10).
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp_examples/erlang.mk b/rabbitmq-server/deps/rabbitmq_web_stomp_examples/erlang.mk
deleted file mode 100644 (file)
index 1688ee8..0000000
+++ /dev/null
@@ -1,6640 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-16-gb52203c
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: clean app tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dhtcrawler
-pkg_dhtcrawler_name = dhtcrawler
-pkg_dhtcrawler_description = dhtcrawler is a DHT crawler written in erlang. It can join a DHT network and crawl many P2P torrents.
-pkg_dhtcrawler_homepage = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_fetch = git
-pkg_dhtcrawler_repo = https://github.com/kevinlynx/dhtcrawler
-pkg_dhtcrawler_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = 0.2.4
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += oauth2c
-pkg_oauth2c_name = oauth2c
-pkg_oauth2c_description = Erlang OAuth2 Client
-pkg_oauth2c_homepage = https://github.com/kivra/oauth2_client
-pkg_oauth2c_fetch = git
-pkg_oauth2c_repo = https://github.com/kivra/oauth2_client
-pkg_oauth2c_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.0
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-                               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-                               $(call dep_autopatch_erlang_mk,$(1)); \
-                       else \
-                               $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-                       fi \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       FindFirst = fun(F, Fd) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, compile, {parse_transform, PT}}, _} ->
-                               [PT, F(F, Fd)];
-                       {ok, {attribute, _, compile, CompileOpts}, _} when is_list(CompileOpts) ->
-                               case proplists:get_value(parse_transform, CompileOpts) of
-                                       undefined -> [F(F, Fd)];
-                                       PT -> [PT, F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, include, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ ->
-                                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ Hrl, [read]) of
-                                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                                       _ -> [F(F, Fd)]
-                                               end
-                               end;
-                       {ok, {attribute, _, include_lib, "$(1)/include/" ++ Hrl}, _} ->
-                               {ok, HrlFd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]),
-                               [F(F, HrlFd), F(F, Fd)];
-                       {ok, {attribute, _, include_lib, Hrl}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/include/)" ++ Hrl, [read]) of
-                                       {ok, HrlFd} -> [F(F, HrlFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {ok, {attribute, _, import, {Imp, _}}, _} ->
-                               case file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(Imp) ++ ".erl", [read]) of
-                                       {ok, ImpFd} -> [Imp, F(F, ImpFd), F(F, Fd)];
-                                       _ -> [F(F, Fd)]
-                               end;
-                       {eof, _} ->
-                               file:close(Fd),
-                               [];
-                       _ ->
-                               F(F, Fd)
-               end
-       end,
-       fun() ->
-               ErlFiles = filelib:wildcard("$(call core_native_path,$(DEPS_DIR)/$1/src/)*.erl"),
-               First0 = lists:usort(lists:flatten([begin
-                       {ok, Fd} = file:open(F, [read]),
-                       FindFirst(FindFirst, Fd)
-               end || F <- ErlFiles])),
-               First = lists:flatten([begin
-                       {ok, Fd} = file:open("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", [read]),
-                       FindFirst(FindFirst, Fd)
-               end || M <- First0, lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)]) ++ First0,
-               Write(["COMPILE_FIRST +=", [[" ", atom_to_list(M)] || M <- First,
-                       lists:member("$(call core_native_path,$(DEPS_DIR)/$1/src/)" ++ atom_to_list(M) ++ ".erl", ErlFiles)], "\n"])
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case filename:extension(Output) of
-                                               [] -> "\n";
-                                               _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$1)),$1)
-       $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure.ac -o -f $(DEPS_DIR)/$(DEP_NAME)/configure.in ]; then \
-               echo " AUTO  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-ebin/$(PROJECT).app:: $(DTL_FILES)
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?,-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/)))
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{filename:basename(F, ".erl"), F} || F <- ErlFiles],
-       Add = fun (Dep, Acc) ->
-               case lists:keyfind(atom_to_list(Dep), 1, Modules) of
-                       {_, DepFile} -> [DepFile|Acc];
-                       false -> Acc
-               end
-       end,
-       AddHd = fun (Dep, Acc) ->
-               case {Dep, lists:keymember(Dep, 2, Modules)} of
-                       {"src/" ++ _, false} -> [Dep|Acc];
-                       {"include/" ++ _, false} -> [Dep|Acc];
-                       _ -> Acc
-               end
-       end,
-       CompileFirst = fun (Deps) ->
-               First0 = [case filename:extension(D) of
-                       ".erl" -> filename:basename(D, ".erl");
-                       _ -> []
-               end || D <- Deps],
-               case lists:usort(First0) of
-                       [] -> [];
-                       [[]] -> [];
-                       First -> ["COMPILE_FIRST +=", [[" ", F] || F <- First], "\n"]
-               end
-       end,
-       Depend = [begin
-               case epp:parse_file(F, ["include/"], []) of
-                       {ok, Forms} ->
-                               Deps = lists:usort(lists:foldl(fun
-                                       ({attribute, _, behavior, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, behaviour, Dep}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, compile, {parse_transform, Dep}}, Acc) -> Add(Dep, Acc);
-                                       ({attribute, _, file, {Dep, _}}, Acc) -> AddHd(Dep, Acc);
-                                       (_, Acc) -> Acc
-                               end, [], Forms)),
-                               case Deps of
-                                       [] -> "";
-                                       _ -> [F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n", CompileFirst(Deps)]
-                               end;
-                       {error, enoent} ->
-                               []
-               end
-       end || F <- ErlFiles],
-       ok = file:write_file("$(1)", Depend),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$(ERLC_OPTS)),\
-       $(call compat_convert_erlc_opts,$o)))]}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: distclean-asciidoc doc-deps asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide:
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual:
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g 0 -o 0 -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-include erlang.mk
-endef
-else
-define bs_Makefile
-PROJECT = $p
-include erlang.mk
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT).so
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-CFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-CXXFLAGS += -fPIC -I $(ERTS_INCLUDE_DIR) -I $(ERL_INTERFACE_INCLUDE_DIR)
-
-LDLIBS += -L $(ERL_INTERFACE_LIB_DIR) -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT)
-
-$(C_SRC_OUTPUT): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(C_SRC_ENV)\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct:
-else
-ct: test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r src
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions \
-       -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-docs:: distclean-edoc edoc
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: elvis distclean-elvis
-
-# Configuration.
-
-ELVIS_CONFIG ?= $(CURDIR)/elvis.config
-
-ELVIS ?= $(CURDIR)/elvis
-export ELVIS
-
-ELVIS_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis
-ELVIS_CONFIG_URL ?= https://github.com/inaka/elvis/releases/download/0.2.5/elvis.config
-ELVIS_OPTS ?=
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Elvis targets:" \
-               "  elvis       Run Elvis using the local elvis.config or download the default otherwise"
-
-distclean:: distclean-elvis
-
-# Plugin-specific targets.
-
-$(ELVIS):
-       $(gen_verbose) $(call core_http_get,$(ELVIS),$(ELVIS_URL))
-       $(verbose) chmod +x $(ELVIS)
-
-$(ELVIS_CONFIG):
-       $(verbose) $(call core_http_get,$(ELVIS_CONFIG),$(ELVIS_CONFIG_URL))
-
-elvis: $(ELVIS) $(ELVIS_CONFIG)
-       $(verbose) $(ELVIS) rock -c $(ELVIS_CONFIG) $(ELVIS_OPTS)
-
-distclean-elvis:
-       $(gen_verbose) rm -rf $(ELVIS)
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test([$(call comma_list,$(1))], [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),{module,'$(mod)'})
-
-eunit: test-build
-       $(gen_verbose) $(ERL) -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin ebin \
-               -eval "$(subst $(newline),,$(subst ",\",$(call eunit.erl,$(EUNIT_MODS))))"
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/deps/rabbitmq_web_stomp_examples/rabbitmq-components.mk b/rabbitmq-server/deps/rabbitmq_web_stomp_examples/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/deps/ranch/ranch.d b/rabbitmq-server/deps/ranch/ranch.d
deleted file mode 100644 (file)
index a5dc49d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-src/ranch_ssl.erl:: src/ranch_transport.erl; @touch $@
-src/ranch_tcp.erl:: src/ranch_transport.erl; @touch $@
-
-COMPILE_FIRST += ranch_transport
diff --git a/rabbitmq-server/deps/ranch/test/acceptor_SUITE.erl b/rabbitmq-server/deps/ranch/test/acceptor_SUITE.erl
deleted file mode 100644 (file)
index 7eea743..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
-%% Copyright (c) 2011-2015, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(acceptor_SUITE).
--compile(export_all).
-
--import(ct_helper, [doc/1]).
--import(ct_helper, [name/0]).
-
-%% ct.
-
-all() ->
-       [{group, tcp}, {group, ssl}, {group, misc}, {group, supervisor}].
-
-groups() ->
-       [{tcp, [
-               tcp_accept_socket,
-               tcp_active_echo,
-               tcp_echo,
-               tcp_inherit_options,
-               tcp_max_connections,
-               tcp_max_connections_and_beyond,
-               tcp_max_connections_infinity,
-               tcp_set_max_connections,
-               tcp_set_max_connections_clean,
-               tcp_upgrade
-       ]}, {ssl, [
-               ssl_accept_error,
-               ssl_accept_socket,
-               ssl_active_echo,
-               ssl_echo
-       ]}, {misc, [
-               misc_bad_transport,
-               misc_bad_transport_options
-       ]}, {supervisor, [
-               connection_type_supervisor,
-               connection_type_supervisor_separate_from_connection,
-               supervisor_clean_child_restart,
-               supervisor_clean_conns_sup_restart,
-               supervisor_clean_restart,
-               supervisor_conns_alive,
-               supervisor_protocol_start_link_crash,
-               supervisor_server_recover_state
-       ]}].
-
-%% misc.
-
-misc_bad_transport(_) ->
-       doc("Reject invalid transport modules."),
-       {error, badarg} = ranch:start_listener(misc_bad_transport, 1,
-               bad_transport, [], echo_protocol, []),
-       ok.
-
-misc_bad_transport_options(_) ->
-       doc("Reject invalid transport modules."),
-       {ok, _} = ranch:start_listener(misc_bad_transport, 1,
-               ranch_tcp, [binary, {packet, 4}, <<"garbage">>, raw, backlog], echo_protocol, []),
-       ok.
-
-%% ssl.
-
-ssl_accept_error(_) ->
-       doc("Acceptor must not crash if client disconnects in the middle of SSL handshake."),
-       Name = name(),
-       Opts = ct_helper:get_certs_from_ets(),
-       {ok, ListenerSup} = ranch:start_listener(Name, 1, ranch_ssl, Opts, echo_protocol, []),
-       Port = ranch:get_port(Name),
-       ListenerSupChildren = supervisor:which_children(ListenerSup),
-       {_, AcceptorsSup, _, _} = lists:keyfind(ranch_acceptors_sup, 1, ListenerSupChildren),
-       [{{acceptor, _, _}, AcceptorPid, _, _}] = supervisor:which_children(AcceptorsSup),
-       true = is_process_alive(AcceptorPid),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:close(Socket),
-       receive after 500 -> ok end,
-       true = is_process_alive(AcceptorPid),
-       ok = ranch:stop_listener(Name).
-
-ssl_accept_socket(_) ->
-       doc("Ensure that listener can use an externally opened SSL listen socket."),
-       Name = name(),
-       Opts = ct_helper:get_certs_from_ets(),
-       {ok, S} = ssl:listen(0, [binary, {active, false}, {packet, raw}, {reuseaddr, true}|Opts]),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_ssl, [{socket, S}], echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = ssl:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = ssl:send(Socket, <<"TCP Ranch is working!">>),
-       {ok, <<"TCP Ranch is working!">>} = ssl:recv(Socket, 21, 1000),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = ssl:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-ssl_active_echo(_) ->
-       doc("Ensure that active mode works with SSL transport."),
-       Name = name(),
-       Opts = ct_helper:get_certs_from_ets(),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_ssl, Opts, active_echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = ssl:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = ssl:send(Socket, <<"SSL Ranch is working!">>),
-       {ok, <<"SSL Ranch is working!">>} = ssl:recv(Socket, 21, 1000),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = ssl:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-ssl_echo(_) ->
-       doc("Ensure that passive mode works with SSL transport."),
-       Name = name(),
-       Opts = ct_helper:get_certs_from_ets(),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_ssl, Opts, echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = ssl:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = ssl:send(Socket, <<"SSL Ranch is working!">>),
-       {ok, <<"SSL Ranch is working!">>} = ssl:recv(Socket, 21, 1000),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = ssl:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-%% tcp.
-
-tcp_accept_socket(_) ->
-       doc("Ensure that listener can use an externally opened TCP listen socket."),
-       Name = name(),
-       {ok, S} = gen_tcp:listen(0, [binary, {active, false}, {packet, raw}, {reuseaddr, true}]),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_tcp, [{socket, S}], echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
-       {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = gen_tcp:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-tcp_active_echo(_) ->
-       doc("Ensure that active mode works with TCP transport."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_tcp, [], active_echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
-       {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = gen_tcp:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-tcp_echo(_) ->
-       doc("Ensure that passive mode works with TCP transport."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_tcp, [], echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
-       {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = gen_tcp:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-tcp_inherit_options(_) ->
-       doc("Ensure TCP options are inherited in the protocol."),
-       Name = name(),
-       Opts = [{nodelay, false}, {send_timeout_close, false}],
-       {ok, _} = ranch:start_listener(Name, 4, ranch_tcp, Opts, check_tcp_options, [{pid, self()} | Opts]),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, true}, {packet, raw}]),
-       receive checked -> ok after 1000 -> error(timeout) end,
-       ok = gen_tcp:close(Socket),
-       ok = ranch:stop_listener(Name).
-
-tcp_max_connections(_) ->
-       doc("Ensure the max_connections option actually limits connections."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{max_connections, 10}],
-               notify_and_wait_protocol, [{msg, connected}, {pid, self()}]),
-       Port = ranch:get_port(Name),
-       ok = connect_loop(Port, 11, 150),
-       10 = ranch_server:count_connections(Name),
-       10 = receive_loop(connected, 400),
-       1 = receive_loop(connected, 1000),
-       ok = ranch:stop_listener(Name).
-
-tcp_max_connections_and_beyond(_) ->
-       doc("Ensure the max_connections option works when connections are removed from the count."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{max_connections, 10}],
-               remove_conn_and_wait_protocol, [{remove, true}]),
-       Port = ranch:get_port(Name),
-       ok = connect_loop(Port, 10, 0),
-       receive after 250 -> ok end,
-       0 = ranch_server:count_connections(Name),
-       10 = length(supervisor:which_children(ranch_server:get_connections_sup(Name))),
-       Counts = supervisor:count_children(ranch_server:get_connections_sup(Name)),
-       {_, 1} = lists:keyfind(specs, 1, Counts),
-       {_, 0} = lists:keyfind(supervisors, 1, Counts),
-       {_, 10} = lists:keyfind(active, 1, Counts),
-       {_, 10} = lists:keyfind(workers, 1, Counts),
-       ranch:set_protocol_options(Name, [{remove, false}]),
-       receive after 250 -> ok end,
-       ok = connect_loop(Port, 10, 0),
-       receive after 250 -> ok end,
-       10 = ranch_server:count_connections(Name),
-       20 = length(supervisor:which_children(ranch_server:get_connections_sup(Name))),
-       Counts2 = supervisor:count_children(ranch_server:get_connections_sup(Name)),
-       {_, 20} = lists:keyfind(active, 1, Counts2),
-       {_, 20} = lists:keyfind(workers, 1, Counts2),
-       ok = ranch:stop_listener(Name).
-
-tcp_max_connections_infinity(_) ->
-       doc("Set the max_connections option from 10 to infinity and back to 10."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{max_connections, 10}],
-               notify_and_wait_protocol, [{msg, connected}, {pid, self()}]),
-       Port = ranch:get_port(Name),
-       ok = connect_loop(Port, 20, 0),
-       10 = ranch_server:count_connections(Name),
-       10 = receive_loop(connected, 1000),
-       10 = ranch_server:count_connections(Name),
-       10 = ranch:get_max_connections(Name),
-       ranch:set_max_connections(Name, infinity),
-       receive after 250 -> ok end,
-       20 = ranch_server:count_connections(Name),
-       infinity = ranch:get_max_connections(Name),
-       ranch:set_max_connections(Name, 10),
-       20 = ranch_server:count_connections(Name),
-       10 = receive_loop(connected, 1000),
-       ok = ranch:stop_listener(Name).
-
-tcp_set_max_connections(_) ->
-       doc("Ensure that changing the max_connections option to a larger value allows for more connections."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{max_connections, 10}],
-               notify_and_wait_protocol, [{msg, connected}, {pid, self()}]),
-       Port = ranch:get_port(Name),
-       ok = connect_loop(Port, 20, 0),
-       10 = ranch_server:count_connections(Name),
-       10 = receive_loop(connected, 1000),
-       10 = ranch:get_max_connections(Name),
-       ranch:set_max_connections(Name, 20),
-       10 = receive_loop(connected, 1000),
-       20 = ranch:get_max_connections(Name),
-       ok = ranch:stop_listener(Name).
-
-tcp_set_max_connections_clean(_) ->
-       doc("Ensure that setting max_connections does not crash any process."),
-       Name = name(),
-       {ok, ListSupPid} = ranch:start_listener(Name, 4, ranch_tcp,
-                       [{max_connections, 4}],
-                       notify_and_wait_protocol, [{msg, connected}, {pid, self()}]),
-       Children = supervisor:which_children(ListSupPid),
-       {_, AccSupPid, _, _} = lists:keyfind(ranch_acceptors_sup, 1, Children),
-       1 = erlang:trace(ListSupPid, true, [procs]),
-       1 = erlang:trace(AccSupPid, true, [procs]),
-       Port = ranch:get_port(Name),
-       N = 20,
-       ok = connect_loop(Port, N*5, 0),
-       %% Randomly set max_connections.
-       [spawn(ranch, set_max_connections, [Name, Max]) ||
-               Max <- lists:flatten(lists:duplicate(N, [6, 4, 8, infinity]))],
-       receive
-               {trace, _, spawn, _, _} ->
-                       error(dirty_set_max_connections)
-       after
-               2000 -> ok
-       end,
-       _ = erlang:trace(all, false, [all]),
-       ok = clean_traces(),
-       ok = ranch:stop_listener(Name).
-
-tcp_upgrade(_) ->
-       doc("Ensure that protocol options can be updated."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [],
-               notify_and_wait_protocol, [{msg, connected}, {pid, self()}]),
-       Port = ranch:get_port(Name),
-       ok = connect_loop(Port, 1, 0),
-       receive connected -> ok after 1000 -> error(timeout) end,
-       ranch:set_protocol_options(Name, [{msg, upgraded}, {pid, self()}]),
-       ok = connect_loop(Port, 1, 0),
-       receive upgraded -> ok after 1000 -> error(timeout) end,
-       ok = ranch:stop_listener(Name).
-
-%% Supervisor tests
-
-connection_type_supervisor(_) ->
-       doc("The supervisor connection type must be reflected in the specifications."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{connection_type, supervisor}],
-               echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
-       {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       [{echo_protocol, _, supervisor, [echo_protocol]}] = supervisor:which_children(ConnsSup),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = gen_tcp:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-connection_type_supervisor_separate_from_connection(_) ->
-       doc("The supervisor connection type allows separate supervised and connection processes."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{connection_type, supervisor}],
-               supervisor_separate, []),
-       Port = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", Port, [binary, {active, false}, {packet, raw}]),
-       ok = gen_tcp:send(Socket, <<"TCP Ranch is working!">>),
-       {ok, <<"TCP Ranch is working!">>} = gen_tcp:recv(Socket, 21, 1000),
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       [{supervisor_separate, _, supervisor, [supervisor_separate]}] = supervisor:which_children(ConnsSup),
-       ok = ranch:stop_listener(Name),
-       {error, closed} = gen_tcp:recv(Socket, 0, 1000),
-       %% Make sure the listener stopped.
-       {'EXIT', _} = begin catch ranch:get_port(Name) end,
-       ok.
-
-supervisor_clean_child_restart(_) ->
-       doc("Verify that only the relevant parts of the supervision tree restarted "
-               "when the listening socket is closed."),
-       Name = name(),
-       %% Trace socket allocations.
-       _ = erlang:trace(new, true, [call]),
-       1 = erlang:trace_pattern({ranch_tcp, listen, 1},
-               [{'_', [], [{return_trace}]}], [global]),
-       {ok, Pid} = ranch:start_listener(Name,
-               1, ranch_tcp, [], echo_protocol, []),
-       %% Trace supervisor spawns.
-       1 = erlang:trace(Pid, true, [procs, set_on_spawn]),
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       %% Manually shut the listening socket down.
-       LSocket = receive
-               {trace, _, return_from, {ranch_tcp, listen, 1}, {ok, Socket}} ->
-                       Socket
-       after 0 ->
-               error(lsocket_unknown)
-       end,
-       ok = gen_tcp:close(LSocket),
-       receive after 1000 -> ok end,
-       %% Verify that supervisor and its first two children are alive.
-       true = is_process_alive(Pid),
-       true = is_process_alive(ConnsSup),
-       %% Check that acceptors_sup is restarted properly.
-       AccSupPid = receive {trace, Pid, spawn, Pid1, _} -> Pid1 end,
-       receive {trace, AccSupPid, spawn, _, _} -> ok end,
-       %% No more traces then.
-       receive
-               {trace, _, spawn, _, _} -> error(invalid_restart)
-       after 1000 -> ok end,
-       %% Verify that children still registered right.
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       _ = erlang:trace_pattern({ranch_tcp, listen, 1}, false, []),
-       _ = erlang:trace(all, false, [all]),
-       ok = clean_traces(),
-       ok = ranch:stop_listener(Name).
-
-supervisor_clean_conns_sup_restart(_) ->
-       doc("Verify that a conns_sup can not register with the same name as an already "
-               "registered ranch_conns_sup that is still alive. Make sure this does not crash "
-               "the ranch_server process."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name,
-               1, ranch_tcp, [], echo_protocol, []),
-       Server = erlang:whereis(ranch_server),
-       ServerMonRef = erlang:monitor(process, Server),
-       %% Exit because Name already registered and is alive.
-       {'EXIT', _}  = (catch ranch_server:set_connections_sup(Name, self())),
-       receive
-               {'DOWN', ServerMonRef, process, Server, _} ->
-                       error(ranch_server_down)
-       after
-               1000 ->
-                       ok
-       end,
-       ok = ranch:stop_listener(Name).
-
-supervisor_clean_restart(_) ->
-       doc("Verify that killing ranch_conns_sup does not crash everything "
-               "and that it restarts properly."),
-       Name = name(),
-       NbAcc = 4,
-       {ok, Pid} = ranch:start_listener(Name, NbAcc, ranch_tcp, [], echo_protocol, []),
-       %% Trace supervisor spawns.
-       1 = erlang:trace(Pid, true, [procs, set_on_spawn]),
-       ConnsSup0 = ranch_server:get_connections_sup(Name),
-       erlang:exit(ConnsSup0, kill),
-       receive after 1000 -> ok end,
-       %% Verify that supervisor is alive
-       true = is_process_alive(Pid),
-       %% ...but children are dead.
-       false = is_process_alive(ConnsSup0),
-       %% Receive traces from newly started children
-       ConnsSup = receive {trace, Pid, spawn, Pid2, _} -> Pid2 end,
-       AccSupPid = receive {trace, Pid, spawn, Pid3, _} -> Pid3 end,
-       %% ...and its acceptors.
-       [receive {trace, AccSupPid, spawn, _Pid, _} -> ok end ||
-               _ <- lists:seq(1, NbAcc)],
-       %% No more traces then.
-       receive
-               {trace, EPid, spawn, _, _} when EPid == Pid; EPid == AccSupPid ->
-                       error(invalid_restart)
-       after 1000 -> ok end,
-       %% Verify that new children registered themselves properly.
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       _ = erlang:trace(all, false, [all]),
-       ok = clean_traces(),
-       ok = ranch:stop_listener(Name).
-
-supervisor_conns_alive(_) ->
-       doc("Ensure that active connections stay open when the listening socket gets closed."),
-       Name = name(),
-       _ = erlang:trace(new, true, [call]),
-       1 = erlang:trace_pattern({ranch_tcp, listen, 1},
-               [{'_', [], [{return_trace}]}], [global]),
-       {ok, _} = ranch:start_listener(Name, 1,
-               ranch_tcp, [],
-               remove_conn_and_wait_protocol, [{remove, false}]),
-       %% Get the listener socket
-       LSocket = receive
-               {trace, _, return_from, {ranch_tcp, listen, 1}, {ok, S}} ->
-                       S
-       after 500 ->
-               error(lsocket_unknown)
-       end,
-       TcpPort = ranch:get_port(Name),
-       {ok, Socket} = gen_tcp:connect("localhost", TcpPort,
-               [binary, {active, true}, {packet, raw}]),
-       receive after 500 -> ok end,
-       %% Shut the socket down
-       ok = gen_tcp:close(LSocket),
-       %% Assert that client is still viable.
-       receive {tcp_closed, _} -> error(closed) after 1500 -> ok end,
-       ok = gen_tcp:send(Socket, <<"poke">>),
-       receive {tcp_closed, _} -> ok end,
-       _ = erlang:trace(all, false, [all]),
-       ok = clean_traces(),
-       ok = ranch:stop_listener(Name).
-
-supervisor_protocol_start_link_crash(_) ->
-       doc("Ensure a protocol start crash does not kill all connections."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_tcp, [], crash_protocol, []),
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       Port = ranch:get_port(Name),
-       {ok, _} = gen_tcp:connect("localhost", Port, [binary, {active, true}, {packet, raw}]),
-       receive after 500 -> ok end,
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       ok = ranch:stop_listener(Name).
-
-supervisor_server_recover_state(_) ->
-       doc("Ensure that when ranch_server crashes and restarts, it recovers "
-               "its state and continues monitoring the same processes."),
-       Name = name(),
-       {ok, _} = ranch:start_listener(Name, 1, ranch_tcp, [], echo_protocol, []),
-       _ = erlang:trace(new, true, [call]),
-       1 = erlang:trace_pattern({ranch_server, init, 1},
-               [{'_', [], [{return_trace}]}], [global]),
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       ServerPid = erlang:whereis(ranch_server),
-       {monitors, Monitors} = erlang:process_info(ServerPid, monitors),
-       erlang:exit(ServerPid, kill),
-       receive
-               {trace, ServerPid2, return_from, {ranch_server, init, 1}, _Result} ->
-                       {monitors, Monitors2} = erlang:process_info(ServerPid2, monitors),
-                       %% Check that ranch_server is monitoring the same processes.
-                       true = (lists:usort(Monitors) == lists:usort(Monitors2))
-       after
-               1000 ->
-                       error(timeout)
-       end,
-       ConnsSup = ranch_server:get_connections_sup(Name),
-       ok = ranch:stop_listener(Name),
-       %% Check ranch_server has removed the ranch_conns_sup.
-       {'EXIT', {badarg, _}} = (catch ranch_server:get_connections_sup(Name)),
-       _ = erlang:trace(all, false, [all]),
-       ok = clean_traces().
-
-%% Utility functions.
-
-connect_loop(_, 0, _) ->
-       ok;
-connect_loop(Port, N, Sleep) ->
-       {ok, _} = gen_tcp:connect("localhost", Port,
-               [binary, {active, false}, {packet, raw}]),
-       receive after Sleep -> ok end,
-       connect_loop(Port, N - 1, Sleep).
-
-receive_loop(Message, Timeout) ->
-       receive_loop(Message, Timeout, 0).
-receive_loop(Message, Timeout, N) ->
-       receive Message ->
-               receive_loop(Message, Timeout, N + 1)
-       after Timeout ->
-               N
-       end.
-
-clean_traces() ->
-       receive
-               {trace, _, _, _} ->
-                       clean_traces();
-               {trace, _, _, _, _} ->
-                       clean_traces()
-       after 0 ->
-               ok
-       end.
diff --git a/rabbitmq-server/deps/ranch/test/active_echo_protocol.erl b/rabbitmq-server/deps/ranch/test/active_echo_protocol.erl
deleted file mode 100644 (file)
index 6767141..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
--module(active_echo_protocol).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
-init(Ref, Socket, Transport, _Opts = []) ->
-       ok = ranch:accept_ack(Ref),
-       loop(Socket, Transport).
-
-loop(Socket, Transport) ->
-       {OK, Closed, Error} = Transport:messages(),
-       Transport:setopts(Socket, [{active, once}]),
-       receive
-               {OK, Socket, Data} ->
-                       Transport:send(Socket, Data),
-                       loop(Socket, Transport);
-               {Closed, Socket} ->
-                       ok;
-               {Error, Socket, _} ->
-                       ok = Transport:close(Socket)
-       end.
diff --git a/rabbitmq-server/deps/ranch/test/check_tcp_options.erl b/rabbitmq-server/deps/ranch/test/check_tcp_options.erl
deleted file mode 100644 (file)
index 18432ac..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
--module(check_tcp_options).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/3]).
-
-start_link(_, Socket, _, [{pid, TestPid}|TcpOptions]) ->
-       {ok, RealTcpOptions} =
-               inet:getopts(Socket, [Key || {Key, _} <- TcpOptions]),
-       Pid = spawn_link(?MODULE, init, [TestPid, RealTcpOptions, TcpOptions]),
-       {ok, Pid}.
-
-init(Pid, TcpOptions, TcpOptions) ->
-       Pid ! checked,
-       receive after 2500 -> ok end.
diff --git a/rabbitmq-server/deps/ranch/test/cover.spec b/rabbitmq-server/deps/ranch/test/cover.spec
deleted file mode 100644 (file)
index 13c52ba..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{incl_app, ranch, details}.
diff --git a/rabbitmq-server/deps/ranch/test/crash_protocol.erl b/rabbitmq-server/deps/ranch/test/crash_protocol.erl
deleted file mode 100644 (file)
index e584f4d..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
--module(crash_protocol).
-
--export([start_link/4]).
-
--spec start_link(_, _, _, _) -> no_return().
-start_link(_, _, _, _) ->
-       exit(crash).
diff --git a/rabbitmq-server/deps/ranch/test/echo_protocol.erl b/rabbitmq-server/deps/ranch/test/echo_protocol.erl
deleted file mode 100644 (file)
index 8c454bc..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
--module(echo_protocol).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
-init(Ref, Socket, Transport, _Opts = []) ->
-       ok = ranch:accept_ack(Ref),
-       loop(Socket, Transport).
-
-loop(Socket, Transport) ->
-       case Transport:recv(Socket, 0, 5000) of
-               {ok, Data} ->
-                       Transport:send(Socket, Data),
-                       loop(Socket, Transport);
-               _ ->
-                       ok = Transport:close(Socket)
-       end.
diff --git a/rabbitmq-server/deps/ranch/test/notify_and_wait_protocol.erl b/rabbitmq-server/deps/ranch/test/notify_and_wait_protocol.erl
deleted file mode 100644 (file)
index f0136a1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
--module(notify_and_wait_protocol).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/2]).
-
-start_link(_, _, _, [{msg, Msg}, {pid, TestPid}]) ->
-       Pid = spawn_link(?MODULE, init, [Msg, TestPid]),
-       {ok, Pid}.
-
-init(Msg, Pid) ->
-       Pid ! Msg,
-       receive after 2500 -> ok end.
diff --git a/rabbitmq-server/deps/ranch/test/ranch_ct_hook.erl b/rabbitmq-server/deps/ranch/test/ranch_ct_hook.erl
deleted file mode 100644 (file)
index 051e5b2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-%% Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(ranch_ct_hook).
-
--export([init/2]).
-
-init(_, _) ->
-       ct_helper:start([ranch, ssl]),
-       ct_helper:make_certs_in_ets(),
-       error_logger:add_report_handler(ct_helper_error_h),
-       {ok, undefined}.
diff --git a/rabbitmq-server/deps/ranch/test/remove_conn_and_wait_protocol.erl b/rabbitmq-server/deps/ranch/test/remove_conn_and_wait_protocol.erl
deleted file mode 100644 (file)
index 6c8206c..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
--module(remove_conn_and_wait_protocol).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/2]).
-
-start_link(Ref, _, _, [{remove, MaybeRemove}]) ->
-       Pid = spawn_link(?MODULE, init, [Ref, MaybeRemove]),
-       {ok, Pid}.
-
-init(Ref, MaybeRemove) ->
-       ranch:accept_ack(Ref),
-       case MaybeRemove of
-               true ->
-                       ranch:remove_connection(Ref);
-               false ->
-                       ok
-       end,
-       receive after 2500 -> ok end.
diff --git a/rabbitmq-server/deps/ranch/test/sendfile_SUITE.erl b/rabbitmq-server/deps/ranch/test/sendfile_SUITE.erl
deleted file mode 100644 (file)
index c6c9524..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-%% Copyright (c) 2013, James Fish <james@fishcakez.com>
-%% Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(sendfile_SUITE).
--compile(export_all).
-
--import(ct_helper, [config/2]).
--import(ct_helper, [doc/1]).
-
-all() ->
-       [{group, tcp}, {group, ssl}].
-
-suite() ->
-       [{timetrap, {seconds, 60}}].
-
-groups() ->
-       Tests = [
-               filename,
-               rawfile,
-               rawfile_bytes_large,
-               rawfile_bytes_zero,
-               rawfile_chunk_size_large,
-               rawfile_offset_large,
-               rawfile_range_large,
-               rawfile_range_medium,
-               rawfile_range_small
-       ],
-       [{tcp, [parallel], Tests}, {ssl, [parallel], Tests ++ [ssl_chunk_size]}].
-
-init_per_suite(Config) ->
-       Filename = filename:join(config(priv_dir, Config), "sendfile"),
-       Binary = crypto:rand_bytes(20 * 1024 * 1024),
-       ok = file:write_file(Filename, Binary),
-       [{filename, Filename} | Config].
-
-end_per_suite(Config) ->
-       Filename = config(filename, Config),
-       ok = file:delete(Filename),
-       ok.
-
-init_per_group(ssl, Config) ->
-       SslOpts = ct_helper:get_certs_from_ets(),
-       [{transport, ranch_ssl}, {transport_opts, SslOpts} | Config];
-init_per_group(tcp, Config) ->
-       [{transport, ranch_tcp}, {transport_opts, []} | Config].
-
-end_per_group(_, _) ->
-       ok.
-
-filename(Config) ->
-       doc("Use sendfile with a filename."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       Ref = recv(Transport, Server, Size),
-       {ok, Size} = Transport:sendfile(Client, Filename),
-       {ok, Binary} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile(Config) ->
-       doc("Use sendfile with a file descriptor (raw file)."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Ref = recv(Transport, Server, Size),
-       {ok, Size} = Transport:sendfile(Client, RawFile, 0, Size),
-       {ok, Binary} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, 0} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_bytes_large(Config) ->
-       doc("Use sendfile with a file descriptor. Try to send a size larger than file size."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Ref = recv(Transport, Server, Size),
-       %% Only send Size not Size * 2
-       {ok, Size} = Transport:sendfile(Client, RawFile, 0, Size * 2),
-       {ok, Binary} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, 0} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_bytes_zero(Config) ->
-       doc("Use sendfile with a file descriptor. Ensure using a size of 0 sends the whole file."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Ref = recv(Transport, Server, Size),
-       {ok, Size} = Transport:sendfile(Client, RawFile, 0, 0),
-       {ok, Binary} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, 0} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_chunk_size_large(Config) ->
-       doc("Use sendfile with a file descriptor. Try to use a chunk size larger than file size."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Ref = recv(Transport, Server, Size),
-       {ok, Size} = Transport:sendfile(Client, RawFile, 0, Size, [{chunk_size, Size * 2}]),
-       {ok, Binary} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, 0} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_offset_large(Config) ->
-       doc("Use sendfile with a file descriptor. Ensure using an offset larger than file size sends nothing."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       {ok, 0} = Transport:sendfile(Client, RawFile, Size, 1),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_range_large(Config) ->
-       doc("Use sendfile with a file descriptor. "
-               "Set an offset and try to send a size larger than remaining file size."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Initial = 499,
-       {ok, _} = file:position(RawFile, {bof, Initial}),
-       Offset = 75,
-       Bytes = Size * 2,
-       Sent = Size - Offset,
-       Ref = recv(Transport, Server, Sent),
-       {ok, Sent} = Transport:sendfile(Client, RawFile, Offset, Bytes),
-       Binary2 = binary:part(Binary, Offset, Sent),
-       {ok, Binary2} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, Initial} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_range_medium(Config) ->
-       doc("Use sendfile with a file descriptor. "
-               "Set an offset and try to send a size lower than remaining file size."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Initial = 50,
-       {ok, _} = file:position(RawFile, {bof, Initial}),
-       Offset = 50,
-       Bytes = Size - Offset - 50,
-       Ref = recv(Transport, Server, Bytes),
-       {ok, Bytes} = Transport:sendfile(Client, RawFile, Offset, Bytes),
-       Binary2 = binary:part(Binary, Offset, Bytes),
-       {ok, Binary2} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, Initial} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-rawfile_range_small(Config) ->
-       doc("Use sendfile with a file descriptor. "
-               "Set an offset and try to send a size lower than remaining file size, "
-               "which is in turn lower than the chunk size."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       {ok, {Server, Client}} = sockets(Config),
-       {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-       Initial = 3,
-       {ok, _} = file:position(RawFile, {bof, Initial}),
-       Offset = 7,
-       Bytes = 19,
-       Ref = recv(Transport, Server, Bytes),
-       {ok, Bytes} = Transport:sendfile(Client, RawFile, Offset, Bytes, [{chunk_size, 16#FFFF}]),
-       Binary2 = binary:part(Binary, Offset, Bytes),
-       {ok, Binary2} = result(Ref),
-       {error, timeout} = Transport:recv(Server, 1, 100),
-       {ok, Initial} = file:position(RawFile, {cur, 0}),
-       ok = file:close(RawFile),
-       ok = Transport:close(Client),
-       ok = Transport:close(Server).
-
-ssl_chunk_size(Config) ->
-       doc("Use sendfile with SSL. Ensure the sendfile fallback respects the chunk size."),
-       Transport = config(transport, Config),
-       Filename = config(filename, Config),
-       {ok, Binary} = file:read_file(Filename),
-       Size = byte_size(Binary),
-       Self = self(),
-       ChunkSize = 8 * 1024,
-       Fun = fun() ->
-               receive go -> ok after 1000 -> error(timeout) end,
-               {ok, {Server, Client}} = sockets(Config),
-               {ok, RawFile} = file:open(Filename, [read, raw, binary]),
-               Ref = recv(Transport, Server, Size),
-               {ok, Size} = Transport:sendfile(Client, RawFile, 0, Size, [{chunk_size, ChunkSize}]),
-               {ok, Binary} = result(Ref),
-               {error, timeout} = Transport:recv(Server, 1, 100),
-               Self ! done,
-               ok = file:close(RawFile),
-               ok = Transport:close(Client),
-               ok = Transport:close(Server)
-       end,
-       Pid = spawn_link(Fun),
-       1 = erlang:trace(Pid, true, [call]),
-       _ = erlang:trace_pattern({Transport, send, 2}, true, [global]),
-       Pid ! go,
-       receive done -> ok after 30000 -> error(timeout) end,
-       Sizes = lists:duplicate(Size div ChunkSize, ChunkSize) ++
-               [Size rem ChunkSize || (Size rem ChunkSize) =/= 0],
-       ok = recv_send_trace(Sizes, Pid),
-       _ = erlang:trace(all, false, [all]),
-       ok = clean_traces().
-
-%% Internal.
-
-sockets(Config) ->
-       Transport = config(transport, Config),
-       TransportOpts = config(transport_opts, Config),
-       {ok, LSocket} = Transport:listen(TransportOpts),
-       {ok, {_, Port}} = Transport:sockname(LSocket),
-       Self = self(),
-       Fun = fun() ->
-               {ok, Client} = Transport:connect("localhost", Port, TransportOpts),
-               ok = Transport:controlling_process(Client, Self),
-               Self ! {ok, Client}
-       end,
-       _ = spawn_link(Fun),
-       {ok, Server} = Transport:accept(LSocket, 500),
-       ok = Transport:accept_ack(Server, 500),
-       receive
-               {ok, Client} ->
-                       ok = Transport:close(LSocket),
-                       {ok, {Server, Client}}
-       after 1000 ->
-               {error, timeout}
-       end.
-
-recv(Transport, Server, Size) ->
-       Self = self(),
-       Ref = make_ref(),
-       spawn_link(fun() -> Self ! {Ref, Transport:recv(Server, Size, 20000)} end),
-       Ref.
-
-result(Ref) ->
-       receive
-               {Ref, Result} ->
-                       Result
-       after
-               30000 ->
-                       {error, result_timedout}
-       end.
-
-recv_send_trace([], _Pid) ->
-       ok;
-recv_send_trace([Size | Rest], Pid) ->
-       receive
-               {trace, Pid, call, {_, _, [_, Chunk]}} when byte_size(Chunk) == Size ->
-                       recv_send_trace(Rest, Pid);
-               {trace, Pid, call, {_, _, [_, Chunk]}} ->
-                       {error, {invalid_chunk, Size, byte_size(Chunk)}}
-       after 1000 ->
-               {error, timeout}
-       end.
-
-clean_traces() ->
-       receive
-               {trace, _, _, _} ->
-                       clean_traces();
-               {trace, _, _, _, _} ->
-                       clean_traces()
-       after 0 ->
-               ok
-       end.
diff --git a/rabbitmq-server/deps/ranch/test/shutdown_SUITE.erl b/rabbitmq-server/deps/ranch/test/shutdown_SUITE.erl
deleted file mode 100644 (file)
index 212d14c..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-%% Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-%%
-%% Permission to use, copy, modify, and/or distribute this software for any
-%% purpose with or without fee is hereby granted, provided that the above
-%% copyright notice and this permission notice appear in all copies.
-%%
-%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--module(shutdown_SUITE).
--compile(export_all).
-
--import(ct_helper, [doc/1]).
--import(ct_helper, [name/0]).
-
-%% ct.
-
-all() ->
-       ct_helper:all(?MODULE).
-
-%% Tests.
-
-brutal_kill(_) ->
-       doc("Shutdown Ranch listener with shutdown option set to brutal_kill."),
-       Name = name(),
-       {ok, ListenerSup} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{port, 0}, {shutdown, brutal_kill}],
-               echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, _} = gen_tcp:connect("localhost", Port, []),
-       receive after 100 -> ok end,
-       ListenerSupChildren = supervisor:which_children(ListenerSup),
-       {_, ConnsSup, _, _} = lists:keyfind(ranch_conns_sup, 1, ListenerSupChildren),
-       [{_, Pid, _, _}] = supervisor:which_children(ConnsSup),
-       true = is_process_alive(Pid),
-       ok = ranch:stop_listener(Name),
-       receive after 100 -> ok end,
-       false = is_process_alive(Pid),
-       false = is_process_alive(ListenerSup),
-       {error, _} = gen_tcp:connect("localhost", Port, []),
-       ok.
-
-infinity(_) ->
-       doc("Shutdown Ranch listener with shutdown option set to infinity."),
-       Name = name(),
-       {ok, ListenerSup} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{port, 0}, {shutdown, infinity}],
-               echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, _} = gen_tcp:connect("localhost", Port, []),
-       receive after 100 -> ok end,
-       ListenerSupChildren = supervisor:which_children(ListenerSup),
-       {_, ConnsSup, _, _} = lists:keyfind(ranch_conns_sup, 1, ListenerSupChildren),
-       [{_, Pid, _, _}] = supervisor:which_children(ConnsSup),
-       true = is_process_alive(Pid),
-       ok = ranch:stop_listener(Name),
-       receive after 100 -> ok end,
-       false = is_process_alive(Pid),
-       false = is_process_alive(ListenerSup),
-       {error, _} = gen_tcp:connect("localhost", Port, []),
-       ok.
-
-infinity_trap_exit(_) ->
-       doc("Shutdown Ranch listener with shutdown option set to infinity "
-               "and protocol process trapping exits. The listener must not stop "
-               "until the protocol process terminates."),
-       Name = name(),
-       {ok, ListenerSup} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{port, 0}, {shutdown, infinity}],
-               trap_exit_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, _} = gen_tcp:connect("localhost", Port, []),
-       receive after 100 -> ok end,
-       ListenerSupChildren = supervisor:which_children(ListenerSup),
-       {_, ConnsSup, _, _} = lists:keyfind(ranch_conns_sup, 1, ListenerSupChildren),
-       [{_, Pid, _, _}] = supervisor:which_children(ConnsSup),
-       true = is_process_alive(Pid),
-       %% This call will block infinitely.
-       SpawnPid = spawn(fun() -> ok = ranch:stop_listener(Name) end),
-       receive after 100 -> ok end,
-       %% The protocol traps exit signals, and ignore them, so it won't die.
-       true = is_process_alive(Pid),
-       %% The listener will stay up forever too.
-       true = is_process_alive(ListenerSup),
-       %% We can't connect, though.
-       {error, _} = gen_tcp:connect("localhost", Port, []),
-       %% Killing the process unblocks everything.
-       exit(Pid, kill),
-       receive after 100 -> ok end,
-       false = is_process_alive(ListenerSup),
-       false = is_process_alive(SpawnPid),
-       ok.
-
-timeout(_) ->
-       doc("Shutdown Ranch listener with shutdown option set to 500ms."),
-       Name = name(),
-       {ok, ListenerSup} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{port, 0}, {shutdown, 500}],
-               echo_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, _} = gen_tcp:connect("localhost", Port, []),
-       receive after 100 -> ok end,
-       ListenerSupChildren = supervisor:which_children(ListenerSup),
-       {_, ConnsSup, _, _} = lists:keyfind(ranch_conns_sup, 1, ListenerSupChildren),
-       [{_, Pid, _, _}] = supervisor:which_children(ConnsSup),
-       true = is_process_alive(Pid),
-       ok = ranch:stop_listener(Name),
-       receive after 100 -> ok end,
-       false = is_process_alive(Pid),
-       false = is_process_alive(ListenerSup),
-       {error, _} = gen_tcp:connect("localhost", Port, []),
-       ok.
-
-timeout_trap_exit(_) ->
-       doc("Shutdown Ranch listener with shutdown option set to 500ms "
-               "and protocol process trapping exits. The listener will only stop "
-               "after the 500ms timeout."),
-       Name = name(),
-       {ok, ListenerSup} = ranch:start_listener(Name, 1,
-               ranch_tcp, [{port, 0}, {shutdown, 500}],
-               trap_exit_protocol, []),
-       Port = ranch:get_port(Name),
-       {ok, _} = gen_tcp:connect("localhost", Port, []),
-       receive after 100 -> ok end,
-       ListenerSupChildren = supervisor:which_children(ListenerSup),
-       {_, ConnsSup, _, _} = lists:keyfind(ranch_conns_sup, 1, ListenerSupChildren),
-       [{_, Pid, _, _}] = supervisor:which_children(ConnsSup),
-       true = is_process_alive(Pid),
-       %% This call will block for the duration of the shutdown.
-       SpawnPid = spawn(fun() -> ok = ranch:stop_listener(Name) end),
-       receive after 100 -> ok end,
-       %% The protocol traps exit signals, and ignore them, so it won't die.
-       true = is_process_alive(Pid),
-       %% The listener will stay up for now too.
-       true = is_process_alive(ListenerSup),
-       %% We can't connect, though.
-       {error, _} = gen_tcp:connect("localhost", Port, []),
-       %% Wait for the timeout to finish and see that everything is killed.
-       receive after 500 -> ok end,
-       false = is_process_alive(Pid),
-       false = is_process_alive(ListenerSup),
-       false = is_process_alive(SpawnPid),
-       ok.
diff --git a/rabbitmq-server/deps/ranch/test/supervisor_separate.erl b/rabbitmq-server/deps/ranch/test/supervisor_separate.erl
deleted file mode 100644 (file)
index 5f1f326..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
--module(supervisor_separate).
--behavior(supervisor).
--behavior(ranch_protocol).
-
--export([start_link/4]).
--export([init/1]).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       {ok, SupPid} = supervisor:start_link(?MODULE, []),
-       {ok, ConnPid} = supervisor:start_child(SupPid,
-               {echo_protocol, {echo_protocol, start_link, [Ref, Socket, Transport, Opts]},
-                       temporary, 5000, worker, [echo_protocol]}),
-       {ok, SupPid, ConnPid}.
-
-init([]) ->
-       {ok, {{one_for_one, 1, 1}, []}}.
diff --git a/rabbitmq-server/deps/ranch/test/trap_exit_protocol.erl b/rabbitmq-server/deps/ranch/test/trap_exit_protocol.erl
deleted file mode 100644 (file)
index a0c4329..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
--module(trap_exit_protocol).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
-init(Ref, Socket, Transport, _Opts = []) ->
-       process_flag(trap_exit, true),
-       ok = ranch:accept_ack(Ref),
-       loop(Socket, Transport).
-
-loop(Socket, Transport) ->
-       case Transport:recv(Socket, 0, infinity) of
-               {ok, Data} ->
-                       Transport:send(Socket, Data),
-                       loop(Socket, Transport);
-               _ ->
-                       ok = Transport:close(Socket)
-       end.
diff --git a/rabbitmq-server/deps/webmachine/test/etag_test.erl b/rabbitmq-server/deps/webmachine/test/etag_test.erl
deleted file mode 100644 (file)
index 2f4bbe9..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-%% @author Justin Sheehy <justin@basho.com>
-%% @author Andy Gross <andy@basho.com>
-%% @copyright 2007-2010 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.
-
--module(etag_test).
-
-
--ifdef(EQC).
-
--include("wm_reqdata.hrl").
--include_lib("eqc/include/eqc.hrl").
--include_lib("eunit/include/eunit.hrl").
-
--compile(export_all).
-
--define(QC_OUT(P),
-        eqc:on_output(fun(Str, Args) -> io:format(user, Str, Args) end, P)).
-
-unique(L) ->
-    lists:reverse(lists:foldl(fun(Elem, Acc) ->
-                                      case lists:member(Elem, Acc) of
-                                          true ->
-                                              Acc;
-                                          false ->
-                                              [Elem | Acc]
-                                      end
-                              end, [], L)).
-
-etag(Bin) ->
-    integer_to_list(erlang:crc32(Bin)).
-
-etag_list([]) ->
-    "*";
-etag_list(Bins) ->
-    string:join([[$", etag(B), $"] || B <- Bins], ",").
-
-http_request(_Match, _IfVals, _NewVal, 0) ->
-    error;
-http_request(Match, IfVals, NewVal, Count) ->
-    case httpc:request(put, {"http://localhost:12000/etagtest/foo",
-                             [{Match, etag_list(IfVals)}],
-                             "binary/octet-stream",
-                             NewVal},
-                       [], []) of
-        {ok, Result} ->
-            {ok, Result};
-        {error, socket_closed_remotely} ->
-            io:format(user, "Retry!\n", []),
-            http_request(Match, IfVals, NewVal, Count-1)
-    end.
-
-etag_prop() ->
-    ?LET({AllVals, Match}, {non_empty(list(binary())), oneof(["If-Match", "If-None-Match"])},
-         ?FORALL({IfVals0, CurVal, NewVal},
-                 {list(oneof(AllVals)), oneof(AllVals), oneof(AllVals)},
-                 begin
-                     ets:insert(?MODULE, [{etag, etag(CurVal)}]),
-                     IfVals = unique(IfVals0),
-                     {ok, Result} = http_request(Match, IfVals, NewVal, 3),
-                     Code = element(2, element(1, Result)),
-                     ExpectedCode =
-                         expected_response_code(Match,
-                                                IfVals,
-                                                lists:member(CurVal, IfVals)),
-                     equals(ExpectedCode, Code)
-                 end)).
-
-expected_response_code("If-Match", _, true) ->
-    204;
-expected_response_code("If-Match", [], false) ->
-    204;
-expected_response_code("If-Match", _, false) ->
-    412;
-expected_response_code("If-None-Match", _, true) ->
-    412;
-expected_response_code("If-None-Match", [], false) ->
-    412;
-expected_response_code("If-None-Match", _, false) ->
-    204.
-
-etag_test_() ->
-    {spawn,
-     [{setup,
-       fun setup/0,
-       fun cleanup/1,
-       [
-        {timeout, 12,
-         ?_assert(eqc:quickcheck(eqc:testing_time(10, ?QC_OUT(etag_prop()))))}
-       ]}]}.
-
-setup() ->
-    %% Setup ETS table to hold current etag value
-    ets:new(?MODULE, [named_table, public]),
-
-    %% Spin up webmachine
-    WebConfig = [{ip, "0.0.0.0"}, {port, 12000},
-                 {dispatch, [{["etagtest", '*'], ?MODULE, []}]}],
-    {ok, Pid0} = webmachine_sup:start_link(),
-    {ok, Pid1} = webmachine_mochiweb:start(WebConfig),
-    link(Pid1),
-    {Pid0, Pid1}.
-
-cleanup({Pid0, Pid1}) ->
-    %% clean up
-    unlink(Pid0),
-    exit(Pid0, kill),
-    unlink(Pid1),
-    exit(Pid1, kill).
-
-init([]) ->
-    {ok, undefined}.
-
-allowed_methods(ReqData, Context) ->
-    {['PUT'], ReqData, Context}.
-
-content_types_accepted(ReqData, Context) ->
-    {[{"binary/octet-stream", on_put}], ReqData, Context}.
-
-on_put(ReqData, Context) ->
-    {ok, ReqData, Context}.
-
-generate_etag(ReqData, Context) ->
-    case ets:lookup(?MODULE, etag) of
-        [] ->
-            {undefined, ReqData, Context};
-        [{etag, ETag}] ->
-            {ETag, ReqData, Context}
-    end.
-
-ping(ReqData, State) ->
-    {pong, ReqData, State}.
-
--endif.
diff --git a/rabbitmq-server/erlang.mk b/rabbitmq-server/erlang.mk
deleted file mode 100644 (file)
index efbcf5c..0000000
+++ /dev/null
@@ -1,6702 +0,0 @@
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-.PHONY: all app deps search rel docs install-docs check tests clean distclean help erlang-mk
-
-ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
-
-ERLANG_MK_VERSION = 2.0.0-pre.2-76-g427cfb8
-
-# Core configuration.
-
-PROJECT ?= $(notdir $(CURDIR))
-PROJECT := $(strip $(PROJECT))
-
-PROJECT_VERSION ?= rolling
-
-# Verbosity.
-
-V ?= 0
-
-verbose_0 = @
-verbose_2 = set -x;
-verbose = $(verbose_$(V))
-
-gen_verbose_0 = @echo " GEN   " $@;
-gen_verbose_2 = set -x;
-gen_verbose = $(gen_verbose_$(V))
-
-# Temporary files directory.
-
-ERLANG_MK_TMP ?= $(CURDIR)/.erlang.mk
-export ERLANG_MK_TMP
-
-# "erl" command.
-
-ERL = erl +A0 -noinput -boot start_clean
-
-# Platform detection.
-
-ifeq ($(PLATFORM),)
-UNAME_S := $(shell uname -s)
-
-ifeq ($(UNAME_S),Linux)
-PLATFORM = linux
-else ifeq ($(UNAME_S),Darwin)
-PLATFORM = darwin
-else ifeq ($(UNAME_S),SunOS)
-PLATFORM = solaris
-else ifeq ($(UNAME_S),GNU)
-PLATFORM = gnu
-else ifeq ($(UNAME_S),FreeBSD)
-PLATFORM = freebsd
-else ifeq ($(UNAME_S),NetBSD)
-PLATFORM = netbsd
-else ifeq ($(UNAME_S),OpenBSD)
-PLATFORM = openbsd
-else ifeq ($(UNAME_S),DragonFly)
-PLATFORM = dragonfly
-else ifeq ($(shell uname -o),Msys)
-PLATFORM = msys2
-else
-$(error Unable to detect platform. Please open a ticket with the output of uname -a.)
-endif
-
-export PLATFORM
-endif
-
-# Core targets.
-
-all:: deps app rel
-
-# Noop to avoid a Make warning when there's nothing to do.
-rel::
-       $(verbose) :
-
-check:: tests
-
-clean:: clean-crashdump
-
-clean-crashdump:
-ifneq ($(wildcard erl_crash.dump),)
-       $(gen_verbose) rm -f erl_crash.dump
-endif
-
-distclean:: clean distclean-tmp
-
-distclean-tmp:
-       $(gen_verbose) rm -rf $(ERLANG_MK_TMP)
-
-help::
-       $(verbose) printf "%s\n" \
-               "erlang.mk (version $(ERLANG_MK_VERSION)) is distributed under the terms of the ISC License." \
-               "Copyright (c) 2013-2015 Loïc Hoguin <essen@ninenines.eu>" \
-               "" \
-               "Usage: [V=1] $(MAKE) [target]..." \
-               "" \
-               "Core targets:" \
-               "  all           Run deps, app and rel targets in that order" \
-               "  app           Compile the project" \
-               "  deps          Fetch dependencies (if needed) and compile them" \
-               "  fetch-deps    Fetch dependencies (if needed) without compiling them" \
-               "  list-deps     Fetch dependencies (if needed) and list them" \
-               "  search q=...  Search for a package in the built-in index" \
-               "  rel           Build a release for this project, if applicable" \
-               "  docs          Build the documentation for this project" \
-               "  install-docs  Install the man pages for this project" \
-               "  check         Compile and run all tests and analysis for this project" \
-               "  tests         Run the tests for this project" \
-               "  clean         Delete temporary and output files from most targets" \
-               "  distclean     Delete all temporary and output files" \
-               "  help          Display this help and exit" \
-               "  erlang-mk     Update erlang.mk to the latest version"
-
-# Core functions.
-
-empty :=
-space := $(empty) $(empty)
-tab := $(empty)        $(empty)
-comma := ,
-
-define newline
-
-
-endef
-
-define comma_list
-$(subst $(space),$(comma),$(strip $(1)))
-endef
-
-# Adding erlang.mk to make Erlang scripts who call init:get_plain_arguments() happy.
-define erlang
-$(ERL) $(2) -pz $(ERLANG_MK_TMP)/rebar/ebin -eval "$(subst $(newline),,$(subst ",\",$(1)))" -- erlang.mk
-endef
-
-ifeq ($(PLATFORM),msys2)
-core_native_path = $(subst \,\\\\,$(shell cygpath -w $1))
-else
-core_native_path = $1
-endif
-
-ifeq ($(shell which wget 2>/dev/null | wc -l), 1)
-define core_http_get
-       wget --no-check-certificate -O $(1) $(2)|| rm $(1)
-endef
-else
-define core_http_get.erl
-       ssl:start(),
-       inets:start(),
-       case httpc:request(get, {"$(2)", []}, [{autoredirect, true}], []) of
-               {ok, {{_, 200, _}, _, Body}} ->
-                       case file:write_file("$(1)", Body) of
-                               ok -> ok;
-                               {error, R1} -> halt(R1)
-                       end;
-               {error, R2} ->
-                       halt(R2)
-       end,
-       halt(0).
-endef
-
-define core_http_get
-       $(call erlang,$(call core_http_get.erl,$(call core_native_path,$1),$2))
-endef
-endif
-
-core_eq = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
-
-core_find = $(if $(wildcard $1),$(shell find $(1:%/=%) -type f -name $(subst *,\*,$2)))
-
-core_lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$(1)))))))))))))))))))))))))))
-
-core_ls = $(filter-out $(1),$(shell echo $(1)))
-
-# @todo Use a solution that does not require using perl.
-core_relpath = $(shell perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' $1 $2)
-
-# Automated update.
-
-ERLANG_MK_REPO ?= https://github.com/ninenines/erlang.mk
-ERLANG_MK_COMMIT ?=
-ERLANG_MK_BUILD_CONFIG ?= build.config
-ERLANG_MK_BUILD_DIR ?= .erlang.mk.build
-
-erlang-mk:
-       git clone $(ERLANG_MK_REPO) $(ERLANG_MK_BUILD_DIR)
-ifdef ERLANG_MK_COMMIT
-       cd $(ERLANG_MK_BUILD_DIR) && git checkout $(ERLANG_MK_COMMIT)
-endif
-       if [ -f $(ERLANG_MK_BUILD_CONFIG) ]; then cp $(ERLANG_MK_BUILD_CONFIG) $(ERLANG_MK_BUILD_DIR)/build.config; fi
-       $(MAKE) -C $(ERLANG_MK_BUILD_DIR)
-       cp $(ERLANG_MK_BUILD_DIR)/erlang.mk ./erlang.mk
-       rm -rf $(ERLANG_MK_BUILD_DIR)
-
-# The erlang.mk package index is bundled in the default erlang.mk build.
-# Search for the string "copyright" to skip to the rest of the code.
-
-PACKAGES += aberth
-pkg_aberth_name = aberth
-pkg_aberth_description = Generic BERT-RPC server in Erlang
-pkg_aberth_homepage = https://github.com/a13x/aberth
-pkg_aberth_fetch = git
-pkg_aberth_repo = https://github.com/a13x/aberth
-pkg_aberth_commit = master
-
-PACKAGES += active
-pkg_active_name = active
-pkg_active_description = Active development for Erlang: rebuild and reload source/binary files while the VM is running
-pkg_active_homepage = https://github.com/proger/active
-pkg_active_fetch = git
-pkg_active_repo = https://github.com/proger/active
-pkg_active_commit = master
-
-PACKAGES += actordb_core
-pkg_actordb_core_name = actordb_core
-pkg_actordb_core_description = ActorDB main source
-pkg_actordb_core_homepage = http://www.actordb.com/
-pkg_actordb_core_fetch = git
-pkg_actordb_core_repo = https://github.com/biokoda/actordb_core
-pkg_actordb_core_commit = master
-
-PACKAGES += actordb_thrift
-pkg_actordb_thrift_name = actordb_thrift
-pkg_actordb_thrift_description = Thrift API for ActorDB
-pkg_actordb_thrift_homepage = http://www.actordb.com/
-pkg_actordb_thrift_fetch = git
-pkg_actordb_thrift_repo = https://github.com/biokoda/actordb_thrift
-pkg_actordb_thrift_commit = master
-
-PACKAGES += aleppo
-pkg_aleppo_name = aleppo
-pkg_aleppo_description = Alternative Erlang Pre-Processor
-pkg_aleppo_homepage = https://github.com/ErlyORM/aleppo
-pkg_aleppo_fetch = git
-pkg_aleppo_repo = https://github.com/ErlyORM/aleppo
-pkg_aleppo_commit = master
-
-PACKAGES += alog
-pkg_alog_name = alog
-pkg_alog_description = Simply the best logging framework for Erlang
-pkg_alog_homepage = https://github.com/siberian-fast-food/alogger
-pkg_alog_fetch = git
-pkg_alog_repo = https://github.com/siberian-fast-food/alogger
-pkg_alog_commit = master
-
-PACKAGES += amqp_client
-pkg_amqp_client_name = amqp_client
-pkg_amqp_client_description = RabbitMQ Erlang AMQP client
-pkg_amqp_client_homepage = https://www.rabbitmq.com/erlang-client-user-guide.html
-pkg_amqp_client_fetch = git
-pkg_amqp_client_repo = https://github.com/rabbitmq/rabbitmq-erlang-client.git
-pkg_amqp_client_commit = master
-
-PACKAGES += annotations
-pkg_annotations_name = annotations
-pkg_annotations_description = Simple code instrumentation utilities
-pkg_annotations_homepage = https://github.com/hyperthunk/annotations
-pkg_annotations_fetch = git
-pkg_annotations_repo = https://github.com/hyperthunk/annotations
-pkg_annotations_commit = master
-
-PACKAGES += antidote
-pkg_antidote_name = antidote
-pkg_antidote_description = Large-scale computation without synchronisation
-pkg_antidote_homepage = https://syncfree.lip6.fr/
-pkg_antidote_fetch = git
-pkg_antidote_repo = https://github.com/SyncFree/antidote
-pkg_antidote_commit = master
-
-PACKAGES += apns
-pkg_apns_name = apns
-pkg_apns_description = Apple Push Notification Server for Erlang
-pkg_apns_homepage = http://inaka.github.com/apns4erl
-pkg_apns_fetch = git
-pkg_apns_repo = https://github.com/inaka/apns4erl
-pkg_apns_commit = 1.0.4
-
-PACKAGES += azdht
-pkg_azdht_name = azdht
-pkg_azdht_description = Azureus Distributed Hash Table (DHT) in Erlang
-pkg_azdht_homepage = https://github.com/arcusfelis/azdht
-pkg_azdht_fetch = git
-pkg_azdht_repo = https://github.com/arcusfelis/azdht
-pkg_azdht_commit = master
-
-PACKAGES += backoff
-pkg_backoff_name = backoff
-pkg_backoff_description = Simple exponential backoffs in Erlang
-pkg_backoff_homepage = https://github.com/ferd/backoff
-pkg_backoff_fetch = git
-pkg_backoff_repo = https://github.com/ferd/backoff
-pkg_backoff_commit = master
-
-PACKAGES += barrel_tcp
-pkg_barrel_tcp_name = barrel_tcp
-pkg_barrel_tcp_description = barrel is a generic TCP acceptor pool with low latency in Erlang.
-pkg_barrel_tcp_homepage = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_fetch = git
-pkg_barrel_tcp_repo = https://github.com/benoitc-attic/barrel_tcp
-pkg_barrel_tcp_commit = master
-
-PACKAGES += basho_bench
-pkg_basho_bench_name = basho_bench
-pkg_basho_bench_description = A load-generation and testing tool for basically whatever you can write a returning Erlang function for.
-pkg_basho_bench_homepage = https://github.com/basho/basho_bench
-pkg_basho_bench_fetch = git
-pkg_basho_bench_repo = https://github.com/basho/basho_bench
-pkg_basho_bench_commit = master
-
-PACKAGES += bcrypt
-pkg_bcrypt_name = bcrypt
-pkg_bcrypt_description = Bcrypt Erlang / C library
-pkg_bcrypt_homepage = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_fetch = git
-pkg_bcrypt_repo = https://github.com/riverrun/branglecrypt
-pkg_bcrypt_commit = master
-
-PACKAGES += beam
-pkg_beam_name = beam
-pkg_beam_description = BEAM emulator written in Erlang
-pkg_beam_homepage = https://github.com/tonyrog/beam
-pkg_beam_fetch = git
-pkg_beam_repo = https://github.com/tonyrog/beam
-pkg_beam_commit = master
-
-PACKAGES += beanstalk
-pkg_beanstalk_name = beanstalk
-pkg_beanstalk_description = An Erlang client for beanstalkd
-pkg_beanstalk_homepage = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_fetch = git
-pkg_beanstalk_repo = https://github.com/tim/erlang-beanstalk
-pkg_beanstalk_commit = master
-
-PACKAGES += bear
-pkg_bear_name = bear
-pkg_bear_description = a set of statistics functions for erlang
-pkg_bear_homepage = https://github.com/boundary/bear
-pkg_bear_fetch = git
-pkg_bear_repo = https://github.com/boundary/bear
-pkg_bear_commit = master
-
-PACKAGES += bertconf
-pkg_bertconf_name = bertconf
-pkg_bertconf_description = Make ETS tables out of statc BERT files that are auto-reloaded
-pkg_bertconf_homepage = https://github.com/ferd/bertconf
-pkg_bertconf_fetch = git
-pkg_bertconf_repo = https://github.com/ferd/bertconf
-pkg_bertconf_commit = master
-
-PACKAGES += bifrost
-pkg_bifrost_name = bifrost
-pkg_bifrost_description = Erlang FTP Server Framework
-pkg_bifrost_homepage = https://github.com/thorstadt/bifrost
-pkg_bifrost_fetch = git
-pkg_bifrost_repo = https://github.com/thorstadt/bifrost
-pkg_bifrost_commit = master
-
-PACKAGES += binpp
-pkg_binpp_name = binpp
-pkg_binpp_description = Erlang Binary Pretty Printer
-pkg_binpp_homepage = https://github.com/jtendo/binpp
-pkg_binpp_fetch = git
-pkg_binpp_repo = https://github.com/jtendo/binpp
-pkg_binpp_commit = master
-
-PACKAGES += bisect
-pkg_bisect_name = bisect
-pkg_bisect_description = Ordered fixed-size binary dictionary in Erlang
-pkg_bisect_homepage = https://github.com/knutin/bisect
-pkg_bisect_fetch = git
-pkg_bisect_repo = https://github.com/knutin/bisect
-pkg_bisect_commit = master
-
-PACKAGES += bitcask
-pkg_bitcask_name = bitcask
-pkg_bitcask_description = because you need another a key/value storage engine
-pkg_bitcask_homepage = https://github.com/basho/bitcask
-pkg_bitcask_fetch = git
-pkg_bitcask_repo = https://github.com/basho/bitcask
-pkg_bitcask_commit = master
-
-PACKAGES += bitstore
-pkg_bitstore_name = bitstore
-pkg_bitstore_description = A document based ontology development environment
-pkg_bitstore_homepage = https://github.com/bdionne/bitstore
-pkg_bitstore_fetch = git
-pkg_bitstore_repo = https://github.com/bdionne/bitstore
-pkg_bitstore_commit = master
-
-PACKAGES += bootstrap
-pkg_bootstrap_name = bootstrap
-pkg_bootstrap_description = A simple, yet powerful Erlang cluster bootstrapping application.
-pkg_bootstrap_homepage = https://github.com/schlagert/bootstrap
-pkg_bootstrap_fetch = git
-pkg_bootstrap_repo = https://github.com/schlagert/bootstrap
-pkg_bootstrap_commit = master
-
-PACKAGES += boss
-pkg_boss_name = boss
-pkg_boss_description = Erlang web MVC, now featuring Comet
-pkg_boss_homepage = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_fetch = git
-pkg_boss_repo = https://github.com/ChicagoBoss/ChicagoBoss
-pkg_boss_commit = master
-
-PACKAGES += boss_db
-pkg_boss_db_name = boss_db
-pkg_boss_db_description = BossDB: a sharded, caching, pooling, evented ORM for Erlang
-pkg_boss_db_homepage = https://github.com/ErlyORM/boss_db
-pkg_boss_db_fetch = git
-pkg_boss_db_repo = https://github.com/ErlyORM/boss_db
-pkg_boss_db_commit = master
-
-PACKAGES += brod
-pkg_brod_name = brod
-pkg_brod_description = Kafka client in Erlang
-pkg_brod_homepage = https://github.com/klarna/brod
-pkg_brod_fetch = git
-pkg_brod_repo = https://github.com/klarna/brod.git
-pkg_brod_commit = master
-
-PACKAGES += bson
-pkg_bson_name = bson
-pkg_bson_description = BSON documents in Erlang, see bsonspec.org
-pkg_bson_homepage = https://github.com/comtihon/bson-erlang
-pkg_bson_fetch = git
-pkg_bson_repo = https://github.com/comtihon/bson-erlang
-pkg_bson_commit = master
-
-PACKAGES += bullet
-pkg_bullet_name = bullet
-pkg_bullet_description = Simple, reliable, efficient streaming for Cowboy.
-pkg_bullet_homepage = http://ninenines.eu
-pkg_bullet_fetch = git
-pkg_bullet_repo = https://github.com/ninenines/bullet
-pkg_bullet_commit = master
-
-PACKAGES += cache
-pkg_cache_name = cache
-pkg_cache_description = Erlang in-memory cache
-pkg_cache_homepage = https://github.com/fogfish/cache
-pkg_cache_fetch = git
-pkg_cache_repo = https://github.com/fogfish/cache
-pkg_cache_commit = master
-
-PACKAGES += cake
-pkg_cake_name = cake
-pkg_cake_description = Really simple terminal colorization
-pkg_cake_homepage = https://github.com/darach/cake-erl
-pkg_cake_fetch = git
-pkg_cake_repo = https://github.com/darach/cake-erl
-pkg_cake_commit = v0.1.2
-
-PACKAGES += carotene
-pkg_carotene_name = carotene
-pkg_carotene_description = Real-time server
-pkg_carotene_homepage = https://github.com/carotene/carotene
-pkg_carotene_fetch = git
-pkg_carotene_repo = https://github.com/carotene/carotene
-pkg_carotene_commit = master
-
-PACKAGES += cberl
-pkg_cberl_name = cberl
-pkg_cberl_description = NIF based Erlang bindings for Couchbase
-pkg_cberl_homepage = https://github.com/chitika/cberl
-pkg_cberl_fetch = git
-pkg_cberl_repo = https://github.com/chitika/cberl
-pkg_cberl_commit = master
-
-PACKAGES += cecho
-pkg_cecho_name = cecho
-pkg_cecho_description = An ncurses library for Erlang
-pkg_cecho_homepage = https://github.com/mazenharake/cecho
-pkg_cecho_fetch = git
-pkg_cecho_repo = https://github.com/mazenharake/cecho
-pkg_cecho_commit = master
-
-PACKAGES += cferl
-pkg_cferl_name = cferl
-pkg_cferl_description = Rackspace / Open Stack Cloud Files Erlang Client
-pkg_cferl_homepage = https://github.com/ddossot/cferl
-pkg_cferl_fetch = git
-pkg_cferl_repo = https://github.com/ddossot/cferl
-pkg_cferl_commit = master
-
-PACKAGES += chaos_monkey
-pkg_chaos_monkey_name = chaos_monkey
-pkg_chaos_monkey_description = This is The CHAOS MONKEY.  It will kill your processes.
-pkg_chaos_monkey_homepage = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_fetch = git
-pkg_chaos_monkey_repo = https://github.com/dLuna/chaos_monkey
-pkg_chaos_monkey_commit = master
-
-PACKAGES += check_node
-pkg_check_node_name = check_node
-pkg_check_node_description = Nagios Scripts for monitoring Riak
-pkg_check_node_homepage = https://github.com/basho-labs/riak_nagios
-pkg_check_node_fetch = git
-pkg_check_node_repo = https://github.com/basho-labs/riak_nagios
-pkg_check_node_commit = master
-
-PACKAGES += chronos
-pkg_chronos_name = chronos
-pkg_chronos_description = Timer module for Erlang that makes it easy to abstact time out of the tests.
-pkg_chronos_homepage = https://github.com/lehoff/chronos
-pkg_chronos_fetch = git
-pkg_chronos_repo = https://github.com/lehoff/chronos
-pkg_chronos_commit = master
-
-PACKAGES += cl
-pkg_cl_name = cl
-pkg_cl_description = OpenCL binding for Erlang
-pkg_cl_homepage = https://github.com/tonyrog/cl
-pkg_cl_fetch = git
-pkg_cl_repo = https://github.com/tonyrog/cl
-pkg_cl_commit = master
-
-PACKAGES += classifier
-pkg_classifier_name = classifier
-pkg_classifier_description = An Erlang Bayesian Filter and Text Classifier
-pkg_classifier_homepage = https://github.com/inaka/classifier
-pkg_classifier_fetch = git
-pkg_classifier_repo = https://github.com/inaka/classifier
-pkg_classifier_commit = master
-
-PACKAGES += clique
-pkg_clique_name = clique
-pkg_clique_description = CLI Framework for Erlang
-pkg_clique_homepage = https://github.com/basho/clique
-pkg_clique_fetch = git
-pkg_clique_repo = https://github.com/basho/clique
-pkg_clique_commit = develop
-
-PACKAGES += cloudi_core
-pkg_cloudi_core_name = cloudi_core
-pkg_cloudi_core_description = CloudI internal service runtime
-pkg_cloudi_core_homepage = http://cloudi.org/
-pkg_cloudi_core_fetch = git
-pkg_cloudi_core_repo = https://github.com/CloudI/cloudi_core
-pkg_cloudi_core_commit = master
-
-PACKAGES += cloudi_service_api_requests
-pkg_cloudi_service_api_requests_name = cloudi_service_api_requests
-pkg_cloudi_service_api_requests_description = CloudI Service API requests (JSON-RPC/Erlang-term support)
-pkg_cloudi_service_api_requests_homepage = http://cloudi.org/
-pkg_cloudi_service_api_requests_fetch = git
-pkg_cloudi_service_api_requests_repo = https://github.com/CloudI/cloudi_service_api_requests
-pkg_cloudi_service_api_requests_commit = master
-
-PACKAGES += cloudi_service_db
-pkg_cloudi_service_db_name = cloudi_service_db
-pkg_cloudi_service_db_description = CloudI Database (in-memory/testing/generic)
-pkg_cloudi_service_db_homepage = http://cloudi.org/
-pkg_cloudi_service_db_fetch = git
-pkg_cloudi_service_db_repo = https://github.com/CloudI/cloudi_service_db
-pkg_cloudi_service_db_commit = master
-
-PACKAGES += cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_name = cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_description = Cassandra CloudI Service
-pkg_cloudi_service_db_cassandra_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_fetch = git
-pkg_cloudi_service_db_cassandra_repo = https://github.com/CloudI/cloudi_service_db_cassandra
-pkg_cloudi_service_db_cassandra_commit = master
-
-PACKAGES += cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_name = cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_description = Cassandra CQL CloudI Service
-pkg_cloudi_service_db_cassandra_cql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_cassandra_cql_fetch = git
-pkg_cloudi_service_db_cassandra_cql_repo = https://github.com/CloudI/cloudi_service_db_cassandra_cql
-pkg_cloudi_service_db_cassandra_cql_commit = master
-
-PACKAGES += cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_name = cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_description = CouchDB CloudI Service
-pkg_cloudi_service_db_couchdb_homepage = http://cloudi.org/
-pkg_cloudi_service_db_couchdb_fetch = git
-pkg_cloudi_service_db_couchdb_repo = https://github.com/CloudI/cloudi_service_db_couchdb
-pkg_cloudi_service_db_couchdb_commit = master
-
-PACKAGES += cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_name = cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_description = elasticsearch CloudI Service
-pkg_cloudi_service_db_elasticsearch_homepage = http://cloudi.org/
-pkg_cloudi_service_db_elasticsearch_fetch = git
-pkg_cloudi_service_db_elasticsearch_repo = https://github.com/CloudI/cloudi_service_db_elasticsearch
-pkg_cloudi_service_db_elasticsearch_commit = master
-
-PACKAGES += cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_name = cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_description = memcached CloudI Service
-pkg_cloudi_service_db_memcached_homepage = http://cloudi.org/
-pkg_cloudi_service_db_memcached_fetch = git
-pkg_cloudi_service_db_memcached_repo = https://github.com/CloudI/cloudi_service_db_memcached
-pkg_cloudi_service_db_memcached_commit = master
-
-PACKAGES += cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_name = cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_description = MySQL CloudI Service
-pkg_cloudi_service_db_mysql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_mysql_fetch = git
-pkg_cloudi_service_db_mysql_repo = https://github.com/CloudI/cloudi_service_db_mysql
-pkg_cloudi_service_db_mysql_commit = master
-
-PACKAGES += cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_name = cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_description = PostgreSQL CloudI Service
-pkg_cloudi_service_db_pgsql_homepage = http://cloudi.org/
-pkg_cloudi_service_db_pgsql_fetch = git
-pkg_cloudi_service_db_pgsql_repo = https://github.com/CloudI/cloudi_service_db_pgsql
-pkg_cloudi_service_db_pgsql_commit = master
-
-PACKAGES += cloudi_service_db_riak
-pkg_cloudi_service_db_riak_name = cloudi_service_db_riak
-pkg_cloudi_service_db_riak_description = Riak CloudI Service
-pkg_cloudi_service_db_riak_homepage = http://cloudi.org/
-pkg_cloudi_service_db_riak_fetch = git
-pkg_cloudi_service_db_riak_repo = https://github.com/CloudI/cloudi_service_db_riak
-pkg_cloudi_service_db_riak_commit = master
-
-PACKAGES += cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_name = cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_description = Tokyo Tyrant CloudI Service
-pkg_cloudi_service_db_tokyotyrant_homepage = http://cloudi.org/
-pkg_cloudi_service_db_tokyotyrant_fetch = git
-pkg_cloudi_service_db_tokyotyrant_repo = https://github.com/CloudI/cloudi_service_db_tokyotyrant
-pkg_cloudi_service_db_tokyotyrant_commit = master
-
-PACKAGES += cloudi_service_filesystem
-pkg_cloudi_service_filesystem_name = cloudi_service_filesystem
-pkg_cloudi_service_filesystem_description = Filesystem CloudI Service
-pkg_cloudi_service_filesystem_homepage = http://cloudi.org/
-pkg_cloudi_service_filesystem_fetch = git
-pkg_cloudi_service_filesystem_repo = https://github.com/CloudI/cloudi_service_filesystem
-pkg_cloudi_service_filesystem_commit = master
-
-PACKAGES += cloudi_service_http_client
-pkg_cloudi_service_http_client_name = cloudi_service_http_client
-pkg_cloudi_service_http_client_description = HTTP client CloudI Service
-pkg_cloudi_service_http_client_homepage = http://cloudi.org/
-pkg_cloudi_service_http_client_fetch = git
-pkg_cloudi_service_http_client_repo = https://github.com/CloudI/cloudi_service_http_client
-pkg_cloudi_service_http_client_commit = master
-
-PACKAGES += cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_name = cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_description = cowboy HTTP/HTTPS CloudI Service
-pkg_cloudi_service_http_cowboy_homepage = http://cloudi.org/
-pkg_cloudi_service_http_cowboy_fetch = git
-pkg_cloudi_service_http_cowboy_repo = https://github.com/CloudI/cloudi_service_http_cowboy
-pkg_cloudi_service_http_cowboy_commit = master
-
-PACKAGES += cloudi_service_http_elli
-pkg_cloudi_service_http_elli_name = cloudi_service_http_elli
-pkg_cloudi_service_http_elli_description = elli HTTP CloudI Service
-pkg_cloudi_service_http_elli_homepage = http://cloudi.org/
-pkg_cloudi_service_http_elli_fetch = git
-pkg_cloudi_service_http_elli_repo = https://github.com/CloudI/cloudi_service_http_elli
-pkg_cloudi_service_http_elli_commit = master
-
-PACKAGES += cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_name = cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_description = Map/Reduce CloudI Service
-pkg_cloudi_service_map_reduce_homepage = http://cloudi.org/
-pkg_cloudi_service_map_reduce_fetch = git
-pkg_cloudi_service_map_reduce_repo = https://github.com/CloudI/cloudi_service_map_reduce
-pkg_cloudi_service_map_reduce_commit = master
-
-PACKAGES += cloudi_service_oauth1
-pkg_cloudi_service_oauth1_name = cloudi_service_oauth1
-pkg_cloudi_service_oauth1_description = OAuth v1.0 CloudI Service
-pkg_cloudi_service_oauth1_homepage = http://cloudi.org/
-pkg_cloudi_service_oauth1_fetch = git
-pkg_cloudi_service_oauth1_repo = https://github.com/CloudI/cloudi_service_oauth1
-pkg_cloudi_service_oauth1_commit = master
-
-PACKAGES += cloudi_service_queue
-pkg_cloudi_service_queue_name = cloudi_service_queue
-pkg_cloudi_service_queue_description = Persistent Queue Service
-pkg_cloudi_service_queue_homepage = http://cloudi.org/
-pkg_cloudi_service_queue_fetch = git
-pkg_cloudi_service_queue_repo = https://github.com/CloudI/cloudi_service_queue
-pkg_cloudi_service_queue_commit = master
-
-PACKAGES += cloudi_service_quorum
-pkg_cloudi_service_quorum_name = cloudi_service_quorum
-pkg_cloudi_service_quorum_description = CloudI Quorum Service
-pkg_cloudi_service_quorum_homepage = http://cloudi.org/
-pkg_cloudi_service_quorum_fetch = git
-pkg_cloudi_service_quorum_repo = https://github.com/CloudI/cloudi_service_quorum
-pkg_cloudi_service_quorum_commit = master
-
-PACKAGES += cloudi_service_router
-pkg_cloudi_service_router_name = cloudi_service_router
-pkg_cloudi_service_router_description = CloudI Router Service
-pkg_cloudi_service_router_homepage = http://cloudi.org/
-pkg_cloudi_service_router_fetch = git
-pkg_cloudi_service_router_repo = https://github.com/CloudI/cloudi_service_router
-pkg_cloudi_service_router_commit = master
-
-PACKAGES += cloudi_service_tcp
-pkg_cloudi_service_tcp_name = cloudi_service_tcp
-pkg_cloudi_service_tcp_description = TCP CloudI Service
-pkg_cloudi_service_tcp_homepage = http://cloudi.org/
-pkg_cloudi_service_tcp_fetch = git
-pkg_cloudi_service_tcp_repo = https://github.com/CloudI/cloudi_service_tcp
-pkg_cloudi_service_tcp_commit = master
-
-PACKAGES += cloudi_service_timers
-pkg_cloudi_service_timers_name = cloudi_service_timers
-pkg_cloudi_service_timers_description = Timers CloudI Service
-pkg_cloudi_service_timers_homepage = http://cloudi.org/
-pkg_cloudi_service_timers_fetch = git
-pkg_cloudi_service_timers_repo = https://github.com/CloudI/cloudi_service_timers
-pkg_cloudi_service_timers_commit = master
-
-PACKAGES += cloudi_service_udp
-pkg_cloudi_service_udp_name = cloudi_service_udp
-pkg_cloudi_service_udp_description = UDP CloudI Service
-pkg_cloudi_service_udp_homepage = http://cloudi.org/
-pkg_cloudi_service_udp_fetch = git
-pkg_cloudi_service_udp_repo = https://github.com/CloudI/cloudi_service_udp
-pkg_cloudi_service_udp_commit = master
-
-PACKAGES += cloudi_service_validate
-pkg_cloudi_service_validate_name = cloudi_service_validate
-pkg_cloudi_service_validate_description = CloudI Validate Service
-pkg_cloudi_service_validate_homepage = http://cloudi.org/
-pkg_cloudi_service_validate_fetch = git
-pkg_cloudi_service_validate_repo = https://github.com/CloudI/cloudi_service_validate
-pkg_cloudi_service_validate_commit = master
-
-PACKAGES += cloudi_service_zeromq
-pkg_cloudi_service_zeromq_name = cloudi_service_zeromq
-pkg_cloudi_service_zeromq_description = ZeroMQ CloudI Service
-pkg_cloudi_service_zeromq_homepage = http://cloudi.org/
-pkg_cloudi_service_zeromq_fetch = git
-pkg_cloudi_service_zeromq_repo = https://github.com/CloudI/cloudi_service_zeromq
-pkg_cloudi_service_zeromq_commit = master
-
-PACKAGES += cluster_info
-pkg_cluster_info_name = cluster_info
-pkg_cluster_info_description = Fork of Hibari's nifty cluster_info OTP app
-pkg_cluster_info_homepage = https://github.com/basho/cluster_info
-pkg_cluster_info_fetch = git
-pkg_cluster_info_repo = https://github.com/basho/cluster_info
-pkg_cluster_info_commit = master
-
-PACKAGES += color
-pkg_color_name = color
-pkg_color_description = ANSI colors for your Erlang
-pkg_color_homepage = https://github.com/julianduque/erlang-color
-pkg_color_fetch = git
-pkg_color_repo = https://github.com/julianduque/erlang-color
-pkg_color_commit = master
-
-PACKAGES += confetti
-pkg_confetti_name = confetti
-pkg_confetti_description = Erlang configuration provider / application:get_env/2 on steroids
-pkg_confetti_homepage = https://github.com/jtendo/confetti
-pkg_confetti_fetch = git
-pkg_confetti_repo = https://github.com/jtendo/confetti
-pkg_confetti_commit = master
-
-PACKAGES += couchbeam
-pkg_couchbeam_name = couchbeam
-pkg_couchbeam_description = Apache CouchDB client in Erlang
-pkg_couchbeam_homepage = https://github.com/benoitc/couchbeam
-pkg_couchbeam_fetch = git
-pkg_couchbeam_repo = https://github.com/benoitc/couchbeam
-pkg_couchbeam_commit = master
-
-PACKAGES += covertool
-pkg_covertool_name = covertool
-pkg_covertool_description = Tool to convert Erlang cover data files into Cobertura XML reports
-pkg_covertool_homepage = https://github.com/idubrov/covertool
-pkg_covertool_fetch = git
-pkg_covertool_repo = https://github.com/idubrov/covertool
-pkg_covertool_commit = master
-
-PACKAGES += cowboy
-pkg_cowboy_name = cowboy
-pkg_cowboy_description = Small, fast and modular HTTP server.
-pkg_cowboy_homepage = http://ninenines.eu
-pkg_cowboy_fetch = git
-pkg_cowboy_repo = https://github.com/ninenines/cowboy
-pkg_cowboy_commit = 1.0.1
-
-PACKAGES += cowdb
-pkg_cowdb_name = cowdb
-pkg_cowdb_description = Pure Key/Value database library for Erlang Applications
-pkg_cowdb_homepage = https://github.com/refuge/cowdb
-pkg_cowdb_fetch = git
-pkg_cowdb_repo = https://github.com/refuge/cowdb
-pkg_cowdb_commit = master
-
-PACKAGES += cowlib
-pkg_cowlib_name = cowlib
-pkg_cowlib_description = Support library for manipulating Web protocols.
-pkg_cowlib_homepage = http://ninenines.eu
-pkg_cowlib_fetch = git
-pkg_cowlib_repo = https://github.com/ninenines/cowlib
-pkg_cowlib_commit = 1.0.1
-
-PACKAGES += cpg
-pkg_cpg_name = cpg
-pkg_cpg_description = CloudI Process Groups
-pkg_cpg_homepage = https://github.com/okeuday/cpg
-pkg_cpg_fetch = git
-pkg_cpg_repo = https://github.com/okeuday/cpg
-pkg_cpg_commit = master
-
-PACKAGES += cqerl
-pkg_cqerl_name = cqerl
-pkg_cqerl_description = Native Erlang CQL client for Cassandra
-pkg_cqerl_homepage = https://matehat.github.io/cqerl/
-pkg_cqerl_fetch = git
-pkg_cqerl_repo = https://github.com/matehat/cqerl
-pkg_cqerl_commit = master
-
-PACKAGES += cr
-pkg_cr_name = cr
-pkg_cr_description = Chain Replication
-pkg_cr_homepage = https://synrc.com/apps/cr/doc/cr.htm
-pkg_cr_fetch = git
-pkg_cr_repo = https://github.com/spawnproc/cr
-pkg_cr_commit = master
-
-PACKAGES += cuttlefish
-pkg_cuttlefish_name = cuttlefish
-pkg_cuttlefish_description = never lose your childlike sense of wonder baby cuttlefish, promise me?
-pkg_cuttlefish_homepage = https://github.com/basho/cuttlefish
-pkg_cuttlefish_fetch = git
-pkg_cuttlefish_repo = https://github.com/basho/cuttlefish
-pkg_cuttlefish_commit = master
-
-PACKAGES += damocles
-pkg_damocles_name = damocles
-pkg_damocles_description = Erlang library for generating adversarial network conditions for QAing distributed applications/systems on a single Linux box.
-pkg_damocles_homepage = https://github.com/lostcolony/damocles
-pkg_damocles_fetch = git
-pkg_damocles_repo = https://github.com/lostcolony/damocles
-pkg_damocles_commit = master
-
-PACKAGES += debbie
-pkg_debbie_name = debbie
-pkg_debbie_description = .DEB Built In Erlang
-pkg_debbie_homepage = https://github.com/crownedgrouse/debbie
-pkg_debbie_fetch = git
-pkg_debbie_repo = https://github.com/crownedgrouse/debbie
-pkg_debbie_commit = master
-
-PACKAGES += decimal
-pkg_decimal_name = decimal
-pkg_decimal_description = An Erlang decimal arithmetic library
-pkg_decimal_homepage = https://github.com/tim/erlang-decimal
-pkg_decimal_fetch = git
-pkg_decimal_repo = https://github.com/tim/erlang-decimal
-pkg_decimal_commit = master
-
-PACKAGES += detergent
-pkg_detergent_name = detergent
-pkg_detergent_description = An emulsifying Erlang SOAP library
-pkg_detergent_homepage = https://github.com/devinus/detergent
-pkg_detergent_fetch = git
-pkg_detergent_repo = https://github.com/devinus/detergent
-pkg_detergent_commit = master
-
-PACKAGES += detest
-pkg_detest_name = detest
-pkg_detest_description = Tool for running tests on a cluster of erlang nodes
-pkg_detest_homepage = https://github.com/biokoda/detest
-pkg_detest_fetch = git
-pkg_detest_repo = https://github.com/biokoda/detest
-pkg_detest_commit = master
-
-PACKAGES += dh_date
-pkg_dh_date_name = dh_date
-pkg_dh_date_description = Date formatting / parsing library for erlang
-pkg_dh_date_homepage = https://github.com/daleharvey/dh_date
-pkg_dh_date_fetch = git
-pkg_dh_date_repo = https://github.com/daleharvey/dh_date
-pkg_dh_date_commit = master
-
-PACKAGES += dirbusterl
-pkg_dirbusterl_name = dirbusterl
-pkg_dirbusterl_description = DirBuster successor in Erlang
-pkg_dirbusterl_homepage = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_fetch = git
-pkg_dirbusterl_repo = https://github.com/silentsignal/DirBustErl
-pkg_dirbusterl_commit = master
-
-PACKAGES += dispcount
-pkg_dispcount_name = dispcount
-pkg_dispcount_description = Erlang task dispatcher based on ETS counters.
-pkg_dispcount_homepage = https://github.com/ferd/dispcount
-pkg_dispcount_fetch = git
-pkg_dispcount_repo = https://github.com/ferd/dispcount
-pkg_dispcount_commit = master
-
-PACKAGES += dlhttpc
-pkg_dlhttpc_name = dlhttpc
-pkg_dlhttpc_description = dispcount-based lhttpc fork for massive amounts of requests to limited endpoints
-pkg_dlhttpc_homepage = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_fetch = git
-pkg_dlhttpc_repo = https://github.com/ferd/dlhttpc
-pkg_dlhttpc_commit = master
-
-PACKAGES += dns
-pkg_dns_name = dns
-pkg_dns_description = Erlang DNS library
-pkg_dns_homepage = https://github.com/aetrion/dns_erlang
-pkg_dns_fetch = git
-pkg_dns_repo = https://github.com/aetrion/dns_erlang
-pkg_dns_commit = master
-
-PACKAGES += dnssd
-pkg_dnssd_name = dnssd
-pkg_dnssd_description = Erlang interface to Apple's Bonjour D    NS Service Discovery implementation
-pkg_dnssd_homepage = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_fetch = git
-pkg_dnssd_repo = https://github.com/benoitc/dnssd_erlang
-pkg_dnssd_commit = master
-
-PACKAGES += dtl
-pkg_dtl_name = dtl
-pkg_dtl_description = Django Template Language: A full-featured port of the Django template engine to Erlang.
-pkg_dtl_homepage = https://github.com/oinksoft/dtl
-pkg_dtl_fetch = git
-pkg_dtl_repo = https://github.com/oinksoft/dtl
-pkg_dtl_commit = master
-
-PACKAGES += dynamic_compile
-pkg_dynamic_compile_name = dynamic_compile
-pkg_dynamic_compile_description = compile and load erlang modules from string input
-pkg_dynamic_compile_homepage = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_fetch = git
-pkg_dynamic_compile_repo = https://github.com/jkvor/dynamic_compile
-pkg_dynamic_compile_commit = master
-
-PACKAGES += e2
-pkg_e2_name = e2
-pkg_e2_description = Library to simply writing correct OTP applications.
-pkg_e2_homepage = http://e2project.org
-pkg_e2_fetch = git
-pkg_e2_repo = https://github.com/gar1t/e2
-pkg_e2_commit = master
-
-PACKAGES += eamf
-pkg_eamf_name = eamf
-pkg_eamf_description = eAMF provides Action Message Format (AMF) support for Erlang
-pkg_eamf_homepage = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_fetch = git
-pkg_eamf_repo = https://github.com/mrinalwadhwa/eamf
-pkg_eamf_commit = master
-
-PACKAGES += eavro
-pkg_eavro_name = eavro
-pkg_eavro_description = Apache Avro encoder/decoder
-pkg_eavro_homepage = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_fetch = git
-pkg_eavro_repo = https://github.com/SIfoxDevTeam/eavro
-pkg_eavro_commit = master
-
-PACKAGES += ecapnp
-pkg_ecapnp_name = ecapnp
-pkg_ecapnp_description = Cap'n Proto library for Erlang
-pkg_ecapnp_homepage = https://github.com/kaos/ecapnp
-pkg_ecapnp_fetch = git
-pkg_ecapnp_repo = https://github.com/kaos/ecapnp
-pkg_ecapnp_commit = master
-
-PACKAGES += econfig
-pkg_econfig_name = econfig
-pkg_econfig_description = simple Erlang config handler using INI files
-pkg_econfig_homepage = https://github.com/benoitc/econfig
-pkg_econfig_fetch = git
-pkg_econfig_repo = https://github.com/benoitc/econfig
-pkg_econfig_commit = master
-
-PACKAGES += edate
-pkg_edate_name = edate
-pkg_edate_description = date manipulation library for erlang
-pkg_edate_homepage = https://github.com/dweldon/edate
-pkg_edate_fetch = git
-pkg_edate_repo = https://github.com/dweldon/edate
-pkg_edate_commit = master
-
-PACKAGES += edgar
-pkg_edgar_name = edgar
-pkg_edgar_description = Erlang Does GNU AR
-pkg_edgar_homepage = https://github.com/crownedgrouse/edgar
-pkg_edgar_fetch = git
-pkg_edgar_repo = https://github.com/crownedgrouse/edgar
-pkg_edgar_commit = master
-
-PACKAGES += edis
-pkg_edis_name = edis
-pkg_edis_description = An Erlang implementation of Redis KV Store
-pkg_edis_homepage = http://inaka.github.com/edis/
-pkg_edis_fetch = git
-pkg_edis_repo = https://github.com/inaka/edis
-pkg_edis_commit = master
-
-PACKAGES += edns
-pkg_edns_name = edns
-pkg_edns_description = Erlang/OTP DNS server
-pkg_edns_homepage = https://github.com/hcvst/erlang-dns
-pkg_edns_fetch = git
-pkg_edns_repo = https://github.com/hcvst/erlang-dns
-pkg_edns_commit = master
-
-PACKAGES += edown
-pkg_edown_name = edown
-pkg_edown_description = EDoc extension for generating Github-flavored Markdown
-pkg_edown_homepage = https://github.com/uwiger/edown
-pkg_edown_fetch = git
-pkg_edown_repo = https://github.com/uwiger/edown
-pkg_edown_commit = master
-
-PACKAGES += eep
-pkg_eep_name = eep
-pkg_eep_description = Erlang Easy Profiling (eep) application provides a way to analyze application performance and call hierarchy
-pkg_eep_homepage = https://github.com/virtan/eep
-pkg_eep_fetch = git
-pkg_eep_repo = https://github.com/virtan/eep
-pkg_eep_commit = master
-
-PACKAGES += eep_app
-pkg_eep_app_name = eep_app
-pkg_eep_app_description = Embedded Event Processing
-pkg_eep_app_homepage = https://github.com/darach/eep-erl
-pkg_eep_app_fetch = git
-pkg_eep_app_repo = https://github.com/darach/eep-erl
-pkg_eep_app_commit = master
-
-PACKAGES += efene
-pkg_efene_name = efene
-pkg_efene_description = Alternative syntax for the Erlang Programming Language focusing on simplicity, ease of use and programmer UX
-pkg_efene_homepage = https://github.com/efene/efene
-pkg_efene_fetch = git
-pkg_efene_repo = https://github.com/efene/efene
-pkg_efene_commit = master
-
-PACKAGES += eganglia
-pkg_eganglia_name = eganglia
-pkg_eganglia_description = Erlang library to interact with Ganglia
-pkg_eganglia_homepage = https://github.com/inaka/eganglia
-pkg_eganglia_fetch = git
-pkg_eganglia_repo = https://github.com/inaka/eganglia
-pkg_eganglia_commit = v0.9.1
-
-PACKAGES += egeoip
-pkg_egeoip_name = egeoip
-pkg_egeoip_description = Erlang IP Geolocation module, currently supporting the MaxMind GeoLite City Database.
-pkg_egeoip_homepage = https://github.com/mochi/egeoip
-pkg_egeoip_fetch = git
-pkg_egeoip_repo = https://github.com/mochi/egeoip
-pkg_egeoip_commit = master
-
-PACKAGES += ehsa
-pkg_ehsa_name = ehsa
-pkg_ehsa_description = Erlang HTTP server basic and digest authentication modules
-pkg_ehsa_homepage = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_fetch = hg
-pkg_ehsa_repo = https://bitbucket.org/a12n/ehsa
-pkg_ehsa_commit = 2.0.4
-
-PACKAGES += ej
-pkg_ej_name = ej
-pkg_ej_description = Helper module for working with Erlang terms representing JSON
-pkg_ej_homepage = https://github.com/seth/ej
-pkg_ej_fetch = git
-pkg_ej_repo = https://github.com/seth/ej
-pkg_ej_commit = master
-
-PACKAGES += ejabberd
-pkg_ejabberd_name = ejabberd
-pkg_ejabberd_description = Robust, ubiquitous and massively scalable Jabber / XMPP Instant Messaging platform
-pkg_ejabberd_homepage = https://github.com/processone/ejabberd
-pkg_ejabberd_fetch = git
-pkg_ejabberd_repo = https://github.com/processone/ejabberd
-pkg_ejabberd_commit = master
-
-PACKAGES += ejwt
-pkg_ejwt_name = ejwt
-pkg_ejwt_description = erlang library for JSON Web Token
-pkg_ejwt_homepage = https://github.com/artefactop/ejwt
-pkg_ejwt_fetch = git
-pkg_ejwt_repo = https://github.com/artefactop/ejwt
-pkg_ejwt_commit = master
-
-PACKAGES += ekaf
-pkg_ekaf_name = ekaf
-pkg_ekaf_description = A minimal, high-performance Kafka client in Erlang.
-pkg_ekaf_homepage = https://github.com/helpshift/ekaf
-pkg_ekaf_fetch = git
-pkg_ekaf_repo = https://github.com/helpshift/ekaf
-pkg_ekaf_commit = master
-
-PACKAGES += elarm
-pkg_elarm_name = elarm
-pkg_elarm_description = Alarm Manager for Erlang.
-pkg_elarm_homepage = https://github.com/esl/elarm
-pkg_elarm_fetch = git
-pkg_elarm_repo = https://github.com/esl/elarm
-pkg_elarm_commit = master
-
-PACKAGES += eleveldb
-pkg_eleveldb_name = eleveldb
-pkg_eleveldb_description = Erlang LevelDB API
-pkg_eleveldb_homepage = https://github.com/basho/eleveldb
-pkg_eleveldb_fetch = git
-pkg_eleveldb_repo = https://github.com/basho/eleveldb
-pkg_eleveldb_commit = master
-
-PACKAGES += elli
-pkg_elli_name = elli
-pkg_elli_description = Simple, robust and performant Erlang web server
-pkg_elli_homepage = https://github.com/knutin/elli
-pkg_elli_fetch = git
-pkg_elli_repo = https://github.com/knutin/elli
-pkg_elli_commit = master
-
-PACKAGES += elvis
-pkg_elvis_name = elvis
-pkg_elvis_description = Erlang Style Reviewer
-pkg_elvis_homepage = https://github.com/inaka/elvis
-pkg_elvis_fetch = git
-pkg_elvis_repo = https://github.com/inaka/elvis
-pkg_elvis_commit = master
-
-PACKAGES += emagick
-pkg_emagick_name = emagick
-pkg_emagick_description = Wrapper for Graphics/ImageMagick command line tool.
-pkg_emagick_homepage = https://github.com/kivra/emagick
-pkg_emagick_fetch = git
-pkg_emagick_repo = https://github.com/kivra/emagick
-pkg_emagick_commit = master
-
-PACKAGES += emysql
-pkg_emysql_name = emysql
-pkg_emysql_description = Stable, pure Erlang MySQL driver.
-pkg_emysql_homepage = https://github.com/Eonblast/Emysql
-pkg_emysql_fetch = git
-pkg_emysql_repo = https://github.com/Eonblast/Emysql
-pkg_emysql_commit = master
-
-PACKAGES += enm
-pkg_enm_name = enm
-pkg_enm_description = Erlang driver for nanomsg
-pkg_enm_homepage = https://github.com/basho/enm
-pkg_enm_fetch = git
-pkg_enm_repo = https://github.com/basho/enm
-pkg_enm_commit = master
-
-PACKAGES += entop
-pkg_entop_name = entop
-pkg_entop_description = A top-like tool for monitoring an Erlang node
-pkg_entop_homepage = https://github.com/mazenharake/entop
-pkg_entop_fetch = git
-pkg_entop_repo = https://github.com/mazenharake/entop
-pkg_entop_commit = master
-
-PACKAGES += epcap
-pkg_epcap_name = epcap
-pkg_epcap_description = Erlang packet capture interface using pcap
-pkg_epcap_homepage = https://github.com/msantos/epcap
-pkg_epcap_fetch = git
-pkg_epcap_repo = https://github.com/msantos/epcap
-pkg_epcap_commit = master
-
-PACKAGES += eper
-pkg_eper_name = eper
-pkg_eper_description = Erlang performance and debugging tools.
-pkg_eper_homepage = https://github.com/massemanet/eper
-pkg_eper_fetch = git
-pkg_eper_repo = https://github.com/massemanet/eper
-pkg_eper_commit = master
-
-PACKAGES += epgsql
-pkg_epgsql_name = epgsql
-pkg_epgsql_description = Erlang PostgreSQL client library.
-pkg_epgsql_homepage = https://github.com/epgsql/epgsql
-pkg_epgsql_fetch = git
-pkg_epgsql_repo = https://github.com/epgsql/epgsql
-pkg_epgsql_commit = master
-
-PACKAGES += episcina
-pkg_episcina_name = episcina
-pkg_episcina_description = A simple non intrusive resource pool for connections
-pkg_episcina_homepage = https://github.com/erlware/episcina
-pkg_episcina_fetch = git
-pkg_episcina_repo = https://github.com/erlware/episcina
-pkg_episcina_commit = master
-
-PACKAGES += eplot
-pkg_eplot_name = eplot
-pkg_eplot_description = A plot engine written in erlang.
-pkg_eplot_homepage = https://github.com/psyeugenic/eplot
-pkg_eplot_fetch = git
-pkg_eplot_repo = https://github.com/psyeugenic/eplot
-pkg_eplot_commit = master
-
-PACKAGES += epocxy
-pkg_epocxy_name = epocxy
-pkg_epocxy_description = Erlang Patterns of Concurrency
-pkg_epocxy_homepage = https://github.com/duomark/epocxy
-pkg_epocxy_fetch = git
-pkg_epocxy_repo = https://github.com/duomark/epocxy
-pkg_epocxy_commit = master
-
-PACKAGES += epubnub
-pkg_epubnub_name = epubnub
-pkg_epubnub_description = Erlang PubNub API
-pkg_epubnub_homepage = https://github.com/tsloughter/epubnub
-pkg_epubnub_fetch = git
-pkg_epubnub_repo = https://github.com/tsloughter/epubnub
-pkg_epubnub_commit = master
-
-PACKAGES += eqm
-pkg_eqm_name = eqm
-pkg_eqm_description = Erlang pub sub with supply-demand channels
-pkg_eqm_homepage = https://github.com/loucash/eqm
-pkg_eqm_fetch = git
-pkg_eqm_repo = https://github.com/loucash/eqm
-pkg_eqm_commit = master
-
-PACKAGES += eredis
-pkg_eredis_name = eredis
-pkg_eredis_description = Erlang Redis client
-pkg_eredis_homepage = https://github.com/wooga/eredis
-pkg_eredis_fetch = git
-pkg_eredis_repo = https://github.com/wooga/eredis
-pkg_eredis_commit = master
-
-PACKAGES += eredis_pool
-pkg_eredis_pool_name = eredis_pool
-pkg_eredis_pool_description = eredis_pool is Pool of Redis clients, using eredis and poolboy.
-pkg_eredis_pool_homepage = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_fetch = git
-pkg_eredis_pool_repo = https://github.com/hiroeorz/eredis_pool
-pkg_eredis_pool_commit = master
-
-PACKAGES += erl_streams
-pkg_erl_streams_name = erl_streams
-pkg_erl_streams_description = Streams in Erlang
-pkg_erl_streams_homepage = https://github.com/epappas/erl_streams
-pkg_erl_streams_fetch = git
-pkg_erl_streams_repo = https://github.com/epappas/erl_streams
-pkg_erl_streams_commit = master
-
-PACKAGES += erlang_cep
-pkg_erlang_cep_name = erlang_cep
-pkg_erlang_cep_description = A basic CEP package written in erlang
-pkg_erlang_cep_homepage = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_fetch = git
-pkg_erlang_cep_repo = https://github.com/danmacklin/erlang_cep
-pkg_erlang_cep_commit = master
-
-PACKAGES += erlang_js
-pkg_erlang_js_name = erlang_js
-pkg_erlang_js_description = A linked-in driver for Erlang to Mozilla's Spidermonkey Javascript runtime.
-pkg_erlang_js_homepage = https://github.com/basho/erlang_js
-pkg_erlang_js_fetch = git
-pkg_erlang_js_repo = https://github.com/basho/erlang_js
-pkg_erlang_js_commit = master
-
-PACKAGES += erlang_localtime
-pkg_erlang_localtime_name = erlang_localtime
-pkg_erlang_localtime_description = Erlang library for conversion from one local time to another
-pkg_erlang_localtime_homepage = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_fetch = git
-pkg_erlang_localtime_repo = https://github.com/dmitryme/erlang_localtime
-pkg_erlang_localtime_commit = master
-
-PACKAGES += erlang_smtp
-pkg_erlang_smtp_name = erlang_smtp
-pkg_erlang_smtp_description = Erlang SMTP and POP3 server code.
-pkg_erlang_smtp_homepage = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_fetch = git
-pkg_erlang_smtp_repo = https://github.com/tonyg/erlang-smtp
-pkg_erlang_smtp_commit = master
-
-PACKAGES += erlang_term
-pkg_erlang_term_name = erlang_term
-pkg_erlang_term_description = Erlang Term Info
-pkg_erlang_term_homepage = https://github.com/okeuday/erlang_term
-pkg_erlang_term_fetch = git
-pkg_erlang_term_repo = https://github.com/okeuday/erlang_term
-pkg_erlang_term_commit = master
-
-PACKAGES += erlastic_search
-pkg_erlastic_search_name = erlastic_search
-pkg_erlastic_search_description = An Erlang app for communicating with Elastic Search's rest interface.
-pkg_erlastic_search_homepage = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_fetch = git
-pkg_erlastic_search_repo = https://github.com/tsloughter/erlastic_search
-pkg_erlastic_search_commit = master
-
-PACKAGES += erlasticsearch
-pkg_erlasticsearch_name = erlasticsearch
-pkg_erlasticsearch_description = Erlang thrift interface to elastic_search
-pkg_erlasticsearch_homepage = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_fetch = git
-pkg_erlasticsearch_repo = https://github.com/dieswaytoofast/erlasticsearch
-pkg_erlasticsearch_commit = master
-
-PACKAGES += erlbrake
-pkg_erlbrake_name = erlbrake
-pkg_erlbrake_description = Erlang Airbrake notification client
-pkg_erlbrake_homepage = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_fetch = git
-pkg_erlbrake_repo = https://github.com/kenpratt/erlbrake
-pkg_erlbrake_commit = master
-
-PACKAGES += erlcloud
-pkg_erlcloud_name = erlcloud
-pkg_erlcloud_description = Cloud Computing library for erlang (Amazon EC2, S3, SQS, SimpleDB, Mechanical Turk, ELB)
-pkg_erlcloud_homepage = https://github.com/gleber/erlcloud
-pkg_erlcloud_fetch = git
-pkg_erlcloud_repo = https://github.com/gleber/erlcloud
-pkg_erlcloud_commit = master
-
-PACKAGES += erlcron
-pkg_erlcron_name = erlcron
-pkg_erlcron_description = Erlang cronish system
-pkg_erlcron_homepage = https://github.com/erlware/erlcron
-pkg_erlcron_fetch = git
-pkg_erlcron_repo = https://github.com/erlware/erlcron
-pkg_erlcron_commit = master
-
-PACKAGES += erldb
-pkg_erldb_name = erldb
-pkg_erldb_description = ORM (Object-relational mapping) application implemented in Erlang
-pkg_erldb_homepage = http://erldb.org
-pkg_erldb_fetch = git
-pkg_erldb_repo = https://github.com/erldb/erldb
-pkg_erldb_commit = master
-
-PACKAGES += erldis
-pkg_erldis_name = erldis
-pkg_erldis_description = redis erlang client library
-pkg_erldis_homepage = https://github.com/cstar/erldis
-pkg_erldis_fetch = git
-pkg_erldis_repo = https://github.com/cstar/erldis
-pkg_erldis_commit = master
-
-PACKAGES += erldns
-pkg_erldns_name = erldns
-pkg_erldns_description = DNS server, in erlang.
-pkg_erldns_homepage = https://github.com/aetrion/erl-dns
-pkg_erldns_fetch = git
-pkg_erldns_repo = https://github.com/aetrion/erl-dns
-pkg_erldns_commit = master
-
-PACKAGES += erldocker
-pkg_erldocker_name = erldocker
-pkg_erldocker_description = Docker Remote API client for Erlang
-pkg_erldocker_homepage = https://github.com/proger/erldocker
-pkg_erldocker_fetch = git
-pkg_erldocker_repo = https://github.com/proger/erldocker
-pkg_erldocker_commit = master
-
-PACKAGES += erlfsmon
-pkg_erlfsmon_name = erlfsmon
-pkg_erlfsmon_description = Erlang filesystem event watcher for Linux and OSX
-pkg_erlfsmon_homepage = https://github.com/proger/erlfsmon
-pkg_erlfsmon_fetch = git
-pkg_erlfsmon_repo = https://github.com/proger/erlfsmon
-pkg_erlfsmon_commit = master
-
-PACKAGES += erlgit
-pkg_erlgit_name = erlgit
-pkg_erlgit_description = Erlang convenience wrapper around git executable
-pkg_erlgit_homepage = https://github.com/gleber/erlgit
-pkg_erlgit_fetch = git
-pkg_erlgit_repo = https://github.com/gleber/erlgit
-pkg_erlgit_commit = master
-
-PACKAGES += erlguten
-pkg_erlguten_name = erlguten
-pkg_erlguten_description = ErlGuten is a system for high-quality typesetting, written purely in Erlang.
-pkg_erlguten_homepage = https://github.com/richcarl/erlguten
-pkg_erlguten_fetch = git
-pkg_erlguten_repo = https://github.com/richcarl/erlguten
-pkg_erlguten_commit = master
-
-PACKAGES += erlmc
-pkg_erlmc_name = erlmc
-pkg_erlmc_description = Erlang memcached binary protocol client
-pkg_erlmc_homepage = https://github.com/jkvor/erlmc
-pkg_erlmc_fetch = git
-pkg_erlmc_repo = https://github.com/jkvor/erlmc
-pkg_erlmc_commit = master
-
-PACKAGES += erlmongo
-pkg_erlmongo_name = erlmongo
-pkg_erlmongo_description = Record based Erlang driver for MongoDB with gridfs support
-pkg_erlmongo_homepage = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_fetch = git
-pkg_erlmongo_repo = https://github.com/SergejJurecko/erlmongo
-pkg_erlmongo_commit = master
-
-PACKAGES += erlog
-pkg_erlog_name = erlog
-pkg_erlog_description = Prolog interpreter in and for Erlang
-pkg_erlog_homepage = https://github.com/rvirding/erlog
-pkg_erlog_fetch = git
-pkg_erlog_repo = https://github.com/rvirding/erlog
-pkg_erlog_commit = master
-
-PACKAGES += erlpass
-pkg_erlpass_name = erlpass
-pkg_erlpass_description = A library to handle password hashing and changing in a safe manner, independent from any kind of storage whatsoever.
-pkg_erlpass_homepage = https://github.com/ferd/erlpass
-pkg_erlpass_fetch = git
-pkg_erlpass_repo = https://github.com/ferd/erlpass
-pkg_erlpass_commit = master
-
-PACKAGES += erlport
-pkg_erlport_name = erlport
-pkg_erlport_description = ErlPort - connect Erlang to other languages
-pkg_erlport_homepage = https://github.com/hdima/erlport
-pkg_erlport_fetch = git
-pkg_erlport_repo = https://github.com/hdima/erlport
-pkg_erlport_commit = master
-
-PACKAGES += erlsh
-pkg_erlsh_name = erlsh
-pkg_erlsh_description = Erlang shell tools
-pkg_erlsh_homepage = https://github.com/proger/erlsh
-pkg_erlsh_fetch = git
-pkg_erlsh_repo = https://github.com/proger/erlsh
-pkg_erlsh_commit = master
-
-PACKAGES += erlsha2
-pkg_erlsha2_name = erlsha2
-pkg_erlsha2_description = SHA-224, SHA-256, SHA-384, SHA-512 implemented in Erlang NIFs.
-pkg_erlsha2_homepage = https://github.com/vinoski/erlsha2
-pkg_erlsha2_fetch = git
-pkg_erlsha2_repo = https://github.com/vinoski/erlsha2
-pkg_erlsha2_commit = master
-
-PACKAGES += erlsom
-pkg_erlsom_name = erlsom
-pkg_erlsom_description = XML parser for Erlang
-pkg_erlsom_homepage = https://github.com/willemdj/erlsom
-pkg_erlsom_fetch = git
-pkg_erlsom_repo = https://github.com/willemdj/erlsom
-pkg_erlsom_commit = master
-
-PACKAGES += erlubi
-pkg_erlubi_name = erlubi
-pkg_erlubi_description = Ubigraph Erlang Client (and Process Visualizer)
-pkg_erlubi_homepage = https://github.com/krestenkrab/erlubi
-pkg_erlubi_fetch = git
-pkg_erlubi_repo = https://github.com/krestenkrab/erlubi
-pkg_erlubi_commit = master
-
-PACKAGES += erlvolt
-pkg_erlvolt_name = erlvolt
-pkg_erlvolt_description = VoltDB Erlang Client Driver
-pkg_erlvolt_homepage = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_fetch = git
-pkg_erlvolt_repo = https://github.com/VoltDB/voltdb-client-erlang
-pkg_erlvolt_commit = master
-
-PACKAGES += erlware_commons
-pkg_erlware_commons_name = erlware_commons
-pkg_erlware_commons_description = Erlware Commons is an Erlware project focused on all aspects of reusable Erlang components.
-pkg_erlware_commons_homepage = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_fetch = git
-pkg_erlware_commons_repo = https://github.com/erlware/erlware_commons
-pkg_erlware_commons_commit = master
-
-PACKAGES += erlydtl
-pkg_erlydtl_name = erlydtl
-pkg_erlydtl_description = Django Template Language for Erlang.
-pkg_erlydtl_homepage = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_fetch = git
-pkg_erlydtl_repo = https://github.com/erlydtl/erlydtl
-pkg_erlydtl_commit = master
-
-PACKAGES += errd
-pkg_errd_name = errd
-pkg_errd_description = Erlang RRDTool library
-pkg_errd_homepage = https://github.com/archaelus/errd
-pkg_errd_fetch = git
-pkg_errd_repo = https://github.com/archaelus/errd
-pkg_errd_commit = master
-
-PACKAGES += erserve
-pkg_erserve_name = erserve
-pkg_erserve_description = Erlang/Rserve communication interface
-pkg_erserve_homepage = https://github.com/del/erserve
-pkg_erserve_fetch = git
-pkg_erserve_repo = https://github.com/del/erserve
-pkg_erserve_commit = master
-
-PACKAGES += erwa
-pkg_erwa_name = erwa
-pkg_erwa_description = A WAMP router and client written in Erlang.
-pkg_erwa_homepage = https://github.com/bwegh/erwa
-pkg_erwa_fetch = git
-pkg_erwa_repo = https://github.com/bwegh/erwa
-pkg_erwa_commit = 0.1.1
-
-PACKAGES += espec
-pkg_espec_name = espec
-pkg_espec_description = ESpec: Behaviour driven development framework for Erlang
-pkg_espec_homepage = https://github.com/lucaspiller/espec
-pkg_espec_fetch = git
-pkg_espec_repo = https://github.com/lucaspiller/espec
-pkg_espec_commit = master
-
-PACKAGES += estatsd
-pkg_estatsd_name = estatsd
-pkg_estatsd_description = Erlang stats aggregation app that periodically flushes data to graphite
-pkg_estatsd_homepage = https://github.com/RJ/estatsd
-pkg_estatsd_fetch = git
-pkg_estatsd_repo = https://github.com/RJ/estatsd
-pkg_estatsd_commit = master
-
-PACKAGES += etap
-pkg_etap_name = etap
-pkg_etap_description = etap is a simple erlang testing library that provides TAP compliant output.
-pkg_etap_homepage = https://github.com/ngerakines/etap
-pkg_etap_fetch = git
-pkg_etap_repo = https://github.com/ngerakines/etap
-pkg_etap_commit = master
-
-PACKAGES += etest
-pkg_etest_name = etest
-pkg_etest_description = A lightweight, convention over configuration test framework for Erlang
-pkg_etest_homepage = https://github.com/wooga/etest
-pkg_etest_fetch = git
-pkg_etest_repo = https://github.com/wooga/etest
-pkg_etest_commit = master
-
-PACKAGES += etest_http
-pkg_etest_http_name = etest_http
-pkg_etest_http_description = etest Assertions around HTTP (client-side)
-pkg_etest_http_homepage = https://github.com/wooga/etest_http
-pkg_etest_http_fetch = git
-pkg_etest_http_repo = https://github.com/wooga/etest_http
-pkg_etest_http_commit = master
-
-PACKAGES += etoml
-pkg_etoml_name = etoml
-pkg_etoml_description = TOML language erlang parser
-pkg_etoml_homepage = https://github.com/kalta/etoml
-pkg_etoml_fetch = git
-pkg_etoml_repo = https://github.com/kalta/etoml
-pkg_etoml_commit = master
-
-PACKAGES += eunit
-pkg_eunit_name = eunit
-pkg_eunit_description = The EUnit lightweight unit testing framework for Erlang - this is the canonical development repository.
-pkg_eunit_homepage = https://github.com/richcarl/eunit
-pkg_eunit_fetch = git
-pkg_eunit_repo = https://github.com/richcarl/eunit
-pkg_eunit_commit = master
-
-PACKAGES += eunit_formatters
-pkg_eunit_formatters_name = eunit_formatters
-pkg_eunit_formatters_description = Because eunit's output sucks. Let's make it better.
-pkg_eunit_formatters_homepage = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_fetch = git
-pkg_eunit_formatters_repo = https://github.com/seancribbs/eunit_formatters
-pkg_eunit_formatters_commit = master
-
-PACKAGES += euthanasia
-pkg_euthanasia_name = euthanasia
-pkg_euthanasia_description = Merciful killer for your Erlang processes
-pkg_euthanasia_homepage = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_fetch = git
-pkg_euthanasia_repo = https://github.com/doubleyou/euthanasia
-pkg_euthanasia_commit = master
-
-PACKAGES += evum
-pkg_evum_name = evum
-pkg_evum_description = Spawn Linux VMs as Erlang processes in the Erlang VM
-pkg_evum_homepage = https://github.com/msantos/evum
-pkg_evum_fetch = git
-pkg_evum_repo = https://github.com/msantos/evum
-pkg_evum_commit = master
-
-PACKAGES += exec
-pkg_exec_name = exec
-pkg_exec_description = Execute and control OS processes from Erlang/OTP.
-pkg_exec_homepage = http://saleyn.github.com/erlexec
-pkg_exec_fetch = git
-pkg_exec_repo = https://github.com/saleyn/erlexec
-pkg_exec_commit = master
-
-PACKAGES += exml
-pkg_exml_name = exml
-pkg_exml_description = XML parsing library in Erlang
-pkg_exml_homepage = https://github.com/paulgray/exml
-pkg_exml_fetch = git
-pkg_exml_repo = https://github.com/paulgray/exml
-pkg_exml_commit = master
-
-PACKAGES += exometer
-pkg_exometer_name = exometer
-pkg_exometer_description = Basic measurement objects and probe behavior
-pkg_exometer_homepage = https://github.com/Feuerlabs/exometer
-pkg_exometer_fetch = git
-pkg_exometer_repo = https://github.com/Feuerlabs/exometer
-pkg_exometer_commit = 1.2
-
-PACKAGES += exs1024
-pkg_exs1024_name = exs1024
-pkg_exs1024_description = Xorshift1024star pseudo random number generator for Erlang.
-pkg_exs1024_homepage = https://github.com/jj1bdx/exs1024
-pkg_exs1024_fetch = git
-pkg_exs1024_repo = https://github.com/jj1bdx/exs1024
-pkg_exs1024_commit = master
-
-PACKAGES += exs64
-pkg_exs64_name = exs64
-pkg_exs64_description = Xorshift64star pseudo random number generator for Erlang.
-pkg_exs64_homepage = https://github.com/jj1bdx/exs64
-pkg_exs64_fetch = git
-pkg_exs64_repo = https://github.com/jj1bdx/exs64
-pkg_exs64_commit = master
-
-PACKAGES += exsplus116
-pkg_exsplus116_name = exsplus116
-pkg_exsplus116_description = Xorshift116plus for Erlang
-pkg_exsplus116_homepage = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_fetch = git
-pkg_exsplus116_repo = https://github.com/jj1bdx/exsplus116
-pkg_exsplus116_commit = master
-
-PACKAGES += exsplus128
-pkg_exsplus128_name = exsplus128
-pkg_exsplus128_description = Xorshift128plus pseudo random number generator for Erlang.
-pkg_exsplus128_homepage = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_fetch = git
-pkg_exsplus128_repo = https://github.com/jj1bdx/exsplus128
-pkg_exsplus128_commit = master
-
-PACKAGES += ezmq
-pkg_ezmq_name = ezmq
-pkg_ezmq_description = zMQ implemented in Erlang
-pkg_ezmq_homepage = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_fetch = git
-pkg_ezmq_repo = https://github.com/RoadRunnr/ezmq
-pkg_ezmq_commit = master
-
-PACKAGES += ezmtp
-pkg_ezmtp_name = ezmtp
-pkg_ezmtp_description = ZMTP protocol in pure Erlang.
-pkg_ezmtp_homepage = https://github.com/a13x/ezmtp
-pkg_ezmtp_fetch = git
-pkg_ezmtp_repo = https://github.com/a13x/ezmtp
-pkg_ezmtp_commit = master
-
-PACKAGES += fast_disk_log
-pkg_fast_disk_log_name = fast_disk_log
-pkg_fast_disk_log_description = Pool-based asynchronous Erlang disk logger
-pkg_fast_disk_log_homepage = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_fetch = git
-pkg_fast_disk_log_repo = https://github.com/lpgauth/fast_disk_log
-pkg_fast_disk_log_commit = master
-
-PACKAGES += feeder
-pkg_feeder_name = feeder
-pkg_feeder_description = Stream parse RSS and Atom formatted XML feeds.
-pkg_feeder_homepage = https://github.com/michaelnisi/feeder
-pkg_feeder_fetch = git
-pkg_feeder_repo = https://github.com/michaelnisi/feeder
-pkg_feeder_commit = v1.4.6
-
-PACKAGES += fix
-pkg_fix_name = fix
-pkg_fix_description = http://fixprotocol.org/ implementation.
-pkg_fix_homepage = https://github.com/maxlapshin/fix
-pkg_fix_fetch = git
-pkg_fix_repo = https://github.com/maxlapshin/fix
-pkg_fix_commit = master
-
-PACKAGES += flower
-pkg_flower_name = flower
-pkg_flower_description = FlowER - a Erlang OpenFlow development platform
-pkg_flower_homepage = https://github.com/travelping/flower
-pkg_flower_fetch = git
-pkg_flower_repo = https://github.com/travelping/flower
-pkg_flower_commit = master
-
-PACKAGES += fn
-pkg_fn_name = fn
-pkg_fn_description = Function utilities for Erlang
-pkg_fn_homepage = https://github.com/reiddraper/fn
-pkg_fn_fetch = git
-pkg_fn_repo = https://github.com/reiddraper/fn
-pkg_fn_commit = master
-
-PACKAGES += folsom
-pkg_folsom_name = folsom
-pkg_folsom_description = Expose Erlang Events and Metrics
-pkg_folsom_homepage = https://github.com/boundary/folsom
-pkg_folsom_fetch = git
-pkg_folsom_repo = https://github.com/boundary/folsom
-pkg_folsom_commit = master
-
-PACKAGES += folsom_cowboy
-pkg_folsom_cowboy_name = folsom_cowboy
-pkg_folsom_cowboy_description = A Cowboy based Folsom HTTP Wrapper.
-pkg_folsom_cowboy_homepage = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_fetch = git
-pkg_folsom_cowboy_repo = https://github.com/boundary/folsom_cowboy
-pkg_folsom_cowboy_commit = master
-
-PACKAGES += folsomite
-pkg_folsomite_name = folsomite
-pkg_folsomite_description = blow up your graphite / riemann server with folsom metrics
-pkg_folsomite_homepage = https://github.com/campanja/folsomite
-pkg_folsomite_fetch = git
-pkg_folsomite_repo = https://github.com/campanja/folsomite
-pkg_folsomite_commit = master
-
-PACKAGES += fs
-pkg_fs_name = fs
-pkg_fs_description = Erlang FileSystem Listener
-pkg_fs_homepage = https://github.com/synrc/fs
-pkg_fs_fetch = git
-pkg_fs_repo = https://github.com/synrc/fs
-pkg_fs_commit = master
-
-PACKAGES += fuse
-pkg_fuse_name = fuse
-pkg_fuse_description = A Circuit Breaker for Erlang
-pkg_fuse_homepage = https://github.com/jlouis/fuse
-pkg_fuse_fetch = git
-pkg_fuse_repo = https://github.com/jlouis/fuse
-pkg_fuse_commit = master
-
-PACKAGES += gcm
-pkg_gcm_name = gcm
-pkg_gcm_description = An Erlang application for Google Cloud Messaging
-pkg_gcm_homepage = https://github.com/pdincau/gcm-erlang
-pkg_gcm_fetch = git
-pkg_gcm_repo = https://github.com/pdincau/gcm-erlang
-pkg_gcm_commit = master
-
-PACKAGES += gcprof
-pkg_gcprof_name = gcprof
-pkg_gcprof_description = Garbage Collection profiler for Erlang
-pkg_gcprof_homepage = https://github.com/knutin/gcprof
-pkg_gcprof_fetch = git
-pkg_gcprof_repo = https://github.com/knutin/gcprof
-pkg_gcprof_commit = master
-
-PACKAGES += geas
-pkg_geas_name = geas
-pkg_geas_description = Guess Erlang Application Scattering
-pkg_geas_homepage = https://github.com/crownedgrouse/geas
-pkg_geas_fetch = git
-pkg_geas_repo = https://github.com/crownedgrouse/geas
-pkg_geas_commit = master
-
-PACKAGES += geef
-pkg_geef_name = geef
-pkg_geef_description = Git NEEEEF (Erlang NIF)
-pkg_geef_homepage = https://github.com/carlosmn/geef
-pkg_geef_fetch = git
-pkg_geef_repo = https://github.com/carlosmn/geef
-pkg_geef_commit = master
-
-PACKAGES += gen_coap
-pkg_gen_coap_name = gen_coap
-pkg_gen_coap_description = Generic Erlang CoAP Client/Server
-pkg_gen_coap_homepage = https://github.com/gotthardp/gen_coap
-pkg_gen_coap_fetch = git
-pkg_gen_coap_repo = https://github.com/gotthardp/gen_coap
-pkg_gen_coap_commit = master
-
-PACKAGES += gen_cycle
-pkg_gen_cycle_name = gen_cycle
-pkg_gen_cycle_description = Simple, generic OTP behaviour for recurring tasks
-pkg_gen_cycle_homepage = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_fetch = git
-pkg_gen_cycle_repo = https://github.com/aerosol/gen_cycle
-pkg_gen_cycle_commit = develop
-
-PACKAGES += gen_icmp
-pkg_gen_icmp_name = gen_icmp
-pkg_gen_icmp_description = Erlang interface to ICMP sockets
-pkg_gen_icmp_homepage = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_fetch = git
-pkg_gen_icmp_repo = https://github.com/msantos/gen_icmp
-pkg_gen_icmp_commit = master
-
-PACKAGES += gen_nb_server
-pkg_gen_nb_server_name = gen_nb_server
-pkg_gen_nb_server_description = OTP behavior for writing non-blocking servers
-pkg_gen_nb_server_homepage = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_fetch = git
-pkg_gen_nb_server_repo = https://github.com/kevsmith/gen_nb_server
-pkg_gen_nb_server_commit = master
-
-PACKAGES += gen_paxos
-pkg_gen_paxos_name = gen_paxos
-pkg_gen_paxos_description = An Erlang/OTP-style implementation of the PAXOS distributed consensus protocol
-pkg_gen_paxos_homepage = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_fetch = git
-pkg_gen_paxos_repo = https://github.com/gburd/gen_paxos
-pkg_gen_paxos_commit = master
-
-PACKAGES += gen_smtp
-pkg_gen_smtp_name = gen_smtp
-pkg_gen_smtp_description = A generic Erlang SMTP server and client that can be extended via callback modules
-pkg_gen_smtp_homepage = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_fetch = git
-pkg_gen_smtp_repo = https://github.com/Vagabond/gen_smtp
-pkg_gen_smtp_commit = master
-
-PACKAGES += gen_tracker
-pkg_gen_tracker_name = gen_tracker
-pkg_gen_tracker_description = supervisor with ets handling of children and their metadata
-pkg_gen_tracker_homepage = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_fetch = git
-pkg_gen_tracker_repo = https://github.com/erlyvideo/gen_tracker
-pkg_gen_tracker_commit = master
-
-PACKAGES += gen_unix
-pkg_gen_unix_name = gen_unix
-pkg_gen_unix_description = Erlang Unix socket interface
-pkg_gen_unix_homepage = https://github.com/msantos/gen_unix
-pkg_gen_unix_fetch = git
-pkg_gen_unix_repo = https://github.com/msantos/gen_unix
-pkg_gen_unix_commit = master
-
-PACKAGES += getopt
-pkg_getopt_name = getopt
-pkg_getopt_description = Module to parse command line arguments using the GNU getopt syntax
-pkg_getopt_homepage = https://github.com/jcomellas/getopt
-pkg_getopt_fetch = git
-pkg_getopt_repo = https://github.com/jcomellas/getopt
-pkg_getopt_commit = master
-
-PACKAGES += gettext
-pkg_gettext_name = gettext
-pkg_gettext_description = Erlang internationalization library.
-pkg_gettext_homepage = https://github.com/etnt/gettext
-pkg_gettext_fetch = git
-pkg_gettext_repo = https://github.com/etnt/gettext
-pkg_gettext_commit = master
-
-PACKAGES += giallo
-pkg_giallo_name = giallo
-pkg_giallo_description = Small and flexible web framework on top of Cowboy
-pkg_giallo_homepage = https://github.com/kivra/giallo
-pkg_giallo_fetch = git
-pkg_giallo_repo = https://github.com/kivra/giallo
-pkg_giallo_commit = master
-
-PACKAGES += gin
-pkg_gin_name = gin
-pkg_gin_description = The guards  and  for Erlang parse_transform
-pkg_gin_homepage = https://github.com/mad-cocktail/gin
-pkg_gin_fetch = git
-pkg_gin_repo = https://github.com/mad-cocktail/gin
-pkg_gin_commit = master
-
-PACKAGES += gitty
-pkg_gitty_name = gitty
-pkg_gitty_description = Git access in erlang
-pkg_gitty_homepage = https://github.com/maxlapshin/gitty
-pkg_gitty_fetch = git
-pkg_gitty_repo = https://github.com/maxlapshin/gitty
-pkg_gitty_commit = master
-
-PACKAGES += gold_fever
-pkg_gold_fever_name = gold_fever
-pkg_gold_fever_description = A Treasure Hunt for Erlangers
-pkg_gold_fever_homepage = https://github.com/inaka/gold_fever
-pkg_gold_fever_fetch = git
-pkg_gold_fever_repo = https://github.com/inaka/gold_fever
-pkg_gold_fever_commit = master
-
-PACKAGES += gossiperl
-pkg_gossiperl_name = gossiperl
-pkg_gossiperl_description = Gossip middleware in Erlang
-pkg_gossiperl_homepage = http://gossiperl.com/
-pkg_gossiperl_fetch = git
-pkg_gossiperl_repo = https://github.com/gossiperl/gossiperl
-pkg_gossiperl_commit = master
-
-PACKAGES += gpb
-pkg_gpb_name = gpb
-pkg_gpb_description = A Google Protobuf implementation for Erlang
-pkg_gpb_homepage = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_fetch = git
-pkg_gpb_repo = https://github.com/tomas-abrahamsson/gpb
-pkg_gpb_commit = master
-
-PACKAGES += gproc
-pkg_gproc_name = gproc
-pkg_gproc_description = Extended process registry for Erlang
-pkg_gproc_homepage = https://github.com/uwiger/gproc
-pkg_gproc_fetch = git
-pkg_gproc_repo = https://github.com/uwiger/gproc
-pkg_gproc_commit = master
-
-PACKAGES += grapherl
-pkg_grapherl_name = grapherl
-pkg_grapherl_description = Create graphs of Erlang systems and programs
-pkg_grapherl_homepage = https://github.com/eproxus/grapherl
-pkg_grapherl_fetch = git
-pkg_grapherl_repo = https://github.com/eproxus/grapherl
-pkg_grapherl_commit = master
-
-PACKAGES += gun
-pkg_gun_name = gun
-pkg_gun_description = Asynchronous SPDY, HTTP and Websocket client written in Erlang.
-pkg_gun_homepage = http//ninenines.eu
-pkg_gun_fetch = git
-pkg_gun_repo = https://github.com/ninenines/gun
-pkg_gun_commit = master
-
-PACKAGES += gut
-pkg_gut_name = gut
-pkg_gut_description = gut is a template printing, aka scaffolding, tool for Erlang. Like rails generate or yeoman
-pkg_gut_homepage = https://github.com/unbalancedparentheses/gut
-pkg_gut_fetch = git
-pkg_gut_repo = https://github.com/unbalancedparentheses/gut
-pkg_gut_commit = master
-
-PACKAGES += hackney
-pkg_hackney_name = hackney
-pkg_hackney_description = simple HTTP client in Erlang
-pkg_hackney_homepage = https://github.com/benoitc/hackney
-pkg_hackney_fetch = git
-pkg_hackney_repo = https://github.com/benoitc/hackney
-pkg_hackney_commit = master
-
-PACKAGES += hamcrest
-pkg_hamcrest_name = hamcrest
-pkg_hamcrest_description = Erlang port of Hamcrest
-pkg_hamcrest_homepage = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_fetch = git
-pkg_hamcrest_repo = https://github.com/hyperthunk/hamcrest-erlang
-pkg_hamcrest_commit = master
-
-PACKAGES += hanoidb
-pkg_hanoidb_name = hanoidb
-pkg_hanoidb_description = Erlang LSM BTree Storage
-pkg_hanoidb_homepage = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_fetch = git
-pkg_hanoidb_repo = https://github.com/krestenkrab/hanoidb
-pkg_hanoidb_commit = master
-
-PACKAGES += hottub
-pkg_hottub_name = hottub
-pkg_hottub_description = Permanent Erlang Worker Pool
-pkg_hottub_homepage = https://github.com/bfrog/hottub
-pkg_hottub_fetch = git
-pkg_hottub_repo = https://github.com/bfrog/hottub
-pkg_hottub_commit = master
-
-PACKAGES += hpack
-pkg_hpack_name = hpack
-pkg_hpack_description = HPACK Implementation for Erlang
-pkg_hpack_homepage = https://github.com/joedevivo/hpack
-pkg_hpack_fetch = git
-pkg_hpack_repo = https://github.com/joedevivo/hpack
-pkg_hpack_commit = master
-
-PACKAGES += hyper
-pkg_hyper_name = hyper
-pkg_hyper_description = Erlang implementation of HyperLogLog
-pkg_hyper_homepage = https://github.com/GameAnalytics/hyper
-pkg_hyper_fetch = git
-pkg_hyper_repo = https://github.com/GameAnalytics/hyper
-pkg_hyper_commit = master
-
-PACKAGES += i18n
-pkg_i18n_name = i18n
-pkg_i18n_description = International components for unicode from Erlang (unicode, date, string, number, format, locale, localization, transliteration, icu4e)
-pkg_i18n_homepage = https://github.com/erlang-unicode/i18n
-pkg_i18n_fetch = git
-pkg_i18n_repo = https://github.com/erlang-unicode/i18n
-pkg_i18n_commit = master
-
-PACKAGES += ibrowse
-pkg_ibrowse_name = ibrowse
-pkg_ibrowse_description = Erlang HTTP client
-pkg_ibrowse_homepage = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_fetch = git
-pkg_ibrowse_repo = https://github.com/cmullaparthi/ibrowse
-pkg_ibrowse_commit = v4.1.1
-
-PACKAGES += ierlang
-pkg_ierlang_name = ierlang
-pkg_ierlang_description = An Erlang language kernel for IPython.
-pkg_ierlang_homepage = https://github.com/robbielynch/ierlang
-pkg_ierlang_fetch = git
-pkg_ierlang_repo = https://github.com/robbielynch/ierlang
-pkg_ierlang_commit = master
-
-PACKAGES += iota
-pkg_iota_name = iota
-pkg_iota_description = iota (Inter-dependency Objective Testing Apparatus) - a tool to enforce clean separation of responsibilities in Erlang code
-pkg_iota_homepage = https://github.com/jpgneves/iota
-pkg_iota_fetch = git
-pkg_iota_repo = https://github.com/jpgneves/iota
-pkg_iota_commit = master
-
-PACKAGES += irc_lib
-pkg_irc_lib_name = irc_lib
-pkg_irc_lib_description = Erlang irc client library
-pkg_irc_lib_homepage = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_fetch = git
-pkg_irc_lib_repo = https://github.com/OtpChatBot/irc_lib
-pkg_irc_lib_commit = master
-
-PACKAGES += ircd
-pkg_ircd_name = ircd
-pkg_ircd_description = A pluggable IRC daemon application/library for Erlang.
-pkg_ircd_homepage = https://github.com/tonyg/erlang-ircd
-pkg_ircd_fetch = git
-pkg_ircd_repo = https://github.com/tonyg/erlang-ircd
-pkg_ircd_commit = master
-
-PACKAGES += iris
-pkg_iris_name = iris
-pkg_iris_description = Iris Erlang binding
-pkg_iris_homepage = https://github.com/project-iris/iris-erl
-pkg_iris_fetch = git
-pkg_iris_repo = https://github.com/project-iris/iris-erl
-pkg_iris_commit = master
-
-PACKAGES += iso8601
-pkg_iso8601_name = iso8601
-pkg_iso8601_description = Erlang ISO 8601 date formatter/parser
-pkg_iso8601_homepage = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_fetch = git
-pkg_iso8601_repo = https://github.com/seansawyer/erlang_iso8601
-pkg_iso8601_commit = master
-
-PACKAGES += jamdb_sybase
-pkg_jamdb_sybase_name = jamdb_sybase
-pkg_jamdb_sybase_description = Erlang driver for SAP Sybase ASE
-pkg_jamdb_sybase_homepage = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_fetch = git
-pkg_jamdb_sybase_repo = https://github.com/erlangbureau/jamdb_sybase
-pkg_jamdb_sybase_commit = 0.6.0
-
-PACKAGES += jerg
-pkg_jerg_name = jerg
-pkg_jerg_description = JSON Schema to Erlang Records Generator
-pkg_jerg_homepage = https://github.com/ddossot/jerg
-pkg_jerg_fetch = git
-pkg_jerg_repo = https://github.com/ddossot/jerg
-pkg_jerg_commit = master
-
-PACKAGES += jesse
-pkg_jesse_name = jesse
-pkg_jesse_description = jesse (JSon Schema Erlang) is an implementation of a json schema validator for Erlang.
-pkg_jesse_homepage = https://github.com/klarna/jesse
-pkg_jesse_fetch = git
-pkg_jesse_repo = https://github.com/klarna/jesse
-pkg_jesse_commit = master
-
-PACKAGES += jiffy
-pkg_jiffy_name = jiffy
-pkg_jiffy_description = JSON NIFs for Erlang.
-pkg_jiffy_homepage = https://github.com/davisp/jiffy
-pkg_jiffy_fetch = git
-pkg_jiffy_repo = https://github.com/davisp/jiffy
-pkg_jiffy_commit = master
-
-PACKAGES += jiffy_v
-pkg_jiffy_v_name = jiffy_v
-pkg_jiffy_v_description = JSON validation utility
-pkg_jiffy_v_homepage = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_fetch = git
-pkg_jiffy_v_repo = https://github.com/shizzard/jiffy-v
-pkg_jiffy_v_commit = 0.3.3
-
-PACKAGES += jobs
-pkg_jobs_name = jobs
-pkg_jobs_description = a Job scheduler for load regulation
-pkg_jobs_homepage = https://github.com/esl/jobs
-pkg_jobs_fetch = git
-pkg_jobs_repo = https://github.com/esl/jobs
-pkg_jobs_commit = 0.3
-
-PACKAGES += joxa
-pkg_joxa_name = joxa
-pkg_joxa_description = A Modern Lisp for the Erlang VM
-pkg_joxa_homepage = https://github.com/joxa/joxa
-pkg_joxa_fetch = git
-pkg_joxa_repo = https://github.com/joxa/joxa
-pkg_joxa_commit = master
-
-PACKAGES += json
-pkg_json_name = json
-pkg_json_description = a high level json library for erlang (17.0+)
-pkg_json_homepage = https://github.com/talentdeficit/json
-pkg_json_fetch = git
-pkg_json_repo = https://github.com/talentdeficit/json
-pkg_json_commit = master
-
-PACKAGES += json_rec
-pkg_json_rec_name = json_rec
-pkg_json_rec_description = JSON to erlang record
-pkg_json_rec_homepage = https://github.com/justinkirby/json_rec
-pkg_json_rec_fetch = git
-pkg_json_rec_repo = https://github.com/justinkirby/json_rec
-pkg_json_rec_commit = master
-
-PACKAGES += jsonerl
-pkg_jsonerl_name = jsonerl
-pkg_jsonerl_description = yet another but slightly different erlang <-> json encoder/decoder
-pkg_jsonerl_homepage = https://github.com/lambder/jsonerl
-pkg_jsonerl_fetch = git
-pkg_jsonerl_repo = https://github.com/lambder/jsonerl
-pkg_jsonerl_commit = master
-
-PACKAGES += jsonpath
-pkg_jsonpath_name = jsonpath
-pkg_jsonpath_description = Fast Erlang JSON data retrieval and updates via javascript-like notation
-pkg_jsonpath_homepage = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_fetch = git
-pkg_jsonpath_repo = https://github.com/GeneStevens/jsonpath
-pkg_jsonpath_commit = master
-
-PACKAGES += jsonx
-pkg_jsonx_name = jsonx
-pkg_jsonx_description = JSONX is an Erlang library for efficient decode and encode JSON, written in C.
-pkg_jsonx_homepage = https://github.com/iskra/jsonx
-pkg_jsonx_fetch = git
-pkg_jsonx_repo = https://github.com/iskra/jsonx
-pkg_jsonx_commit = master
-
-PACKAGES += jsx
-pkg_jsx_name = jsx
-pkg_jsx_description = An Erlang application for consuming, producing and manipulating JSON.
-pkg_jsx_homepage = https://github.com/talentdeficit/jsx
-pkg_jsx_fetch = git
-pkg_jsx_repo = https://github.com/talentdeficit/jsx
-pkg_jsx_commit = master
-
-PACKAGES += kafka
-pkg_kafka_name = kafka
-pkg_kafka_description = Kafka consumer and producer in Erlang
-pkg_kafka_homepage = https://github.com/wooga/kafka-erlang
-pkg_kafka_fetch = git
-pkg_kafka_repo = https://github.com/wooga/kafka-erlang
-pkg_kafka_commit = master
-
-PACKAGES += kai
-pkg_kai_name = kai
-pkg_kai_description = DHT storage by Takeshi Inoue
-pkg_kai_homepage = https://github.com/synrc/kai
-pkg_kai_fetch = git
-pkg_kai_repo = https://github.com/synrc/kai
-pkg_kai_commit = master
-
-PACKAGES += katja
-pkg_katja_name = katja
-pkg_katja_description = A simple Riemann client written in Erlang.
-pkg_katja_homepage = https://github.com/nifoc/katja
-pkg_katja_fetch = git
-pkg_katja_repo = https://github.com/nifoc/katja
-pkg_katja_commit = master
-
-PACKAGES += kdht
-pkg_kdht_name = kdht
-pkg_kdht_description = kdht is an erlang DHT implementation
-pkg_kdht_homepage = https://github.com/kevinlynx/kdht
-pkg_kdht_fetch = git
-pkg_kdht_repo = https://github.com/kevinlynx/kdht
-pkg_kdht_commit = master
-
-PACKAGES += key2value
-pkg_key2value_name = key2value
-pkg_key2value_description = Erlang 2-way map
-pkg_key2value_homepage = https://github.com/okeuday/key2value
-pkg_key2value_fetch = git
-pkg_key2value_repo = https://github.com/okeuday/key2value
-pkg_key2value_commit = master
-
-PACKAGES += keys1value
-pkg_keys1value_name = keys1value
-pkg_keys1value_description = Erlang set associative map for key lists
-pkg_keys1value_homepage = https://github.com/okeuday/keys1value
-pkg_keys1value_fetch = git
-pkg_keys1value_repo = https://github.com/okeuday/keys1value
-pkg_keys1value_commit = master
-
-PACKAGES += kinetic
-pkg_kinetic_name = kinetic
-pkg_kinetic_description = Erlang Kinesis Client
-pkg_kinetic_homepage = https://github.com/AdRoll/kinetic
-pkg_kinetic_fetch = git
-pkg_kinetic_repo = https://github.com/AdRoll/kinetic
-pkg_kinetic_commit = master
-
-PACKAGES += kjell
-pkg_kjell_name = kjell
-pkg_kjell_description = Erlang Shell
-pkg_kjell_homepage = https://github.com/karlll/kjell
-pkg_kjell_fetch = git
-pkg_kjell_repo = https://github.com/karlll/kjell
-pkg_kjell_commit = master
-
-PACKAGES += kraken
-pkg_kraken_name = kraken
-pkg_kraken_description = Distributed Pubsub Server for Realtime Apps
-pkg_kraken_homepage = https://github.com/Asana/kraken
-pkg_kraken_fetch = git
-pkg_kraken_repo = https://github.com/Asana/kraken
-pkg_kraken_commit = master
-
-PACKAGES += kucumberl
-pkg_kucumberl_name = kucumberl
-pkg_kucumberl_description = A pure-erlang, open-source, implementation of Cucumber
-pkg_kucumberl_homepage = https://github.com/openshine/kucumberl
-pkg_kucumberl_fetch = git
-pkg_kucumberl_repo = https://github.com/openshine/kucumberl
-pkg_kucumberl_commit = master
-
-PACKAGES += kvc
-pkg_kvc_name = kvc
-pkg_kvc_description = KVC - Key Value Coding for Erlang data structures
-pkg_kvc_homepage = https://github.com/etrepum/kvc
-pkg_kvc_fetch = git
-pkg_kvc_repo = https://github.com/etrepum/kvc
-pkg_kvc_commit = master
-
-PACKAGES += kvlists
-pkg_kvlists_name = kvlists
-pkg_kvlists_description = Lists of key-value pairs (decoded JSON) in Erlang
-pkg_kvlists_homepage = https://github.com/jcomellas/kvlists
-pkg_kvlists_fetch = git
-pkg_kvlists_repo = https://github.com/jcomellas/kvlists
-pkg_kvlists_commit = master
-
-PACKAGES += kvs
-pkg_kvs_name = kvs
-pkg_kvs_description = Container and Iterator
-pkg_kvs_homepage = https://github.com/synrc/kvs
-pkg_kvs_fetch = git
-pkg_kvs_repo = https://github.com/synrc/kvs
-pkg_kvs_commit = master
-
-PACKAGES += lager
-pkg_lager_name = lager
-pkg_lager_description = A logging framework for Erlang/OTP.
-pkg_lager_homepage = https://github.com/basho/lager
-pkg_lager_fetch = git
-pkg_lager_repo = https://github.com/basho/lager
-pkg_lager_commit = master
-
-PACKAGES += lager_amqp_backend
-pkg_lager_amqp_backend_name = lager_amqp_backend
-pkg_lager_amqp_backend_description = AMQP RabbitMQ Lager backend
-pkg_lager_amqp_backend_homepage = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_fetch = git
-pkg_lager_amqp_backend_repo = https://github.com/jbrisbin/lager_amqp_backend
-pkg_lager_amqp_backend_commit = master
-
-PACKAGES += lager_syslog
-pkg_lager_syslog_name = lager_syslog
-pkg_lager_syslog_description = Syslog backend for lager
-pkg_lager_syslog_homepage = https://github.com/basho/lager_syslog
-pkg_lager_syslog_fetch = git
-pkg_lager_syslog_repo = https://github.com/basho/lager_syslog
-pkg_lager_syslog_commit = master
-
-PACKAGES += lambdapad
-pkg_lambdapad_name = lambdapad
-pkg_lambdapad_description = Static site generator using Erlang. Yes, Erlang.
-pkg_lambdapad_homepage = https://github.com/gar1t/lambdapad
-pkg_lambdapad_fetch = git
-pkg_lambdapad_repo = https://github.com/gar1t/lambdapad
-pkg_lambdapad_commit = master
-
-PACKAGES += lasp
-pkg_lasp_name = lasp
-pkg_lasp_description = A Language for Distributed, Eventually Consistent Computations
-pkg_lasp_homepage = http://lasp-lang.org/
-pkg_lasp_fetch = git
-pkg_lasp_repo = https://github.com/lasp-lang/lasp
-pkg_lasp_commit = master
-
-PACKAGES += lasse
-pkg_lasse_name = lasse
-pkg_lasse_description = SSE handler for Cowboy
-pkg_lasse_homepage = https://github.com/inaka/lasse
-pkg_lasse_fetch = git
-pkg_lasse_repo = https://github.com/inaka/lasse
-pkg_lasse_commit = 0.1.0
-
-PACKAGES += ldap
-pkg_ldap_name = ldap
-pkg_ldap_description = LDAP server written in Erlang
-pkg_ldap_homepage = https://github.com/spawnproc/ldap
-pkg_ldap_fetch = git
-pkg_ldap_repo = https://github.com/spawnproc/ldap
-pkg_ldap_commit = master
-
-PACKAGES += lethink
-pkg_lethink_name = lethink
-pkg_lethink_description = erlang driver for rethinkdb
-pkg_lethink_homepage = https://github.com/taybin/lethink
-pkg_lethink_fetch = git
-pkg_lethink_repo = https://github.com/taybin/lethink
-pkg_lethink_commit = master
-
-PACKAGES += lfe
-pkg_lfe_name = lfe
-pkg_lfe_description = Lisp Flavoured Erlang (LFE)
-pkg_lfe_homepage = https://github.com/rvirding/lfe
-pkg_lfe_fetch = git
-pkg_lfe_repo = https://github.com/rvirding/lfe
-pkg_lfe_commit = master
-
-PACKAGES += ling
-pkg_ling_name = ling
-pkg_ling_description = Erlang on Xen
-pkg_ling_homepage = https://github.com/cloudozer/ling
-pkg_ling_fetch = git
-pkg_ling_repo = https://github.com/cloudozer/ling
-pkg_ling_commit = master
-
-PACKAGES += live
-pkg_live_name = live
-pkg_live_description = Automated module and configuration reloader.
-pkg_live_homepage = http://ninenines.eu
-pkg_live_fetch = git
-pkg_live_repo = https://github.com/ninenines/live
-pkg_live_commit = master
-
-PACKAGES += lmq
-pkg_lmq_name = lmq
-pkg_lmq_description = Lightweight Message Queue
-pkg_lmq_homepage = https://github.com/iij/lmq
-pkg_lmq_fetch = git
-pkg_lmq_repo = https://github.com/iij/lmq
-pkg_lmq_commit = master
-
-PACKAGES += locker
-pkg_locker_name = locker
-pkg_locker_description = Atomic distributed 'check and set' for short-lived keys
-pkg_locker_homepage = https://github.com/wooga/locker
-pkg_locker_fetch = git
-pkg_locker_repo = https://github.com/wooga/locker
-pkg_locker_commit = master
-
-PACKAGES += locks
-pkg_locks_name = locks
-pkg_locks_description = A scalable, deadlock-resolving resource locker
-pkg_locks_homepage = https://github.com/uwiger/locks
-pkg_locks_fetch = git
-pkg_locks_repo = https://github.com/uwiger/locks
-pkg_locks_commit = master
-
-PACKAGES += log4erl
-pkg_log4erl_name = log4erl
-pkg_log4erl_description = A logger for erlang in the spirit of Log4J.
-pkg_log4erl_homepage = https://github.com/ahmednawras/log4erl
-pkg_log4erl_fetch = git
-pkg_log4erl_repo = https://github.com/ahmednawras/log4erl
-pkg_log4erl_commit = master
-
-PACKAGES += lol
-pkg_lol_name = lol
-pkg_lol_description = Lisp on erLang, and programming is fun again
-pkg_lol_homepage = https://github.com/b0oh/lol
-pkg_lol_fetch = git
-pkg_lol_repo = https://github.com/b0oh/lol
-pkg_lol_commit = master
-
-PACKAGES += lucid
-pkg_lucid_name = lucid
-pkg_lucid_description = HTTP/2 server written in Erlang
-pkg_lucid_homepage = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_fetch = git
-pkg_lucid_repo = https://github.com/tatsuhiro-t/lucid
-pkg_lucid_commit = master
-
-PACKAGES += luerl
-pkg_luerl_name = luerl
-pkg_luerl_description = Lua in Erlang
-pkg_luerl_homepage = https://github.com/rvirding/luerl
-pkg_luerl_fetch = git
-pkg_luerl_repo = https://github.com/rvirding/luerl
-pkg_luerl_commit = develop
-
-PACKAGES += luwak
-pkg_luwak_name = luwak
-pkg_luwak_description = Large-object storage interface for Riak
-pkg_luwak_homepage = https://github.com/basho/luwak
-pkg_luwak_fetch = git
-pkg_luwak_repo = https://github.com/basho/luwak
-pkg_luwak_commit = master
-
-PACKAGES += lux
-pkg_lux_name = lux
-pkg_lux_description = Lux (LUcid eXpect scripting) simplifies test automation and provides an Expect-style execution of commands
-pkg_lux_homepage = https://github.com/hawk/lux
-pkg_lux_fetch = git
-pkg_lux_repo = https://github.com/hawk/lux
-pkg_lux_commit = master
-
-PACKAGES += machi
-pkg_machi_name = machi
-pkg_machi_description = Machi file store
-pkg_machi_homepage = https://github.com/basho/machi
-pkg_machi_fetch = git
-pkg_machi_repo = https://github.com/basho/machi
-pkg_machi_commit = master
-
-PACKAGES += mad
-pkg_mad_name = mad
-pkg_mad_description = Small and Fast Rebar Replacement
-pkg_mad_homepage = https://github.com/synrc/mad
-pkg_mad_fetch = git
-pkg_mad_repo = https://github.com/synrc/mad
-pkg_mad_commit = master
-
-PACKAGES += marina
-pkg_marina_name = marina
-pkg_marina_description = Non-blocking Erlang Cassandra CQL3 client
-pkg_marina_homepage = https://github.com/lpgauth/marina
-pkg_marina_fetch = git
-pkg_marina_repo = https://github.com/lpgauth/marina
-pkg_marina_commit = master
-
-PACKAGES += mavg
-pkg_mavg_name = mavg
-pkg_mavg_description = Erlang :: Exponential moving average library
-pkg_mavg_homepage = https://github.com/EchoTeam/mavg
-pkg_mavg_fetch = git
-pkg_mavg_repo = https://github.com/EchoTeam/mavg
-pkg_mavg_commit = master
-
-PACKAGES += mc_erl
-pkg_mc_erl_name = mc_erl
-pkg_mc_erl_description = mc-erl is a server for Minecraft 1.4.7 written in Erlang.
-pkg_mc_erl_homepage = https://github.com/clonejo/mc-erl
-pkg_mc_erl_fetch = git
-pkg_mc_erl_repo = https://github.com/clonejo/mc-erl
-pkg_mc_erl_commit = master
-
-PACKAGES += mcd
-pkg_mcd_name = mcd
-pkg_mcd_description = Fast memcached protocol client in pure Erlang
-pkg_mcd_homepage = https://github.com/EchoTeam/mcd
-pkg_mcd_fetch = git
-pkg_mcd_repo = https://github.com/EchoTeam/mcd
-pkg_mcd_commit = master
-
-PACKAGES += mcerlang
-pkg_mcerlang_name = mcerlang
-pkg_mcerlang_description = The McErlang model checker for Erlang
-pkg_mcerlang_homepage = https://github.com/fredlund/McErlang
-pkg_mcerlang_fetch = git
-pkg_mcerlang_repo = https://github.com/fredlund/McErlang
-pkg_mcerlang_commit = master
-
-PACKAGES += meck
-pkg_meck_name = meck
-pkg_meck_description = A mocking library for Erlang
-pkg_meck_homepage = https://github.com/eproxus/meck
-pkg_meck_fetch = git
-pkg_meck_repo = https://github.com/eproxus/meck
-pkg_meck_commit = master
-
-PACKAGES += mekao
-pkg_mekao_name = mekao
-pkg_mekao_description = SQL constructor
-pkg_mekao_homepage = https://github.com/ddosia/mekao
-pkg_mekao_fetch = git
-pkg_mekao_repo = https://github.com/ddosia/mekao
-pkg_mekao_commit = master
-
-PACKAGES += memo
-pkg_memo_name = memo
-pkg_memo_description = Erlang memoization server
-pkg_memo_homepage = https://github.com/tuncer/memo
-pkg_memo_fetch = git
-pkg_memo_repo = https://github.com/tuncer/memo
-pkg_memo_commit = master
-
-PACKAGES += merge_index
-pkg_merge_index_name = merge_index
-pkg_merge_index_description = MergeIndex is an Erlang library for storing ordered sets on disk. It is very similar to an SSTable (in Google's Bigtable) or an HFile (in Hadoop).
-pkg_merge_index_homepage = https://github.com/basho/merge_index
-pkg_merge_index_fetch = git
-pkg_merge_index_repo = https://github.com/basho/merge_index
-pkg_merge_index_commit = master
-
-PACKAGES += merl
-pkg_merl_name = merl
-pkg_merl_description = Metaprogramming in Erlang
-pkg_merl_homepage = https://github.com/richcarl/merl
-pkg_merl_fetch = git
-pkg_merl_repo = https://github.com/richcarl/merl
-pkg_merl_commit = master
-
-PACKAGES += mimerl
-pkg_mimerl_name = mimerl
-pkg_mimerl_description = library to handle mimetypes
-pkg_mimerl_homepage = https://github.com/benoitc/mimerl
-pkg_mimerl_fetch = git
-pkg_mimerl_repo = https://github.com/benoitc/mimerl
-pkg_mimerl_commit = master
-
-PACKAGES += mimetypes
-pkg_mimetypes_name = mimetypes
-pkg_mimetypes_description = Erlang MIME types library
-pkg_mimetypes_homepage = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_fetch = git
-pkg_mimetypes_repo = https://github.com/spawngrid/mimetypes
-pkg_mimetypes_commit = master
-
-PACKAGES += mixer
-pkg_mixer_name = mixer
-pkg_mixer_description = Mix in functions from other modules
-pkg_mixer_homepage = https://github.com/chef/mixer
-pkg_mixer_fetch = git
-pkg_mixer_repo = https://github.com/chef/mixer
-pkg_mixer_commit = master
-
-PACKAGES += mochiweb
-pkg_mochiweb_name = mochiweb
-pkg_mochiweb_description = MochiWeb is an Erlang library for building lightweight HTTP servers.
-pkg_mochiweb_homepage = https://github.com/mochi/mochiweb
-pkg_mochiweb_fetch = git
-pkg_mochiweb_repo = https://github.com/mochi/mochiweb
-pkg_mochiweb_commit = master
-
-PACKAGES += mochiweb_xpath
-pkg_mochiweb_xpath_name = mochiweb_xpath
-pkg_mochiweb_xpath_description = XPath support for mochiweb's html parser
-pkg_mochiweb_xpath_homepage = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_fetch = git
-pkg_mochiweb_xpath_repo = https://github.com/retnuh/mochiweb_xpath
-pkg_mochiweb_xpath_commit = master
-
-PACKAGES += mockgyver
-pkg_mockgyver_name = mockgyver
-pkg_mockgyver_description = A mocking library for Erlang
-pkg_mockgyver_homepage = https://github.com/klajo/mockgyver
-pkg_mockgyver_fetch = git
-pkg_mockgyver_repo = https://github.com/klajo/mockgyver
-pkg_mockgyver_commit = master
-
-PACKAGES += modlib
-pkg_modlib_name = modlib
-pkg_modlib_description = Web framework based on Erlang's inets httpd
-pkg_modlib_homepage = https://github.com/gar1t/modlib
-pkg_modlib_fetch = git
-pkg_modlib_repo = https://github.com/gar1t/modlib
-pkg_modlib_commit = master
-
-PACKAGES += mongodb
-pkg_mongodb_name = mongodb
-pkg_mongodb_description = MongoDB driver for Erlang
-pkg_mongodb_homepage = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_fetch = git
-pkg_mongodb_repo = https://github.com/comtihon/mongodb-erlang
-pkg_mongodb_commit = master
-
-PACKAGES += mongooseim
-pkg_mongooseim_name = mongooseim
-pkg_mongooseim_description = Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions
-pkg_mongooseim_homepage = https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform
-pkg_mongooseim_fetch = git
-pkg_mongooseim_repo = https://github.com/esl/MongooseIM
-pkg_mongooseim_commit = master
-
-PACKAGES += moyo
-pkg_moyo_name = moyo
-pkg_moyo_description = Erlang utility functions library
-pkg_moyo_homepage = https://github.com/dwango/moyo
-pkg_moyo_fetch = git
-pkg_moyo_repo = https://github.com/dwango/moyo
-pkg_moyo_commit = master
-
-PACKAGES += msgpack
-pkg_msgpack_name = msgpack
-pkg_msgpack_description = MessagePack (de)serializer implementation for Erlang
-pkg_msgpack_homepage = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_fetch = git
-pkg_msgpack_repo = https://github.com/msgpack/msgpack-erlang
-pkg_msgpack_commit = master
-
-PACKAGES += mu2
-pkg_mu2_name = mu2
-pkg_mu2_description = Erlang mutation testing tool
-pkg_mu2_homepage = https://github.com/ramsay-t/mu2
-pkg_mu2_fetch = git
-pkg_mu2_repo = https://github.com/ramsay-t/mu2
-pkg_mu2_commit = master
-
-PACKAGES += mustache
-pkg_mustache_name = mustache
-pkg_mustache_description = Mustache template engine for Erlang.
-pkg_mustache_homepage = https://github.com/mojombo/mustache.erl
-pkg_mustache_fetch = git
-pkg_mustache_repo = https://github.com/mojombo/mustache.erl
-pkg_mustache_commit = master
-
-PACKAGES += myproto
-pkg_myproto_name = myproto
-pkg_myproto_description = MySQL Server Protocol in Erlang
-pkg_myproto_homepage = https://github.com/altenwald/myproto
-pkg_myproto_fetch = git
-pkg_myproto_repo = https://github.com/altenwald/myproto
-pkg_myproto_commit = master
-
-PACKAGES += mysql
-pkg_mysql_name = mysql
-pkg_mysql_description = Erlang MySQL Driver (from code.google.com)
-pkg_mysql_homepage = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_fetch = git
-pkg_mysql_repo = https://github.com/dizzyd/erlang-mysql-driver
-pkg_mysql_commit = master
-
-PACKAGES += n2o
-pkg_n2o_name = n2o
-pkg_n2o_description = WebSocket Application Server
-pkg_n2o_homepage = https://github.com/5HT/n2o
-pkg_n2o_fetch = git
-pkg_n2o_repo = https://github.com/5HT/n2o
-pkg_n2o_commit = master
-
-PACKAGES += nat_upnp
-pkg_nat_upnp_name = nat_upnp
-pkg_nat_upnp_description = Erlang library to map your internal port to an external using UNP IGD
-pkg_nat_upnp_homepage = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_fetch = git
-pkg_nat_upnp_repo = https://github.com/benoitc/nat_upnp
-pkg_nat_upnp_commit = master
-
-PACKAGES += neo4j
-pkg_neo4j_name = neo4j
-pkg_neo4j_description = Erlang client library for Neo4J.
-pkg_neo4j_homepage = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_fetch = git
-pkg_neo4j_repo = https://github.com/dmitriid/neo4j-erlang
-pkg_neo4j_commit = master
-
-PACKAGES += neotoma
-pkg_neotoma_name = neotoma
-pkg_neotoma_description = Erlang library and packrat parser-generator for parsing expression grammars.
-pkg_neotoma_homepage = https://github.com/seancribbs/neotoma
-pkg_neotoma_fetch = git
-pkg_neotoma_repo = https://github.com/seancribbs/neotoma
-pkg_neotoma_commit = master
-
-PACKAGES += newrelic
-pkg_newrelic_name = newrelic
-pkg_newrelic_description = Erlang library for sending metrics to New Relic
-pkg_newrelic_homepage = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_fetch = git
-pkg_newrelic_repo = https://github.com/wooga/newrelic-erlang
-pkg_newrelic_commit = master
-
-PACKAGES += nifty
-pkg_nifty_name = nifty
-pkg_nifty_description = Erlang NIF wrapper generator
-pkg_nifty_homepage = https://github.com/parapluu/nifty
-pkg_nifty_fetch = git
-pkg_nifty_repo = https://github.com/parapluu/nifty
-pkg_nifty_commit = master
-
-PACKAGES += nitrogen_core
-pkg_nitrogen_core_name = nitrogen_core
-pkg_nitrogen_core_description = The core Nitrogen library.
-pkg_nitrogen_core_homepage = http://nitrogenproject.com/
-pkg_nitrogen_core_fetch = git
-pkg_nitrogen_core_repo = https://github.com/nitrogen/nitrogen_core
-pkg_nitrogen_core_commit = master
-
-PACKAGES += nkbase
-pkg_nkbase_name = nkbase
-pkg_nkbase_description = NkBASE distributed database
-pkg_nkbase_homepage = https://github.com/Nekso/nkbase
-pkg_nkbase_fetch = git
-pkg_nkbase_repo = https://github.com/Nekso/nkbase
-pkg_nkbase_commit = develop
-
-PACKAGES += nkdocker
-pkg_nkdocker_name = nkdocker
-pkg_nkdocker_description = Erlang Docker client
-pkg_nkdocker_homepage = https://github.com/Nekso/nkdocker
-pkg_nkdocker_fetch = git
-pkg_nkdocker_repo = https://github.com/Nekso/nkdocker
-pkg_nkdocker_commit = master
-
-PACKAGES += nkpacket
-pkg_nkpacket_name = nkpacket
-pkg_nkpacket_description = Generic Erlang transport layer
-pkg_nkpacket_homepage = https://github.com/Nekso/nkpacket
-pkg_nkpacket_fetch = git
-pkg_nkpacket_repo = https://github.com/Nekso/nkpacket
-pkg_nkpacket_commit = master
-
-PACKAGES += nksip
-pkg_nksip_name = nksip
-pkg_nksip_description = Erlang SIP application server
-pkg_nksip_homepage = https://github.com/kalta/nksip
-pkg_nksip_fetch = git
-pkg_nksip_repo = https://github.com/kalta/nksip
-pkg_nksip_commit = master
-
-PACKAGES += nodefinder
-pkg_nodefinder_name = nodefinder
-pkg_nodefinder_description = automatic node discovery via UDP multicast
-pkg_nodefinder_homepage = https://github.com/erlanger/nodefinder
-pkg_nodefinder_fetch = git
-pkg_nodefinder_repo = https://github.com/okeuday/nodefinder
-pkg_nodefinder_commit = master
-
-PACKAGES += nprocreg
-pkg_nprocreg_name = nprocreg
-pkg_nprocreg_description = Minimal Distributed Erlang Process Registry
-pkg_nprocreg_homepage = http://nitrogenproject.com/
-pkg_nprocreg_fetch = git
-pkg_nprocreg_repo = https://github.com/nitrogen/nprocreg
-pkg_nprocreg_commit = master
-
-PACKAGES += oauth
-pkg_oauth_name = oauth
-pkg_oauth_description = An Erlang OAuth 1.0 implementation
-pkg_oauth_homepage = https://github.com/tim/erlang-oauth
-pkg_oauth_fetch = git
-pkg_oauth_repo = https://github.com/tim/erlang-oauth
-pkg_oauth_commit = master
-
-PACKAGES += oauth2
-pkg_oauth2_name = oauth2
-pkg_oauth2_description = Erlang Oauth2 implementation
-pkg_oauth2_homepage = https://github.com/kivra/oauth2
-pkg_oauth2_fetch = git
-pkg_oauth2_repo = https://github.com/kivra/oauth2
-pkg_oauth2_commit = master
-
-PACKAGES += octopus
-pkg_octopus_name = octopus
-pkg_octopus_description = Small and flexible pool manager written in Erlang
-pkg_octopus_homepage = https://github.com/erlangbureau/octopus
-pkg_octopus_fetch = git
-pkg_octopus_repo = https://github.com/erlangbureau/octopus
-pkg_octopus_commit = 1.0.0
-
-PACKAGES += of_protocol
-pkg_of_protocol_name = of_protocol
-pkg_of_protocol_description = OpenFlow Protocol Library for Erlang
-pkg_of_protocol_homepage = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_fetch = git
-pkg_of_protocol_repo = https://github.com/FlowForwarding/of_protocol
-pkg_of_protocol_commit = master
-
-PACKAGES += opencouch
-pkg_opencouch_name = couch
-pkg_opencouch_description = A embeddable document oriented database compatible with Apache CouchDB
-pkg_opencouch_homepage = https://github.com/benoitc/opencouch
-pkg_opencouch_fetch = git
-pkg_opencouch_repo = https://github.com/benoitc/opencouch
-pkg_opencouch_commit = master
-
-PACKAGES += openflow
-pkg_openflow_name = openflow
-pkg_openflow_description = An OpenFlow controller written in pure erlang
-pkg_openflow_homepage = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_fetch = git
-pkg_openflow_repo = https://github.com/renatoaguiar/erlang-openflow
-pkg_openflow_commit = master
-
-PACKAGES += openid
-pkg_openid_name = openid
-pkg_openid_description = Erlang OpenID
-pkg_openid_homepage = https://github.com/brendonh/erl_openid
-pkg_openid_fetch = git
-pkg_openid_repo = https://github.com/brendonh/erl_openid
-pkg_openid_commit = master
-
-PACKAGES += openpoker
-pkg_openpoker_name = openpoker
-pkg_openpoker_description = Genesis Texas hold'em Game Server
-pkg_openpoker_homepage = https://github.com/hpyhacking/openpoker
-pkg_openpoker_fetch = git
-pkg_openpoker_repo = https://github.com/hpyhacking/openpoker
-pkg_openpoker_commit = master
-
-PACKAGES += pal
-pkg_pal_name = pal
-pkg_pal_description = Pragmatic Authentication Library
-pkg_pal_homepage = https://github.com/manifest/pal
-pkg_pal_fetch = git
-pkg_pal_repo = https://github.com/manifest/pal
-pkg_pal_commit = master
-
-PACKAGES += parse_trans
-pkg_parse_trans_name = parse_trans
-pkg_parse_trans_description = Parse transform utilities for Erlang
-pkg_parse_trans_homepage = https://github.com/uwiger/parse_trans
-pkg_parse_trans_fetch = git
-pkg_parse_trans_repo = https://github.com/uwiger/parse_trans
-pkg_parse_trans_commit = master
-
-PACKAGES += parsexml
-pkg_parsexml_name = parsexml
-pkg_parsexml_description = Simple DOM XML parser with convenient and very simple API
-pkg_parsexml_homepage = https://github.com/maxlapshin/parsexml
-pkg_parsexml_fetch = git
-pkg_parsexml_repo = https://github.com/maxlapshin/parsexml
-pkg_parsexml_commit = master
-
-PACKAGES += pegjs
-pkg_pegjs_name = pegjs
-pkg_pegjs_description = An implementation of PEG.js grammar for Erlang.
-pkg_pegjs_homepage = https://github.com/dmitriid/pegjs
-pkg_pegjs_fetch = git
-pkg_pegjs_repo = https://github.com/dmitriid/pegjs
-pkg_pegjs_commit = 0.3
-
-PACKAGES += percept2
-pkg_percept2_name = percept2
-pkg_percept2_description = Concurrent profiling tool for Erlang
-pkg_percept2_homepage = https://github.com/huiqing/percept2
-pkg_percept2_fetch = git
-pkg_percept2_repo = https://github.com/huiqing/percept2
-pkg_percept2_commit = master
-
-PACKAGES += pgsql
-pkg_pgsql_name = pgsql
-pkg_pgsql_description = Erlang PostgreSQL driver
-pkg_pgsql_homepage = https://github.com/semiocast/pgsql
-pkg_pgsql_fetch = git
-pkg_pgsql_repo = https://github.com/semiocast/pgsql
-pkg_pgsql_commit = master
-
-PACKAGES += pkgx
-pkg_pkgx_name = pkgx
-pkg_pkgx_description = Build .deb packages from Erlang releases
-pkg_pkgx_homepage = https://github.com/arjan/pkgx
-pkg_pkgx_fetch = git
-pkg_pkgx_repo = https://github.com/arjan/pkgx
-pkg_pkgx_commit = master
-
-PACKAGES += pkt
-pkg_pkt_name = pkt
-pkg_pkt_description = Erlang network protocol library
-pkg_pkt_homepage = https://github.com/msantos/pkt
-pkg_pkt_fetch = git
-pkg_pkt_repo = https://github.com/msantos/pkt
-pkg_pkt_commit = master
-
-PACKAGES += plain_fsm
-pkg_plain_fsm_name = plain_fsm
-pkg_plain_fsm_description = A behaviour/support library for writing plain Erlang FSMs.
-pkg_plain_fsm_homepage = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_fetch = git
-pkg_plain_fsm_repo = https://github.com/uwiger/plain_fsm
-pkg_plain_fsm_commit = master
-
-PACKAGES += plumtree
-pkg_plumtree_name = plumtree
-pkg_plumtree_description = Epidemic Broadcast Trees
-pkg_plumtree_homepage = https://github.com/helium/plumtree
-pkg_plumtree_fetch = git
-pkg_plumtree_repo = https://github.com/helium/plumtree
-pkg_plumtree_commit = master
-
-PACKAGES += pmod_transform
-pkg_pmod_transform_name = pmod_transform
-pkg_pmod_transform_description = Parse transform for parameterized modules
-pkg_pmod_transform_homepage = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_fetch = git
-pkg_pmod_transform_repo = https://github.com/erlang/pmod_transform
-pkg_pmod_transform_commit = master
-
-PACKAGES += pobox
-pkg_pobox_name = pobox
-pkg_pobox_description = External buffer processes to protect against mailbox overflow in Erlang
-pkg_pobox_homepage = https://github.com/ferd/pobox
-pkg_pobox_fetch = git
-pkg_pobox_repo = https://github.com/ferd/pobox
-pkg_pobox_commit = master
-
-PACKAGES += ponos
-pkg_ponos_name = ponos
-pkg_ponos_description = ponos is a simple yet powerful load generator written in erlang
-pkg_ponos_homepage = https://github.com/klarna/ponos
-pkg_ponos_fetch = git
-pkg_ponos_repo = https://github.com/klarna/ponos
-pkg_ponos_commit = master
-
-PACKAGES += poolboy
-pkg_poolboy_name = poolboy
-pkg_poolboy_description = A hunky Erlang worker pool factory
-pkg_poolboy_homepage = https://github.com/devinus/poolboy
-pkg_poolboy_fetch = git
-pkg_poolboy_repo = https://github.com/devinus/poolboy
-pkg_poolboy_commit = master
-
-PACKAGES += pooler
-pkg_pooler_name = pooler
-pkg_pooler_description = An OTP Process Pool Application
-pkg_pooler_homepage = https://github.com/seth/pooler
-pkg_pooler_fetch = git
-pkg_pooler_repo = https://github.com/seth/pooler
-pkg_pooler_commit = master
-
-PACKAGES += pqueue
-pkg_pqueue_name = pqueue
-pkg_pqueue_description = Erlang Priority Queues
-pkg_pqueue_homepage = https://github.com/okeuday/pqueue
-pkg_pqueue_fetch = git
-pkg_pqueue_repo = https://github.com/okeuday/pqueue
-pkg_pqueue_commit = master
-
-PACKAGES += procket
-pkg_procket_name = procket
-pkg_procket_description = Erlang interface to low level socket operations
-pkg_procket_homepage = http://blog.listincomprehension.com/search/label/procket
-pkg_procket_fetch = git
-pkg_procket_repo = https://github.com/msantos/procket
-pkg_procket_commit = master
-
-PACKAGES += prop
-pkg_prop_name = prop
-pkg_prop_description = An Erlang code scaffolding and generator system.
-pkg_prop_homepage = https://github.com/nuex/prop
-pkg_prop_fetch = git
-pkg_prop_repo = https://github.com/nuex/prop
-pkg_prop_commit = master
-
-PACKAGES += proper
-pkg_proper_name = proper
-pkg_proper_description = PropEr: a QuickCheck-inspired property-based testing tool for Erlang.
-pkg_proper_homepage = http://proper.softlab.ntua.gr
-pkg_proper_fetch = git
-pkg_proper_repo = https://github.com/manopapad/proper
-pkg_proper_commit = master
-
-PACKAGES += props
-pkg_props_name = props
-pkg_props_description = Property structure library
-pkg_props_homepage = https://github.com/greyarea/props
-pkg_props_fetch = git
-pkg_props_repo = https://github.com/greyarea/props
-pkg_props_commit = master
-
-PACKAGES += protobuffs
-pkg_protobuffs_name = protobuffs
-pkg_protobuffs_description = An implementation of Google's Protocol Buffers for Erlang, based on ngerakines/erlang_protobuffs.
-pkg_protobuffs_homepage = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_fetch = git
-pkg_protobuffs_repo = https://github.com/basho/erlang_protobuffs
-pkg_protobuffs_commit = master
-
-PACKAGES += psycho
-pkg_psycho_name = psycho
-pkg_psycho_description = HTTP server that provides a WSGI-like interface for applications and middleware.
-pkg_psycho_homepage = https://github.com/gar1t/psycho
-pkg_psycho_fetch = git
-pkg_psycho_repo = https://github.com/gar1t/psycho
-pkg_psycho_commit = master
-
-PACKAGES += purity
-pkg_purity_name = purity
-pkg_purity_description = A side-effect analyzer for Erlang
-pkg_purity_homepage = https://github.com/mpitid/purity
-pkg_purity_fetch = git
-pkg_purity_repo = https://github.com/mpitid/purity
-pkg_purity_commit = master
-
-PACKAGES += push_service
-pkg_push_service_name = push_service
-pkg_push_service_description = Push service
-pkg_push_service_homepage = https://github.com/hairyhum/push_service
-pkg_push_service_fetch = git
-pkg_push_service_repo = https://github.com/hairyhum/push_service
-pkg_push_service_commit = master
-
-PACKAGES += qdate
-pkg_qdate_name = qdate
-pkg_qdate_description = Date, time, and timezone parsing, formatting, and conversion for Erlang.
-pkg_qdate_homepage = https://github.com/choptastic/qdate
-pkg_qdate_fetch = git
-pkg_qdate_repo = https://github.com/choptastic/qdate
-pkg_qdate_commit = 0.4.0
-
-PACKAGES += qrcode
-pkg_qrcode_name = qrcode
-pkg_qrcode_description = QR Code encoder in Erlang
-pkg_qrcode_homepage = https://github.com/komone/qrcode
-pkg_qrcode_fetch = git
-pkg_qrcode_repo = https://github.com/komone/qrcode
-pkg_qrcode_commit = master
-
-PACKAGES += quest
-pkg_quest_name = quest
-pkg_quest_description = Learn Erlang through this set of challenges. An interactive system for getting to know Erlang.
-pkg_quest_homepage = https://github.com/eriksoe/ErlangQuest
-pkg_quest_fetch = git
-pkg_quest_repo = https://github.com/eriksoe/ErlangQuest
-pkg_quest_commit = master
-
-PACKAGES += quickrand
-pkg_quickrand_name = quickrand
-pkg_quickrand_description = Quick Erlang Random Number Generation
-pkg_quickrand_homepage = https://github.com/okeuday/quickrand
-pkg_quickrand_fetch = git
-pkg_quickrand_repo = https://github.com/okeuday/quickrand
-pkg_quickrand_commit = master
-
-PACKAGES += rabbit
-pkg_rabbit_name = rabbit
-pkg_rabbit_description = RabbitMQ Server
-pkg_rabbit_homepage = https://www.rabbitmq.com/
-pkg_rabbit_fetch = git
-pkg_rabbit_repo = https://github.com/rabbitmq/rabbitmq-server.git
-pkg_rabbit_commit = master
-
-PACKAGES += rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_name = rabbit_exchange_type_riak
-pkg_rabbit_exchange_type_riak_description = Custom RabbitMQ exchange type for sticking messages in Riak
-pkg_rabbit_exchange_type_riak_homepage = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_fetch = git
-pkg_rabbit_exchange_type_riak_repo = https://github.com/jbrisbin/riak-exchange
-pkg_rabbit_exchange_type_riak_commit = master
-
-PACKAGES += rack
-pkg_rack_name = rack
-pkg_rack_description = Rack handler for erlang
-pkg_rack_homepage = https://github.com/erlyvideo/rack
-pkg_rack_fetch = git
-pkg_rack_repo = https://github.com/erlyvideo/rack
-pkg_rack_commit = master
-
-PACKAGES += radierl
-pkg_radierl_name = radierl
-pkg_radierl_description = RADIUS protocol stack implemented in Erlang.
-pkg_radierl_homepage = https://github.com/vances/radierl
-pkg_radierl_fetch = git
-pkg_radierl_repo = https://github.com/vances/radierl
-pkg_radierl_commit = master
-
-PACKAGES += rafter
-pkg_rafter_name = rafter
-pkg_rafter_description = An Erlang library application which implements the Raft consensus protocol
-pkg_rafter_homepage = https://github.com/andrewjstone/rafter
-pkg_rafter_fetch = git
-pkg_rafter_repo = https://github.com/andrewjstone/rafter
-pkg_rafter_commit = master
-
-PACKAGES += ranch
-pkg_ranch_name = ranch
-pkg_ranch_description = Socket acceptor pool for TCP protocols.
-pkg_ranch_homepage = http://ninenines.eu
-pkg_ranch_fetch = git
-pkg_ranch_repo = https://github.com/ninenines/ranch
-pkg_ranch_commit = 1.1.0
-
-PACKAGES += rbeacon
-pkg_rbeacon_name = rbeacon
-pkg_rbeacon_description = LAN discovery and presence in Erlang.
-pkg_rbeacon_homepage = https://github.com/refuge/rbeacon
-pkg_rbeacon_fetch = git
-pkg_rbeacon_repo = https://github.com/refuge/rbeacon
-pkg_rbeacon_commit = master
-
-PACKAGES += rebar
-pkg_rebar_name = rebar
-pkg_rebar_description = Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.
-pkg_rebar_homepage = http://www.rebar3.org
-pkg_rebar_fetch = git
-pkg_rebar_repo = https://github.com/rebar/rebar3
-pkg_rebar_commit = master
-
-PACKAGES += rebus
-pkg_rebus_name = rebus
-pkg_rebus_description = A stupid simple, internal, pub/sub event bus written in- and for Erlang.
-pkg_rebus_homepage = https://github.com/olle/rebus
-pkg_rebus_fetch = git
-pkg_rebus_repo = https://github.com/olle/rebus
-pkg_rebus_commit = master
-
-PACKAGES += rec2json
-pkg_rec2json_name = rec2json
-pkg_rec2json_description = Compile erlang record definitions into modules to convert them to/from json easily.
-pkg_rec2json_homepage = https://github.com/lordnull/rec2json
-pkg_rec2json_fetch = git
-pkg_rec2json_repo = https://github.com/lordnull/rec2json
-pkg_rec2json_commit = master
-
-PACKAGES += recon
-pkg_recon_name = recon
-pkg_recon_description = Collection of functions and scripts to debug Erlang in production.
-pkg_recon_homepage = https://github.com/ferd/recon
-pkg_recon_fetch = git
-pkg_recon_repo = https://github.com/ferd/recon
-pkg_recon_commit = 2.2.1
-
-PACKAGES += record_info
-pkg_record_info_name = record_info
-pkg_record_info_description = Convert between record and proplist
-pkg_record_info_homepage = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_fetch = git
-pkg_record_info_repo = https://github.com/bipthelin/erlang-record_info
-pkg_record_info_commit = master
-
-PACKAGES += redgrid
-pkg_redgrid_name = redgrid
-pkg_redgrid_description = automatic Erlang node discovery via redis
-pkg_redgrid_homepage = https://github.com/jkvor/redgrid
-pkg_redgrid_fetch = git
-pkg_redgrid_repo = https://github.com/jkvor/redgrid
-pkg_redgrid_commit = master
-
-PACKAGES += redo
-pkg_redo_name = redo
-pkg_redo_description = pipelined erlang redis client
-pkg_redo_homepage = https://github.com/jkvor/redo
-pkg_redo_fetch = git
-pkg_redo_repo = https://github.com/jkvor/redo
-pkg_redo_commit = master
-
-PACKAGES += reload_mk
-pkg_reload_mk_name = reload_mk
-pkg_reload_mk_description = Live reload plugin for erlang.mk.
-pkg_reload_mk_homepage = https://github.com/bullno1/reload.mk
-pkg_reload_mk_fetch = git
-pkg_reload_mk_repo = https://github.com/bullno1/reload.mk
-pkg_reload_mk_commit = master
-
-PACKAGES += reltool_util
-pkg_reltool_util_name = reltool_util
-pkg_reltool_util_description = Erlang reltool utility functionality application
-pkg_reltool_util_homepage = https://github.com/okeuday/reltool_util
-pkg_reltool_util_fetch = git
-pkg_reltool_util_repo = https://github.com/okeuday/reltool_util
-pkg_reltool_util_commit = master
-
-PACKAGES += relx
-pkg_relx_name = relx
-pkg_relx_description = Sane, simple release creation for Erlang
-pkg_relx_homepage = https://github.com/erlware/relx
-pkg_relx_fetch = git
-pkg_relx_repo = https://github.com/erlware/relx
-pkg_relx_commit = master
-
-PACKAGES += resource_discovery
-pkg_resource_discovery_name = resource_discovery
-pkg_resource_discovery_description = An application used to dynamically discover resources present in an Erlang node cluster.
-pkg_resource_discovery_homepage = http://erlware.org/
-pkg_resource_discovery_fetch = git
-pkg_resource_discovery_repo = https://github.com/erlware/resource_discovery
-pkg_resource_discovery_commit = master
-
-PACKAGES += restc
-pkg_restc_name = restc
-pkg_restc_description = Erlang Rest Client
-pkg_restc_homepage = https://github.com/kivra/restclient
-pkg_restc_fetch = git
-pkg_restc_repo = https://github.com/kivra/restclient
-pkg_restc_commit = master
-
-PACKAGES += rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_name = rfc4627_jsonrpc
-pkg_rfc4627_jsonrpc_description = Erlang RFC4627 (JSON) codec and JSON-RPC server implementation.
-pkg_rfc4627_jsonrpc_homepage = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_fetch = git
-pkg_rfc4627_jsonrpc_repo = https://github.com/tonyg/erlang-rfc4627
-pkg_rfc4627_jsonrpc_commit = master
-
-PACKAGES += riak_control
-pkg_riak_control_name = riak_control
-pkg_riak_control_description = Webmachine-based administration interface for Riak.
-pkg_riak_control_homepage = https://github.com/basho/riak_control
-pkg_riak_control_fetch = git
-pkg_riak_control_repo = https://github.com/basho/riak_control
-pkg_riak_control_commit = master
-
-PACKAGES += riak_core
-pkg_riak_core_name = riak_core
-pkg_riak_core_description = Distributed systems infrastructure used by Riak.
-pkg_riak_core_homepage = https://github.com/basho/riak_core
-pkg_riak_core_fetch = git
-pkg_riak_core_repo = https://github.com/basho/riak_core
-pkg_riak_core_commit = master
-
-PACKAGES += riak_dt
-pkg_riak_dt_name = riak_dt
-pkg_riak_dt_description = Convergent replicated datatypes in Erlang
-pkg_riak_dt_homepage = https://github.com/basho/riak_dt
-pkg_riak_dt_fetch = git
-pkg_riak_dt_repo = https://github.com/basho/riak_dt
-pkg_riak_dt_commit = master
-
-PACKAGES += riak_ensemble
-pkg_riak_ensemble_name = riak_ensemble
-pkg_riak_ensemble_description = Multi-Paxos framework in Erlang
-pkg_riak_ensemble_homepage = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_fetch = git
-pkg_riak_ensemble_repo = https://github.com/basho/riak_ensemble
-pkg_riak_ensemble_commit = master
-
-PACKAGES += riak_kv
-pkg_riak_kv_name = riak_kv
-pkg_riak_kv_description = Riak Key/Value Store
-pkg_riak_kv_homepage = https://github.com/basho/riak_kv
-pkg_riak_kv_fetch = git
-pkg_riak_kv_repo = https://github.com/basho/riak_kv
-pkg_riak_kv_commit = master
-
-PACKAGES += riak_pg
-pkg_riak_pg_name = riak_pg
-pkg_riak_pg_description = Distributed process groups with riak_core.
-pkg_riak_pg_homepage = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_fetch = git
-pkg_riak_pg_repo = https://github.com/cmeiklejohn/riak_pg
-pkg_riak_pg_commit = master
-
-PACKAGES += riak_pipe
-pkg_riak_pipe_name = riak_pipe
-pkg_riak_pipe_description = Riak Pipelines
-pkg_riak_pipe_homepage = https://github.com/basho/riak_pipe
-pkg_riak_pipe_fetch = git
-pkg_riak_pipe_repo = https://github.com/basho/riak_pipe
-pkg_riak_pipe_commit = master
-
-PACKAGES += riak_sysmon
-pkg_riak_sysmon_name = riak_sysmon
-pkg_riak_sysmon_description = Simple OTP app for managing Erlang VM system_monitor event messages
-pkg_riak_sysmon_homepage = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_fetch = git
-pkg_riak_sysmon_repo = https://github.com/basho/riak_sysmon
-pkg_riak_sysmon_commit = master
-
-PACKAGES += riak_test
-pkg_riak_test_name = riak_test
-pkg_riak_test_description = I'm in your cluster, testing your riaks
-pkg_riak_test_homepage = https://github.com/basho/riak_test
-pkg_riak_test_fetch = git
-pkg_riak_test_repo = https://github.com/basho/riak_test
-pkg_riak_test_commit = master
-
-PACKAGES += riakc
-pkg_riakc_name = riakc
-pkg_riakc_description = Erlang clients for Riak.
-pkg_riakc_homepage = https://github.com/basho/riak-erlang-client
-pkg_riakc_fetch = git
-pkg_riakc_repo = https://github.com/basho/riak-erlang-client
-pkg_riakc_commit = master
-
-PACKAGES += riakhttpc
-pkg_riakhttpc_name = riakhttpc
-pkg_riakhttpc_description = Riak Erlang client using the HTTP interface
-pkg_riakhttpc_homepage = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_fetch = git
-pkg_riakhttpc_repo = https://github.com/basho/riak-erlang-http-client
-pkg_riakhttpc_commit = master
-
-PACKAGES += riaknostic
-pkg_riaknostic_name = riaknostic
-pkg_riaknostic_description = A diagnostic tool for Riak installations, to find common errors asap
-pkg_riaknostic_homepage = https://github.com/basho/riaknostic
-pkg_riaknostic_fetch = git
-pkg_riaknostic_repo = https://github.com/basho/riaknostic
-pkg_riaknostic_commit = master
-
-PACKAGES += riakpool
-pkg_riakpool_name = riakpool
-pkg_riakpool_description = erlang riak client pool
-pkg_riakpool_homepage = https://github.com/dweldon/riakpool
-pkg_riakpool_fetch = git
-pkg_riakpool_repo = https://github.com/dweldon/riakpool
-pkg_riakpool_commit = master
-
-PACKAGES += rivus_cep
-pkg_rivus_cep_name = rivus_cep
-pkg_rivus_cep_description = Complex event processing in Erlang
-pkg_rivus_cep_homepage = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_fetch = git
-pkg_rivus_cep_repo = https://github.com/vascokk/rivus_cep
-pkg_rivus_cep_commit = master
-
-PACKAGES += rlimit
-pkg_rlimit_name = rlimit
-pkg_rlimit_description = Magnus Klaar's rate limiter code from etorrent
-pkg_rlimit_homepage = https://github.com/jlouis/rlimit
-pkg_rlimit_fetch = git
-pkg_rlimit_repo = https://github.com/jlouis/rlimit
-pkg_rlimit_commit = master
-
-PACKAGES += safetyvalve
-pkg_safetyvalve_name = safetyvalve
-pkg_safetyvalve_description = A safety valve for your erlang node
-pkg_safetyvalve_homepage = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_fetch = git
-pkg_safetyvalve_repo = https://github.com/jlouis/safetyvalve
-pkg_safetyvalve_commit = master
-
-PACKAGES += seestar
-pkg_seestar_name = seestar
-pkg_seestar_description = The Erlang client for Cassandra 1.2+ binary protocol
-pkg_seestar_homepage = https://github.com/iamaleksey/seestar
-pkg_seestar_fetch = git
-pkg_seestar_repo = https://github.com/iamaleksey/seestar
-pkg_seestar_commit = master
-
-PACKAGES += service
-pkg_service_name = service
-pkg_service_description = A minimal Erlang behavior for creating CloudI internal services
-pkg_service_homepage = http://cloudi.org/
-pkg_service_fetch = git
-pkg_service_repo = https://github.com/CloudI/service
-pkg_service_commit = master
-
-PACKAGES += setup
-pkg_setup_name = setup
-pkg_setup_description = Generic setup utility for Erlang-based systems
-pkg_setup_homepage = https://github.com/uwiger/setup
-pkg_setup_fetch = git
-pkg_setup_repo = https://github.com/uwiger/setup
-pkg_setup_commit = master
-
-PACKAGES += sext
-pkg_sext_name = sext
-pkg_sext_description = Sortable Erlang Term Serialization
-pkg_sext_homepage = https://github.com/uwiger/sext
-pkg_sext_fetch = git
-pkg_sext_repo = https://github.com/uwiger/sext
-pkg_sext_commit = master
-
-PACKAGES += sfmt
-pkg_sfmt_name = sfmt
-pkg_sfmt_description = SFMT pseudo random number generator for Erlang.
-pkg_sfmt_homepage = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_fetch = git
-pkg_sfmt_repo = https://github.com/jj1bdx/sfmt-erlang
-pkg_sfmt_commit = master
-
-PACKAGES += sgte
-pkg_sgte_name = sgte
-pkg_sgte_description = A simple Erlang Template Engine
-pkg_sgte_homepage = https://github.com/filippo/sgte
-pkg_sgte_fetch = git
-pkg_sgte_repo = https://github.com/filippo/sgte
-pkg_sgte_commit = master
-
-PACKAGES += sheriff
-pkg_sheriff_name = sheriff
-pkg_sheriff_description = Parse transform for type based validation.
-pkg_sheriff_homepage = http://ninenines.eu
-pkg_sheriff_fetch = git
-pkg_sheriff_repo = https://github.com/extend/sheriff
-pkg_sheriff_commit = master
-
-PACKAGES += shotgun
-pkg_shotgun_name = shotgun
-pkg_shotgun_description = better than just a gun
-pkg_shotgun_homepage = https://github.com/inaka/shotgun
-pkg_shotgun_fetch = git
-pkg_shotgun_repo = https://github.com/inaka/shotgun
-pkg_shotgun_commit = 0.1.0
-
-PACKAGES += sidejob
-pkg_sidejob_name = sidejob
-pkg_sidejob_description = Parallel worker and capacity limiting library for Erlang
-pkg_sidejob_homepage = https://github.com/basho/sidejob
-pkg_sidejob_fetch = git
-pkg_sidejob_repo = https://github.com/basho/sidejob
-pkg_sidejob_commit = master
-
-PACKAGES += sieve
-pkg_sieve_name = sieve
-pkg_sieve_description = sieve is a simple TCP routing proxy (layer 7) in erlang
-pkg_sieve_homepage = https://github.com/benoitc/sieve
-pkg_sieve_fetch = git
-pkg_sieve_repo = https://github.com/benoitc/sieve
-pkg_sieve_commit = master
-
-PACKAGES += sighandler
-pkg_sighandler_name = sighandler
-pkg_sighandler_description = Handle UNIX signals in Er    lang
-pkg_sighandler_homepage = https://github.com/jkingsbery/sighandler
-pkg_sighandler_fetch = git
-pkg_sighandler_repo = https://github.com/jkingsbery/sighandler
-pkg_sighandler_commit = master
-
-PACKAGES += simhash
-pkg_simhash_name = simhash
-pkg_simhash_description = Simhashing for Erlang -- hashing algorithm to find near-duplicates in binary data.
-pkg_simhash_homepage = https://github.com/ferd/simhash
-pkg_simhash_fetch = git
-pkg_simhash_repo = https://github.com/ferd/simhash
-pkg_simhash_commit = master
-
-PACKAGES += simple_bridge
-pkg_simple_bridge_name = simple_bridge
-pkg_simple_bridge_description = A simple, standardized interface library to Erlang HTTP Servers.
-pkg_simple_bridge_homepage = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_fetch = git
-pkg_simple_bridge_repo = https://github.com/nitrogen/simple_bridge
-pkg_simple_bridge_commit = master
-
-PACKAGES += simple_oauth2
-pkg_simple_oauth2_name = simple_oauth2
-pkg_simple_oauth2_description = Simple erlang OAuth2 client module for any http server framework (Google, Facebook, Yandex, Vkontakte are preconfigured)
-pkg_simple_oauth2_homepage = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_fetch = git
-pkg_simple_oauth2_repo = https://github.com/virtan/simple_oauth2
-pkg_simple_oauth2_commit = master
-
-PACKAGES += skel
-pkg_skel_name = skel
-pkg_skel_description = A Streaming Process-based Skeleton Library for Erlang
-pkg_skel_homepage = https://github.com/ParaPhrase/skel
-pkg_skel_fetch = git
-pkg_skel_repo = https://github.com/ParaPhrase/skel
-pkg_skel_commit = master
-
-PACKAGES += smother
-pkg_smother_name = smother
-pkg_smother_description = Extended code coverage metrics for Erlang.
-pkg_smother_homepage = https://ramsay-t.github.io/Smother/
-pkg_smother_fetch = git
-pkg_smother_repo = https://github.com/ramsay-t/Smother
-pkg_smother_commit = master
-
-PACKAGES += social
-pkg_social_name = social
-pkg_social_description = Cowboy handler for social login via OAuth2 providers
-pkg_social_homepage = https://github.com/dvv/social
-pkg_social_fetch = git
-pkg_social_repo = https://github.com/dvv/social
-pkg_social_commit = master
-
-PACKAGES += spapi_router
-pkg_spapi_router_name = spapi_router
-pkg_spapi_router_description = Partially-connected Erlang clustering
-pkg_spapi_router_homepage = https://github.com/spilgames/spapi-router
-pkg_spapi_router_fetch = git
-pkg_spapi_router_repo = https://github.com/spilgames/spapi-router
-pkg_spapi_router_commit = master
-
-PACKAGES += sqerl
-pkg_sqerl_name = sqerl
-pkg_sqerl_description = An Erlang-flavoured SQL DSL
-pkg_sqerl_homepage = https://github.com/hairyhum/sqerl
-pkg_sqerl_fetch = git
-pkg_sqerl_repo = https://github.com/hairyhum/sqerl
-pkg_sqerl_commit = master
-
-PACKAGES += srly
-pkg_srly_name = srly
-pkg_srly_description = Native Erlang Unix serial interface
-pkg_srly_homepage = https://github.com/msantos/srly
-pkg_srly_fetch = git
-pkg_srly_repo = https://github.com/msantos/srly
-pkg_srly_commit = master
-
-PACKAGES += sshrpc
-pkg_sshrpc_name = sshrpc
-pkg_sshrpc_description = Erlang SSH RPC module (experimental)
-pkg_sshrpc_homepage = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_fetch = git
-pkg_sshrpc_repo = https://github.com/jj1bdx/sshrpc
-pkg_sshrpc_commit = master
-
-PACKAGES += stable
-pkg_stable_name = stable
-pkg_stable_description = Library of assorted helpers for Cowboy web server.
-pkg_stable_homepage = https://github.com/dvv/stable
-pkg_stable_fetch = git
-pkg_stable_repo = https://github.com/dvv/stable
-pkg_stable_commit = master
-
-PACKAGES += statebox
-pkg_statebox_name = statebox
-pkg_statebox_description = Erlang state monad with merge/conflict-resolution capabilities. Useful for Riak.
-pkg_statebox_homepage = https://github.com/mochi/statebox
-pkg_statebox_fetch = git
-pkg_statebox_repo = https://github.com/mochi/statebox
-pkg_statebox_commit = master
-
-PACKAGES += statebox_riak
-pkg_statebox_riak_name = statebox_riak
-pkg_statebox_riak_description = Convenience library that makes it easier to use statebox with riak, extracted from best practices in our production code at Mochi Media.
-pkg_statebox_riak_homepage = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_fetch = git
-pkg_statebox_riak_repo = https://github.com/mochi/statebox_riak
-pkg_statebox_riak_commit = master
-
-PACKAGES += statman
-pkg_statman_name = statman
-pkg_statman_description = Efficiently collect massive volumes of metrics inside the Erlang VM
-pkg_statman_homepage = https://github.com/knutin/statman
-pkg_statman_fetch = git
-pkg_statman_repo = https://github.com/knutin/statman
-pkg_statman_commit = master
-
-PACKAGES += statsderl
-pkg_statsderl_name = statsderl
-pkg_statsderl_description = StatsD client (erlang)
-pkg_statsderl_homepage = https://github.com/lpgauth/statsderl
-pkg_statsderl_fetch = git
-pkg_statsderl_repo = https://github.com/lpgauth/statsderl
-pkg_statsderl_commit = master
-
-PACKAGES += stdinout_pool
-pkg_stdinout_pool_name = stdinout_pool
-pkg_stdinout_pool_description = stdinout_pool    : stuff goes in, stuff goes out. there's never any miscommunication.
-pkg_stdinout_pool_homepage = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_fetch = git
-pkg_stdinout_pool_repo = https://github.com/mattsta/erlang-stdinout-pool
-pkg_stdinout_pool_commit = master
-
-PACKAGES += stockdb
-pkg_stockdb_name = stockdb
-pkg_stockdb_description = Database for storing Stock Exchange quotes in erlang
-pkg_stockdb_homepage = https://github.com/maxlapshin/stockdb
-pkg_stockdb_fetch = git
-pkg_stockdb_repo = https://github.com/maxlapshin/stockdb
-pkg_stockdb_commit = master
-
-PACKAGES += stripe
-pkg_stripe_name = stripe
-pkg_stripe_description = Erlang interface to the stripe.com API
-pkg_stripe_homepage = https://github.com/mattsta/stripe-erlang
-pkg_stripe_fetch = git
-pkg_stripe_repo = https://github.com/mattsta/stripe-erlang
-pkg_stripe_commit = v1
-
-PACKAGES += supervisor3
-pkg_supervisor3_name = supervisor3
-pkg_supervisor3_description = OTP supervisor with additional strategies
-pkg_supervisor3_homepage = https://github.com/klarna/supervisor3
-pkg_supervisor3_fetch = git
-pkg_supervisor3_repo = https://github.com/klarna/supervisor3.git
-pkg_supervisor3_commit = master
-
-PACKAGES += surrogate
-pkg_surrogate_name = surrogate
-pkg_surrogate_description = Proxy server written in erlang. Supports reverse proxy load balancing and forward proxy with http (including CONNECT), socks4, socks5, and transparent proxy modes.
-pkg_surrogate_homepage = https://github.com/skruger/Surrogate
-pkg_surrogate_fetch = git
-pkg_surrogate_repo = https://github.com/skruger/Surrogate
-pkg_surrogate_commit = master
-
-PACKAGES += swab
-pkg_swab_name = swab
-pkg_swab_description = General purpose buffer handling module
-pkg_swab_homepage = https://github.com/crownedgrouse/swab
-pkg_swab_fetch = git
-pkg_swab_repo = https://github.com/crownedgrouse/swab
-pkg_swab_commit = master
-
-PACKAGES += swarm
-pkg_swarm_name = swarm
-pkg_swarm_description = Fast and simple acceptor pool for Erlang
-pkg_swarm_homepage = https://github.com/jeremey/swarm
-pkg_swarm_fetch = git
-pkg_swarm_repo = https://github.com/jeremey/swarm
-pkg_swarm_commit = master
-
-PACKAGES += switchboard
-pkg_switchboard_name = switchboard
-pkg_switchboard_description = A framework for processing email using worker plugins.
-pkg_switchboard_homepage = https://github.com/thusfresh/switchboard
-pkg_switchboard_fetch = git
-pkg_switchboard_repo = https://github.com/thusfresh/switchboard
-pkg_switchboard_commit = master
-
-PACKAGES += syn
-pkg_syn_name = syn
-pkg_syn_description = A global process registry for Erlang.
-pkg_syn_homepage = https://github.com/ostinelli/syn
-pkg_syn_fetch = git
-pkg_syn_repo = https://github.com/ostinelli/syn
-pkg_syn_commit = master
-
-PACKAGES += sync
-pkg_sync_name = sync
-pkg_sync_description = On-the-fly recompiling and reloading in Erlang.
-pkg_sync_homepage = https://github.com/rustyio/sync
-pkg_sync_fetch = git
-pkg_sync_repo = https://github.com/rustyio/sync
-pkg_sync_commit = master
-
-PACKAGES += syntaxerl
-pkg_syntaxerl_name = syntaxerl
-pkg_syntaxerl_description = Syntax checker for Erlang
-pkg_syntaxerl_homepage = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_fetch = git
-pkg_syntaxerl_repo = https://github.com/ten0s/syntaxerl
-pkg_syntaxerl_commit = master
-
-PACKAGES += syslog
-pkg_syslog_name = syslog
-pkg_syslog_description = Erlang port driver for interacting with syslog via syslog(3)
-pkg_syslog_homepage = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_fetch = git
-pkg_syslog_repo = https://github.com/Vagabond/erlang-syslog
-pkg_syslog_commit = master
-
-PACKAGES += taskforce
-pkg_taskforce_name = taskforce
-pkg_taskforce_description = Erlang worker pools for controlled parallelisation of arbitrary tasks.
-pkg_taskforce_homepage = https://github.com/g-andrade/taskforce
-pkg_taskforce_fetch = git
-pkg_taskforce_repo = https://github.com/g-andrade/taskforce
-pkg_taskforce_commit = master
-
-PACKAGES += tddreloader
-pkg_tddreloader_name = tddreloader
-pkg_tddreloader_description = Shell utility for recompiling, reloading, and testing code as it changes
-pkg_tddreloader_homepage = https://github.com/version2beta/tddreloader
-pkg_tddreloader_fetch = git
-pkg_tddreloader_repo = https://github.com/version2beta/tddreloader
-pkg_tddreloader_commit = master
-
-PACKAGES += tempo
-pkg_tempo_name = tempo
-pkg_tempo_description = NIF-based date and time parsing and formatting for Erlang.
-pkg_tempo_homepage = https://github.com/selectel/tempo
-pkg_tempo_fetch = git
-pkg_tempo_repo = https://github.com/selectel/tempo
-pkg_tempo_commit = master
-
-PACKAGES += ticktick
-pkg_ticktick_name = ticktick
-pkg_ticktick_description = Ticktick is an id generator for message service.
-pkg_ticktick_homepage = https://github.com/ericliang/ticktick
-pkg_ticktick_fetch = git
-pkg_ticktick_repo = https://github.com/ericliang/ticktick
-pkg_ticktick_commit = master
-
-PACKAGES += tinymq
-pkg_tinymq_name = tinymq
-pkg_tinymq_description = TinyMQ - a diminutive, in-memory message queue
-pkg_tinymq_homepage = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_fetch = git
-pkg_tinymq_repo = https://github.com/ChicagoBoss/tinymq
-pkg_tinymq_commit = master
-
-PACKAGES += tinymt
-pkg_tinymt_name = tinymt
-pkg_tinymt_description = TinyMT pseudo random number generator for Erlang.
-pkg_tinymt_homepage = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_fetch = git
-pkg_tinymt_repo = https://github.com/jj1bdx/tinymt-erlang
-pkg_tinymt_commit = master
-
-PACKAGES += tirerl
-pkg_tirerl_name = tirerl
-pkg_tirerl_description = Erlang interface to Elastic Search
-pkg_tirerl_homepage = https://github.com/inaka/tirerl
-pkg_tirerl_fetch = git
-pkg_tirerl_repo = https://github.com/inaka/tirerl
-pkg_tirerl_commit = master
-
-PACKAGES += traffic_tools
-pkg_traffic_tools_name = traffic_tools
-pkg_traffic_tools_description = Simple traffic limiting library
-pkg_traffic_tools_homepage = https://github.com/systra/traffic_tools
-pkg_traffic_tools_fetch = git
-pkg_traffic_tools_repo = https://github.com/systra/traffic_tools
-pkg_traffic_tools_commit = master
-
-PACKAGES += trails
-pkg_trails_name = trails
-pkg_trails_description = A couple of improvements over Cowboy Routes
-pkg_trails_homepage = http://inaka.github.io/cowboy-trails/
-pkg_trails_fetch = git
-pkg_trails_repo = https://github.com/inaka/cowboy-trails
-pkg_trails_commit = master
-
-PACKAGES += trane
-pkg_trane_name = trane
-pkg_trane_description = SAX style broken HTML parser in Erlang
-pkg_trane_homepage = https://github.com/massemanet/trane
-pkg_trane_fetch = git
-pkg_trane_repo = https://github.com/massemanet/trane
-pkg_trane_commit = master
-
-PACKAGES += transit
-pkg_transit_name = transit
-pkg_transit_description = transit format for erlang
-pkg_transit_homepage = https://github.com/isaiah/transit-erlang
-pkg_transit_fetch = git
-pkg_transit_repo = https://github.com/isaiah/transit-erlang
-pkg_transit_commit = master
-
-PACKAGES += trie
-pkg_trie_name = trie
-pkg_trie_description = Erlang Trie Implementation
-pkg_trie_homepage = https://github.com/okeuday/trie
-pkg_trie_fetch = git
-pkg_trie_repo = https://github.com/okeuday/trie
-pkg_trie_commit = master
-
-PACKAGES += triq
-pkg_triq_name = triq
-pkg_triq_description = Trifork QuickCheck
-pkg_triq_homepage = https://github.com/krestenkrab/triq
-pkg_triq_fetch = git
-pkg_triq_repo = https://github.com/krestenkrab/triq
-pkg_triq_commit = master
-
-PACKAGES += tunctl
-pkg_tunctl_name = tunctl
-pkg_tunctl_description = Erlang TUN/TAP interface
-pkg_tunctl_homepage = https://github.com/msantos/tunctl
-pkg_tunctl_fetch = git
-pkg_tunctl_repo = https://github.com/msantos/tunctl
-pkg_tunctl_commit = master
-
-PACKAGES += twerl
-pkg_twerl_name = twerl
-pkg_twerl_description = Erlang client for the Twitter Streaming API
-pkg_twerl_homepage = https://github.com/lucaspiller/twerl
-pkg_twerl_fetch = git
-pkg_twerl_repo = https://github.com/lucaspiller/twerl
-pkg_twerl_commit = oauth
-
-PACKAGES += twitter_erlang
-pkg_twitter_erlang_name = twitter_erlang
-pkg_twitter_erlang_description = An Erlang twitter client
-pkg_twitter_erlang_homepage = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_fetch = git
-pkg_twitter_erlang_repo = https://github.com/ngerakines/erlang_twitter
-pkg_twitter_erlang_commit = master
-
-PACKAGES += ucol_nif
-pkg_ucol_nif_name = ucol_nif
-pkg_ucol_nif_description = ICU based collation Erlang module
-pkg_ucol_nif_homepage = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_fetch = git
-pkg_ucol_nif_repo = https://github.com/refuge/ucol_nif
-pkg_ucol_nif_commit = master
-
-PACKAGES += unicorn
-pkg_unicorn_name = unicorn
-pkg_unicorn_description = Generic configuration server
-pkg_unicorn_homepage = https://github.com/shizzard/unicorn
-pkg_unicorn_fetch = git
-pkg_unicorn_repo = https://github.com/shizzard/unicorn
-pkg_unicorn_commit = 0.3.0
-
-PACKAGES += unsplit
-pkg_unsplit_name = unsplit
-pkg_unsplit_description = Resolves conflicts in Mnesia after network splits
-pkg_unsplit_homepage = https://github.com/uwiger/unsplit
-pkg_unsplit_fetch = git
-pkg_unsplit_repo = https://github.com/uwiger/unsplit
-pkg_unsplit_commit = master
-
-PACKAGES += uuid
-pkg_uuid_name = uuid
-pkg_uuid_description = Erlang UUID Implementation
-pkg_uuid_homepage = https://github.com/okeuday/uuid
-pkg_uuid_fetch = git
-pkg_uuid_repo = https://github.com/okeuday/uuid
-pkg_uuid_commit = v1.4.0
-
-PACKAGES += ux
-pkg_ux_name = ux
-pkg_ux_description = Unicode eXtention for Erlang (Strings, Collation)
-pkg_ux_homepage = https://github.com/erlang-unicode/ux
-pkg_ux_fetch = git
-pkg_ux_repo = https://github.com/erlang-unicode/ux
-pkg_ux_commit = master
-
-PACKAGES += vert
-pkg_vert_name = vert
-pkg_vert_description = Erlang binding to libvirt virtualization API
-pkg_vert_homepage = https://github.com/msantos/erlang-libvirt
-pkg_vert_fetch = git
-pkg_vert_repo = https://github.com/msantos/erlang-libvirt
-pkg_vert_commit = master
-
-PACKAGES += verx
-pkg_verx_name = verx
-pkg_verx_description = Erlang implementation of the libvirtd remote protocol
-pkg_verx_homepage = https://github.com/msantos/verx
-pkg_verx_fetch = git
-pkg_verx_repo = https://github.com/msantos/verx
-pkg_verx_commit = master
-
-PACKAGES += vmq_acl
-pkg_vmq_acl_name = vmq_acl
-pkg_vmq_acl_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_acl_homepage = https://verne.mq/
-pkg_vmq_acl_fetch = git
-pkg_vmq_acl_repo = https://github.com/erlio/vmq_acl
-pkg_vmq_acl_commit = master
-
-PACKAGES += vmq_bridge
-pkg_vmq_bridge_name = vmq_bridge
-pkg_vmq_bridge_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_bridge_homepage = https://verne.mq/
-pkg_vmq_bridge_fetch = git
-pkg_vmq_bridge_repo = https://github.com/erlio/vmq_bridge
-pkg_vmq_bridge_commit = master
-
-PACKAGES += vmq_graphite
-pkg_vmq_graphite_name = vmq_graphite
-pkg_vmq_graphite_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_graphite_homepage = https://verne.mq/
-pkg_vmq_graphite_fetch = git
-pkg_vmq_graphite_repo = https://github.com/erlio/vmq_graphite
-pkg_vmq_graphite_commit = master
-
-PACKAGES += vmq_passwd
-pkg_vmq_passwd_name = vmq_passwd
-pkg_vmq_passwd_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_passwd_homepage = https://verne.mq/
-pkg_vmq_passwd_fetch = git
-pkg_vmq_passwd_repo = https://github.com/erlio/vmq_passwd
-pkg_vmq_passwd_commit = master
-
-PACKAGES += vmq_server
-pkg_vmq_server_name = vmq_server
-pkg_vmq_server_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_server_homepage = https://verne.mq/
-pkg_vmq_server_fetch = git
-pkg_vmq_server_repo = https://github.com/erlio/vmq_server
-pkg_vmq_server_commit = master
-
-PACKAGES += vmq_snmp
-pkg_vmq_snmp_name = vmq_snmp
-pkg_vmq_snmp_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_snmp_homepage = https://verne.mq/
-pkg_vmq_snmp_fetch = git
-pkg_vmq_snmp_repo = https://github.com/erlio/vmq_snmp
-pkg_vmq_snmp_commit = master
-
-PACKAGES += vmq_systree
-pkg_vmq_systree_name = vmq_systree
-pkg_vmq_systree_description = Component of VerneMQ: A distributed MQTT message broker
-pkg_vmq_systree_homepage = https://verne.mq/
-pkg_vmq_systree_fetch = git
-pkg_vmq_systree_repo = https://github.com/erlio/vmq_systree
-pkg_vmq_systree_commit = master
-
-PACKAGES += vmstats
-pkg_vmstats_name = vmstats
-pkg_vmstats_description = tiny Erlang app that works in conjunction with statsderl in order to generate information on the Erlang VM for graphite logs.
-pkg_vmstats_homepage = https://github.com/ferd/vmstats
-pkg_vmstats_fetch = git
-pkg_vmstats_repo = https://github.com/ferd/vmstats
-pkg_vmstats_commit = master
-
-PACKAGES += walrus
-pkg_walrus_name = walrus
-pkg_walrus_description = Walrus - Mustache-like Templating
-pkg_walrus_homepage = https://github.com/devinus/walrus
-pkg_walrus_fetch = git
-pkg_walrus_repo = https://github.com/devinus/walrus
-pkg_walrus_commit = master
-
-PACKAGES += webmachine
-pkg_webmachine_name = webmachine
-pkg_webmachine_description = A REST-based system for building web applications.
-pkg_webmachine_homepage = https://github.com/basho/webmachine
-pkg_webmachine_fetch = git
-pkg_webmachine_repo = https://github.com/basho/webmachine
-pkg_webmachine_commit = master
-
-PACKAGES += websocket_client
-pkg_websocket_client_name = websocket_client
-pkg_websocket_client_description = Erlang websocket client (ws and wss supported)
-pkg_websocket_client_homepage = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_fetch = git
-pkg_websocket_client_repo = https://github.com/jeremyong/websocket_client
-pkg_websocket_client_commit = master
-
-PACKAGES += worker_pool
-pkg_worker_pool_name = worker_pool
-pkg_worker_pool_description = a simple erlang worker pool
-pkg_worker_pool_homepage = https://github.com/inaka/worker_pool
-pkg_worker_pool_fetch = git
-pkg_worker_pool_repo = https://github.com/inaka/worker_pool
-pkg_worker_pool_commit = 1.0.3
-
-PACKAGES += wrangler
-pkg_wrangler_name = wrangler
-pkg_wrangler_description = Import of the Wrangler svn repository.
-pkg_wrangler_homepage = http://www.cs.kent.ac.uk/projects/wrangler/Home.html
-pkg_wrangler_fetch = git
-pkg_wrangler_repo = https://github.com/RefactoringTools/wrangler
-pkg_wrangler_commit = master
-
-PACKAGES += wsock
-pkg_wsock_name = wsock
-pkg_wsock_description = Erlang library to build WebSocket clients and servers
-pkg_wsock_homepage = https://github.com/madtrick/wsock
-pkg_wsock_fetch = git
-pkg_wsock_repo = https://github.com/madtrick/wsock
-pkg_wsock_commit = master
-
-PACKAGES += xhttpc
-pkg_xhttpc_name = xhttpc
-pkg_xhttpc_description = Extensible HTTP Client for Erlang
-pkg_xhttpc_homepage = https://github.com/seriyps/xhttpc
-pkg_xhttpc_fetch = git
-pkg_xhttpc_repo = https://github.com/seriyps/xhttpc
-pkg_xhttpc_commit = master
-
-PACKAGES += xref_runner
-pkg_xref_runner_name = xref_runner
-pkg_xref_runner_description = Erlang Xref Runner (inspired in rebar xref)
-pkg_xref_runner_homepage = https://github.com/inaka/xref_runner
-pkg_xref_runner_fetch = git
-pkg_xref_runner_repo = https://github.com/inaka/xref_runner
-pkg_xref_runner_commit = 0.2.3
-
-PACKAGES += yamerl
-pkg_yamerl_name = yamerl
-pkg_yamerl_description = YAML 1.2 parser in pure Erlang
-pkg_yamerl_homepage = https://github.com/yakaz/yamerl
-pkg_yamerl_fetch = git
-pkg_yamerl_repo = https://github.com/yakaz/yamerl
-pkg_yamerl_commit = master
-
-PACKAGES += yamler
-pkg_yamler_name = yamler
-pkg_yamler_description = libyaml-based yaml loader for Erlang
-pkg_yamler_homepage = https://github.com/goertzenator/yamler
-pkg_yamler_fetch = git
-pkg_yamler_repo = https://github.com/goertzenator/yamler
-pkg_yamler_commit = master
-
-PACKAGES += yaws
-pkg_yaws_name = yaws
-pkg_yaws_description = Yaws webserver
-pkg_yaws_homepage = http://yaws.hyber.org
-pkg_yaws_fetch = git
-pkg_yaws_repo = https://github.com/klacke/yaws
-pkg_yaws_commit = master
-
-PACKAGES += zab_engine
-pkg_zab_engine_name = zab_engine
-pkg_zab_engine_description = zab propotocol implement by erlang
-pkg_zab_engine_homepage = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_fetch = git
-pkg_zab_engine_repo = https://github.com/xinmingyao/zab_engine
-pkg_zab_engine_commit = master
-
-PACKAGES += zeta
-pkg_zeta_name = zeta
-pkg_zeta_description = HTTP access log parser in Erlang
-pkg_zeta_homepage = https://github.com/s1n4/zeta
-pkg_zeta_fetch = git
-pkg_zeta_repo = https://github.com/s1n4/zeta
-pkg_zeta_commit =  
-
-PACKAGES += zippers
-pkg_zippers_name = zippers
-pkg_zippers_description = A library for functional zipper data structures in Erlang. Read more on zippers
-pkg_zippers_homepage = https://github.com/ferd/zippers
-pkg_zippers_fetch = git
-pkg_zippers_repo = https://github.com/ferd/zippers
-pkg_zippers_commit = master
-
-PACKAGES += zlists
-pkg_zlists_name = zlists
-pkg_zlists_description = Erlang lazy lists library.
-pkg_zlists_homepage = https://github.com/vjache/erlang-zlists
-pkg_zlists_fetch = git
-pkg_zlists_repo = https://github.com/vjache/erlang-zlists
-pkg_zlists_commit = master
-
-PACKAGES += zraft_lib
-pkg_zraft_lib_name = zraft_lib
-pkg_zraft_lib_description = Erlang raft consensus protocol implementation
-pkg_zraft_lib_homepage = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_fetch = git
-pkg_zraft_lib_repo = https://github.com/dreyk/zraft_lib
-pkg_zraft_lib_commit = master
-
-PACKAGES += zucchini
-pkg_zucchini_name = zucchini
-pkg_zucchini_description = An Erlang INI parser
-pkg_zucchini_homepage = https://github.com/devinus/zucchini
-pkg_zucchini_fetch = git
-pkg_zucchini_repo = https://github.com/devinus/zucchini
-pkg_zucchini_commit = master
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: search
-
-define pkg_print
-       $(verbose) printf "%s\n" \
-               $(if $(call core_eq,$(1),$(pkg_$(1)_name)),,"Pkg name:    $(1)") \
-               "App name:    $(pkg_$(1)_name)" \
-               "Description: $(pkg_$(1)_description)" \
-               "Home page:   $(pkg_$(1)_homepage)" \
-               "Fetch with:  $(pkg_$(1)_fetch)" \
-               "Repository:  $(pkg_$(1)_repo)" \
-               "Commit:      $(pkg_$(1)_commit)" \
-               ""
-
-endef
-
-search:
-ifdef q
-       $(foreach p,$(PACKAGES), \
-               $(if $(findstring $(call core_lc,$(q)),$(call core_lc,$(pkg_$(p)_name) $(pkg_$(p)_description))), \
-                       $(call pkg_print,$(p))))
-else
-       $(foreach p,$(PACKAGES),$(call pkg_print,$(p)))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-deps
-
-# Configuration.
-
-ifdef OTP_DEPS
-$(warning The variable OTP_DEPS is deprecated in favor of LOCAL_DEPS.)
-endif
-
-IGNORE_DEPS ?=
-export IGNORE_DEPS
-
-APPS_DIR ?= $(CURDIR)/apps
-export APPS_DIR
-
-DEPS_DIR ?= $(CURDIR)/deps
-export DEPS_DIR
-
-REBAR_DEPS_DIR = $(DEPS_DIR)
-export REBAR_DEPS_DIR
-
-dep_name = $(if $(dep_$(1)),$(1),$(if $(pkg_$(1)_name),$(pkg_$(1)_name),$(1)))
-dep_repo = $(patsubst git://github.com/%,https://github.com/%, \
-       $(if $(dep_$(1)),$(word 2,$(dep_$(1))),$(pkg_$(1)_repo)))
-dep_commit = $(if $(dep_$(1)_commit),$(dep_$(1)_commit),$(if $(dep_$(1)),$(word 3,$(dep_$(1))),$(pkg_$(1)_commit)))
-
-ALL_APPS_DIRS = $(if $(wildcard $(APPS_DIR)/),$(filter-out $(APPS_DIR),$(shell find $(APPS_DIR) -maxdepth 1 -type d)))
-ALL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(foreach dep,$(filter-out $(IGNORE_DEPS),$(BUILD_DEPS) $(DEPS)),$(call dep_name,$(dep))))
-
-ifeq ($(filter $(APPS_DIR) $(DEPS_DIR),$(subst :, ,$(ERL_LIBS))),)
-ifeq ($(ERL_LIBS),)
-       ERL_LIBS = $(APPS_DIR):$(DEPS_DIR)
-else
-       ERL_LIBS := $(ERL_LIBS):$(APPS_DIR):$(DEPS_DIR)
-endif
-endif
-export ERL_LIBS
-
-export NO_AUTOPATCH
-
-# Verbosity.
-
-dep_verbose_0 = @echo " DEP   " $(1);
-dep_verbose_2 = set -x;
-dep_verbose = $(dep_verbose_$(V))
-
-# Core targets.
-
-ifneq ($(SKIP_DEPS),)
-deps::
-else
-deps:: $(ALL_DEPS_DIRS)
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/deps.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $(ALL_DEPS_DIRS) ; do \
-               if grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/deps.log; then \
-                       :; \
-               else \
-                       echo $$dep >> $(ERLANG_MK_TMP)/deps.log; \
-                       if [ -f $$dep/GNUmakefile ] || [ -f $$dep/makefile ] || [ -f $$dep/Makefile ]; then \
-                               $(MAKE) -C $$dep IS_DEP=1 || exit $$?; \
-                       else \
-                               echo "Error: No Makefile to build dependency $$dep."; \
-                               exit 2; \
-                       fi \
-               fi \
-       done
-endif
-
-# Deps related targets.
-
-# @todo rename GNUmakefile and makefile into Makefile first, if they exist
-# While Makefile file could be GNUmakefile or makefile,
-# in practice only Makefile is needed so far.
-define dep_autopatch
-       if [ -f $(DEPS_DIR)/$(1)/erlang.mk ]; then \
-               $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-               $(call dep_autopatch_erlang_mk,$(1)); \
-       elif [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               if [ 0 != `grep -c "include ../\w*\.mk" $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ 0 != `grep -ci rebar $(DEPS_DIR)/$(1)/Makefile` ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               elif [ -n "`find $(DEPS_DIR)/$(1)/ -type f -name \*.mk -not -name erlang.mk -exec grep -i rebar '{}' \;`" ]; then \
-                       $(call dep_autopatch2,$(1)); \
-               else \
-                       $(call erlang,$(call dep_autopatch_app.erl,$(1))); \
-               fi \
-       else \
-               if [ ! -d $(DEPS_DIR)/$(1)/src/ ]; then \
-                       $(call dep_autopatch_noop,$(1)); \
-               else \
-                       $(call dep_autopatch2,$(1)); \
-               fi \
-       fi
-endef
-
-define dep_autopatch2
-       if [ -f $(DEPS_DIR)/$1/src/$1.app.src.script ]; then \
-               $(call erlang,$(call dep_autopatch_appsrc_script.erl,$(1))); \
-       fi; \
-       $(call erlang,$(call dep_autopatch_appsrc.erl,$(1))); \
-       if [ -f $(DEPS_DIR)/$(1)/rebar -o -f $(DEPS_DIR)/$(1)/rebar.config -o -f $(DEPS_DIR)/$(1)/rebar.config.script ]; then \
-               $(call dep_autopatch_fetch_rebar); \
-               $(call dep_autopatch_rebar,$(1)); \
-       else \
-               $(call dep_autopatch_gen,$(1)); \
-       fi
-endef
-
-define dep_autopatch_noop
-       printf "noop:\n" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-# Overwrite erlang.mk with the current file by default.
-ifeq ($(NO_AUTOPATCH_ERLANG_MK),)
-define dep_autopatch_erlang_mk
-       echo "include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk" \
-               > $(DEPS_DIR)/$1/erlang.mk
-endef
-else
-define dep_autopatch_erlang_mk
-       :
-endef
-endif
-
-define dep_autopatch_gen
-       printf "%s\n" \
-               "ERLC_OPTS = +debug_info" \
-               "include ../../erlang.mk" > $(DEPS_DIR)/$(1)/Makefile
-endef
-
-define dep_autopatch_fetch_rebar
-       mkdir -p $(ERLANG_MK_TMP); \
-       if [ ! -d $(ERLANG_MK_TMP)/rebar ]; then \
-               git clone -q -n -- https://github.com/rebar/rebar $(ERLANG_MK_TMP)/rebar; \
-               cd $(ERLANG_MK_TMP)/rebar; \
-               git checkout -q 791db716b5a3a7671e0b351f95ddf24b848ee173; \
-               $(MAKE); \
-               cd -; \
-       fi
-endef
-
-define dep_autopatch_rebar
-       if [ -f $(DEPS_DIR)/$(1)/Makefile ]; then \
-               mv $(DEPS_DIR)/$(1)/Makefile $(DEPS_DIR)/$(1)/Makefile.orig.mk; \
-       fi; \
-       $(call erlang,$(call dep_autopatch_rebar.erl,$(1))); \
-       rm -f $(DEPS_DIR)/$(1)/ebin/$(1).app
-endef
-
-define dep_autopatch_rebar.erl
-       application:load(rebar),
-       application:set_env(rebar, log_level, debug),
-       Conf1 = case file:consult("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config)") of
-               {ok, Conf0} -> Conf0;
-               _ -> []
-       end,
-       {Conf, OsEnv} = fun() ->
-               case filelib:is_file("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)") of
-                       false -> {Conf1, []};
-                       true ->
-                               Bindings0 = erl_eval:new_bindings(),
-                               Bindings1 = erl_eval:add_binding('CONFIG', Conf1, Bindings0),
-                               Bindings = erl_eval:add_binding('SCRIPT', "$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings1),
-                               Before = os:getenv(),
-                               {ok, Conf2} = file:script("$(call core_native_path,$(DEPS_DIR)/$1/rebar.config.script)", Bindings),
-                               {Conf2, lists:foldl(fun(E, Acc) -> lists:delete(E, Acc) end, os:getenv(), Before)}
-               end
-       end(),
-       Write = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/Makefile)", Text, [append])
-       end,
-       Escape = fun (Text) ->
-               re:replace(Text, "\\\\$$", "\$$$$", [global, {return, list}])
-       end,
-       Write("IGNORE_DEPS += edown eper eunit_formatters meck node_package "
-               "rebar_lock_deps_plugin rebar_vsn_plugin reltool_util\n"),
-       Write("C_SRC_DIR = /path/do/not/exist\n"),
-       Write("C_SRC_TYPE = rebar\n"),
-       Write("DRV_CFLAGS = -fPIC\nexport DRV_CFLAGS\n"),
-       Write(["ERLANG_ARCH = ", rebar_utils:wordsize(), "\nexport ERLANG_ARCH\n"]),
-       fun() ->
-               Write("ERLC_OPTS = +debug_info\nexport ERLC_OPTS\n"),
-               case lists:keyfind(erl_opts, 1, Conf) of
-                       false -> ok;
-                       {_, ErlOpts} ->
-                               lists:foreach(fun
-                                       ({d, D}) ->
-                                               Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                       ({i, I}) ->
-                                               Write(["ERLC_OPTS += -I ", I, "\n"]);
-                                       ({platform_define, Regex, D}) ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("ERLC_OPTS += -D" ++ atom_to_list(D) ++ "=1\n");
-                                                       false -> ok
-                                               end;
-                                       ({parse_transform, PT}) ->
-                                               Write("ERLC_OPTS += +'{parse_transform, " ++ atom_to_list(PT) ++ "}'\n");
-                                       (_) -> ok
-                               end, ErlOpts)
-               end,
-               Write("\n")
-       end(),
-       fun() ->
-               File = case lists:keyfind(deps, 1, Conf) of
-                       false -> [];
-                       {_, Deps} ->
-                               [begin case case Dep of
-                                                       {N, S} when is_atom(N), is_list(S) -> {N, {hex, S}};
-                                                       {N, S} when is_tuple(S) -> {N, S};
-                                                       {N, _, S} -> {N, S};
-                                                       {N, _, S, _} -> {N, S};
-                                                       _ -> false
-                                               end of
-                                       false -> ok;
-                                       {Name, Source} ->
-                                               {Method, Repo, Commit} = case Source of
-                                                       {hex, V} -> {hex, V, undefined};
-                                                       {git, R} -> {git, R, master};
-                                                       {M, R, {branch, C}} -> {M, R, C};
-                                                       {M, R, {ref, C}} -> {M, R, C};
-                                                       {M, R, {tag, C}} -> {M, R, C};
-                                                       {M, R, C} -> {M, R, C}
-                                               end,
-                                               Write(io_lib:format("DEPS += ~s\ndep_~s = ~s ~s ~s~n", [Name, Name, Method, Repo, Commit]))
-                               end end || Dep <- Deps]
-               end
-       end(),
-       fun() ->
-               case lists:keyfind(erl_first_files, 1, Conf) of
-                       false -> ok;
-                       {_, Files} ->
-                               Names = [[" ", case lists:reverse(F) of
-                                       "lre." ++ Elif -> lists:reverse(Elif);
-                                       Elif -> lists:reverse(Elif)
-                               end] || "src/" ++ F <- Files],
-                               Write(io_lib:format("COMPILE_FIRST +=~s\n", [Names]))
-               end
-       end(),
-       Write("\n\nrebar_dep: preprocess pre-deps deps pre-app app\n"),
-       Write("\npreprocess::\n"),
-       Write("\npre-deps::\n"),
-       Write("\npre-app::\n"),
-       PatchHook = fun(Cmd) ->
-               case Cmd of
-                       "make -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "gmake -C" ++ Cmd1 -> "$$\(MAKE) -C" ++ Escape(Cmd1);
-                       "make " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       "gmake " ++ Cmd1 -> "$$\(MAKE) -f Makefile.orig.mk " ++ Escape(Cmd1);
-                       _ -> Escape(Cmd)
-               end
-       end,
-       fun() ->
-               case lists:keyfind(pre_hooks, 1, Conf) of
-                       false -> ok;
-                       {_, Hooks} ->
-                               [case H of
-                                       {'get-deps', Cmd} ->
-                                               Write("\npre-deps::\n\t" ++ PatchHook(Cmd) ++ "\n");
-                                       {compile, Cmd} ->
-                                               Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                       {Regex, compile, Cmd} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> Write("\npre-app::\n\tCC=$$\(CC) " ++ PatchHook(Cmd) ++ "\n");
-                                                       false -> ok
-                                               end;
-                                       _ -> ok
-                               end || H <- Hooks]
-               end
-       end(),
-       ShellToMk = fun(V) ->
-               re:replace(re:replace(V, "(\\\\$$)(\\\\w*)", "\\\\1(\\\\2)", [global]),
-                       "-Werror\\\\b", "", [{return, list}, global])
-       end,
-       PortSpecs = fun() ->
-               case lists:keyfind(port_specs, 1, Conf) of
-                       false ->
-                               case filelib:is_dir("$(call core_native_path,$(DEPS_DIR)/$1/c_src)") of
-                                       false -> [];
-                                       true ->
-                                               [{"priv/" ++ proplists:get_value(so_name, Conf, "$(1)_drv.so"),
-                                                       proplists:get_value(port_sources, Conf, ["c_src/*.c"]), []}]
-                               end;
-                       {_, Specs} ->
-                               lists:flatten([case S of
-                                       {Output, Input} -> {ShellToMk(Output), Input, []};
-                                       {Regex, Output, Input} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, []};
-                                                       false -> []
-                                               end;
-                                       {Regex, Output, Input, [{env, Env}]} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {ShellToMk(Output), Input, Env};
-                                                       false -> []
-                                               end
-                               end || S <- Specs])
-               end
-       end(),
-       PortSpecWrite = fun (Text) ->
-               file:write_file("$(call core_native_path,$(DEPS_DIR)/$1/c_src/Makefile.erlang.mk)", Text, [append])
-       end,
-       case PortSpecs of
-               [] -> ok;
-               _ ->
-                       Write("\npre-app::\n\t$$\(MAKE) -f c_src/Makefile.erlang.mk\n"),
-                       PortSpecWrite(io_lib:format("ERL_CFLAGS = -finline-functions -Wall -fPIC -I ~s/erts-~s/include -I ~s\n",
-                               [code:root_dir(), erlang:system_info(version), code:lib_dir(erl_interface, include)])),
-                       PortSpecWrite(io_lib:format("ERL_LDFLAGS = -L ~s -lerl_interface -lei\n",
-                               [code:lib_dir(erl_interface, lib)])),
-                       [PortSpecWrite(["\n", E, "\n"]) || E <- OsEnv],
-                       FilterEnv = fun(Env) ->
-                               lists:flatten([case E of
-                                       {_, _} -> E;
-                                       {Regex, K, V} ->
-                                               case rebar_utils:is_arch(Regex) of
-                                                       true -> {K, V};
-                                                       false -> []
-                                               end
-                               end || E <- Env])
-                       end,
-                       MergeEnv = fun(Env) ->
-                               lists:foldl(fun ({K, V}, Acc) ->
-                                       case lists:keyfind(K, 1, Acc) of
-                                               false -> [{K, rebar_utils:expand_env_variable(V, K, "")}|Acc];
-                                               {_, V0} -> [{K, rebar_utils:expand_env_variable(V, K, V0)}|Acc]
-                                       end
-                               end, [], Env)
-                       end,
-                       PortEnv = case lists:keyfind(port_env, 1, Conf) of
-                               false -> [];
-                               {_, PortEnv0} -> FilterEnv(PortEnv0)
-                       end,
-                       PortSpec = fun ({Output, Input0, Env}) ->
-                               filelib:ensure_dir("$(call core_native_path,$(DEPS_DIR)/$1/)" ++ Output),
-                               Input = [[" ", I] || I <- Input0],
-                               PortSpecWrite([
-                                       [["\n", K, " = ", ShellToMk(V)] || {K, V} <- lists:reverse(MergeEnv(PortEnv))],
-                                       case $(PLATFORM) of
-                                               darwin -> "\n\nLDFLAGS += -flat_namespace -undefined suppress";
-                                               _ -> ""
-                                       end,
-                                       "\n\nall:: ", Output, "\n\n",
-                                       "%.o: %.c\n\t$$\(CC) -c -o $$\@ $$\< $$\(CFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.C\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cc\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       "%.o: %.cpp\n\t$$\(CXX) -c -o $$\@ $$\< $$\(CXXFLAGS) $$\(ERL_CFLAGS) $$\(DRV_CFLAGS) $$\(EXE_CFLAGS)\n\n",
-                                       [[Output, ": ", K, " = ", ShellToMk(V), "\n"] || {K, V} <- lists:reverse(MergeEnv(FilterEnv(Env)))],
-                                       Output, ": $$\(foreach ext,.c .C .cc .cpp,",
-                                               "$$\(patsubst %$$\(ext),%.o,$$\(filter %$$\(ext),$$\(wildcard", Input, "))))\n",
-                                       "\t$$\(CC) -o $$\@ $$\? $$\(LDFLAGS) $$\(ERL_LDFLAGS) $$\(DRV_LDFLAGS) $$\(EXE_LDFLAGS)",
-                                       case {filename:extension(Output), $(PLATFORM)} of
-                                           {[], _} -> "\n";
-                                           {_, darwin} -> "\n";
-                                           _ -> " -shared\n"
-                                       end])
-                       end,
-                       [PortSpec(S) || S <- PortSpecs]
-       end,
-       Write("\ninclude $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(DEPS_DIR)/app)/erlang.mk"),
-       RunPlugin = fun(Plugin, Step) ->
-               case erlang:function_exported(Plugin, Step, 2) of
-                       false -> ok;
-                       true ->
-                               c:cd("$(call core_native_path,$(DEPS_DIR)/$1/)"),
-                               Ret = Plugin:Step({config, "", Conf, dict:new(), dict:new(), dict:new(),
-                                       dict:store(base_dir, "", dict:new())}, undefined),
-                               io:format("rebar plugin ~p step ~p ret ~p~n", [Plugin, Step, Ret])
-               end
-       end,
-       fun() ->
-               case lists:keyfind(plugins, 1, Conf) of
-                       false -> ok;
-                       {_, Plugins} ->
-                               [begin
-                                       case lists:keyfind(deps, 1, Conf) of
-                                               false -> ok;
-                                               {_, Deps} ->
-                                                       case lists:keyfind(P, 1, Deps) of
-                                                               false -> ok;
-                                                               _ ->
-                                                                       Path = "$(call core_native_path,$(DEPS_DIR)/)" ++ atom_to_list(P),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C $(call core_native_path,$(DEPS_DIR)/$1) " ++ Path)]),
-                                                                       io:format("~s", [os:cmd("$(MAKE) -C " ++ Path ++ " IS_DEP=1")]),
-                                                                       code:add_patha(Path ++ "/ebin")
-                                                       end
-                                       end
-                               end || P <- Plugins],
-                               [case code:load_file(P) of
-                                       {module, P} -> ok;
-                                       _ ->
-                                               case lists:keyfind(plugin_dir, 1, Conf) of
-                                                       false -> ok;
-                                                       {_, PluginsDir} ->
-                                                               ErlFile = "$(call core_native_path,$(DEPS_DIR)/$1/)" ++ PluginsDir ++ "/" ++ atom_to_list(P) ++ ".erl",
-                                                               {ok, P, Bin} = compile:file(ErlFile, [binary]),
-                                                               {module, P} = code:load_binary(P, ErlFile, Bin)
-                                               end
-                               end || P <- Plugins],
-                               [RunPlugin(P, preprocess) || P <- Plugins],
-                               [RunPlugin(P, pre_compile) || P <- Plugins],
-                               [RunPlugin(P, compile) || P <- Plugins]
-               end
-       end(),
-       halt()
-endef
-
-define dep_autopatch_app.erl
-       UpdateModules = fun(App) ->
-               case filelib:is_regular(App) of
-                       false -> ok;
-                       true ->
-                               {ok, [{application, '$(1)', L0}]} = file:consult(App),
-                               Mods = filelib:fold_files("$(call core_native_path,$(DEPS_DIR)/$1/src)", "\\\\.erl$$", true,
-                                       fun (F, Acc) -> [list_to_atom(filename:rootname(filename:basename(F)))|Acc] end, []),
-                               L = lists:keystore(modules, 1, L0, {modules, Mods}),
-                               ok = file:write_file(App, io_lib:format("~p.~n", [{application, '$(1)', L}]))
-               end
-       end,
-       UpdateModules("$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"),
-       halt()
-endef
-
-define dep_autopatch_appsrc_script.erl
-       AppSrc = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcScript = AppSrc ++ ".script",
-       Bindings = erl_eval:new_bindings(),
-       {ok, Conf} = file:script(AppSrcScript, Bindings),
-       ok = file:write_file(AppSrc, io_lib:format("~p.~n", [Conf])),
-       halt()
-endef
-
-define dep_autopatch_appsrc.erl
-       AppSrcOut = "$(call core_native_path,$(DEPS_DIR)/$1/src/$1.app.src)",
-       AppSrcIn = case filelib:is_regular(AppSrcOut) of false -> "$(call core_native_path,$(DEPS_DIR)/$1/ebin/$1.app)"; true -> AppSrcOut end,
-       case filelib:is_regular(AppSrcIn) of
-               false -> ok;
-               true ->
-                       {ok, [{application, $(1), L0}]} = file:consult(AppSrcIn),
-                       L1 = lists:keystore(modules, 1, L0, {modules, []}),
-                       L2 = case lists:keyfind(vsn, 1, L1) of {_, git} -> lists:keyreplace(vsn, 1, L1, {vsn, "git"}); _ -> L1 end,
-                       L3 = case lists:keyfind(registered, 1, L2) of false -> [{registered, []}|L2]; _ -> L2 end,
-                       ok = file:write_file(AppSrcOut, io_lib:format("~p.~n", [{application, $(1), L3}])),
-                       case AppSrcOut of AppSrcIn -> ok; _ -> ok = file:delete(AppSrcIn) end
-       end,
-       halt()
-endef
-
-define dep_fetch_git
-       git clone -q -n -- $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && git checkout -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_git-submodule
-       git submodule update --init -- $(DEPS_DIR)/$1;
-endef
-
-define dep_fetch_hg
-       hg clone -q -U $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1)); \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && hg update -q $(call dep_commit,$(1));
-endef
-
-define dep_fetch_svn
-       svn checkout -q $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_cp
-       cp -R $(call dep_repo,$(1)) $(DEPS_DIR)/$(call dep_name,$(1));
-endef
-
-define dep_fetch_hex.erl
-       ssl:start(),
-       inets:start(),
-       {ok, {{_, 200, _}, _, Body}} = httpc:request(get,
-               {"https://s3.amazonaws.com/s3.hex.pm/tarballs/$(1)-$(2).tar", []},
-               [], [{body_format, binary}]),
-       {ok, Files} = erl_tar:extract({binary, Body}, [memory]),
-       {_, Source} = lists:keyfind("contents.tar.gz", 1, Files),
-       ok = erl_tar:extract({binary, Source}, [{cwd, "$(call core_native_path,$(DEPS_DIR)/$1)"}, compressed]),
-       halt()
-endef
-
-# Hex only has a package version. No need to look in the Erlang.mk packages.
-define dep_fetch_hex
-       $(call erlang,$(call dep_fetch_hex.erl,$(1),$(strip $(word 2,$(dep_$(1))))));
-endef
-
-define dep_fetch_fail
-       echo "Error: Unknown or invalid dependency: $(1)." >&2; \
-       exit 78;
-endef
-
-# Kept for compatibility purposes with older Erlang.mk configuration.
-define dep_fetch_legacy
-       $(warning WARNING: '$(1)' dependency configuration uses deprecated format.) \
-       git clone -q -n -- $(word 1,$(dep_$(1))) $(DEPS_DIR)/$(1); \
-       cd $(DEPS_DIR)/$(1) && git checkout -q $(if $(word 2,$(dep_$(1))),$(word 2,$(dep_$(1))),master);
-endef
-
-define dep_fetch
-       $(if $(dep_$(1)), \
-               $(if $(dep_fetch_$(word 1,$(dep_$(1)))), \
-                       $(word 1,$(dep_$(1))), \
-                       $(if $(IS_DEP),legacy,fail)), \
-               $(if $(filter $(1),$(PACKAGES)), \
-                       $(pkg_$(1)_fetch), \
-                       fail))
-endef
-
-define dep_target
-$(DEPS_DIR)/$(call dep_name,$1):
-       $(eval DEP_NAME := $(call dep_name,$1))
-       $(eval DEP_STR := $(if $(filter-out $1,$(DEP_NAME)),$1,"$1 ($(DEP_NAME))"))
-       $(verbose) if test -d $(APPS_DIR)/$(DEP_NAME); then \
-               echo "Error: Dependency" $(DEP_STR) "conflicts with application found in $(APPS_DIR)/$(DEP_NAME)."; \
-               exit 17; \
-       fi
-       $(verbose) mkdir -p $(DEPS_DIR)
-       $(dep_verbose) $(call dep_fetch_$(strip $(call dep_fetch,$(1))),$(1))
-       $(verbose) if [ -f $(DEPS_DIR)/$(1)/configure.ac -o -f $(DEPS_DIR)/$(1)/configure.in ] \
-                       && [ ! -f $(DEPS_DIR)/$(1)/configure ]; then \
-               echo " AUTO  " $(1); \
-               cd $(DEPS_DIR)/$(1) && autoreconf -Wall -vif -I m4; \
-       fi
-       - $(verbose) if [ -f $(DEPS_DIR)/$(DEP_NAME)/configure ]; then \
-               echo " CONF  " $(DEP_STR); \
-               cd $(DEPS_DIR)/$(DEP_NAME) && ./configure; \
-       fi
-ifeq ($(filter $(1),$(NO_AUTOPATCH)),)
-       $(verbose) if [ "$(1)" = "amqp_client" -a "$(RABBITMQ_CLIENT_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi; \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-server ]; then \
-                       echo " PATCH  Downloading rabbitmq-server"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-server.git $(DEPS_DIR)/rabbitmq-server; \
-               fi; \
-               ln -s $(DEPS_DIR)/amqp_client/deps/rabbit_common-0.0.0 $(DEPS_DIR)/rabbit_common; \
-       elif [ "$(1)" = "rabbit" -a "$(RABBITMQ_SERVER_PATCH)" ]; then \
-               if [ ! -d $(DEPS_DIR)/rabbitmq-codegen ]; then \
-                       echo " PATCH  Downloading rabbitmq-codegen"; \
-                       git clone https://github.com/rabbitmq/rabbitmq-codegen.git $(DEPS_DIR)/rabbitmq-codegen; \
-               fi \
-       else \
-               $$(call dep_autopatch,$(DEP_NAME)) \
-       fi
-endif
-endef
-
-$(foreach dep,$(BUILD_DEPS) $(DEPS),$(eval $(call dep_target,$(dep))))
-
-ifndef IS_APP
-clean:: clean-apps
-
-clean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep clean IS_APP=1 || exit $$?; \
-       done
-
-distclean:: distclean-apps
-
-distclean-apps:
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep distclean IS_APP=1 || exit $$?; \
-       done
-endif
-
-ifndef SKIP_DEPS
-distclean:: distclean-deps
-
-distclean-deps:
-       $(gen_verbose) rm -rf $(DEPS_DIR)
-endif
-
-# Forward-declare variables used in core/deps-tools.mk. This is required
-# in case plugins use them.
-
-ERLANG_MK_RECURSIVE_DEPS_LIST = $(ERLANG_MK_TMP)/list-deps.log
-ERLANG_MK_RECURSIVE_DOC_DEPS_LIST = $(ERLANG_MK_TMP)/list-doc-deps.log
-ERLANG_MK_RECURSIVE_REL_DEPS_LIST = $(ERLANG_MK_TMP)/list-rel-deps.log
-ERLANG_MK_RECURSIVE_TEST_DEPS_LIST = $(ERLANG_MK_TMP)/list-test-deps.log
-ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST = $(ERLANG_MK_TMP)/list-shell-deps.log
-
-# External plugins.
-
-DEP_PLUGINS ?=
-
-define core_dep_plugin
--include $(DEPS_DIR)/$(1)
-
-$(DEPS_DIR)/$(1): $(DEPS_DIR)/$(2) ;
-endef
-
-$(foreach p,$(DEP_PLUGINS),\
-       $(eval $(if $(findstring /,$p),\
-               $(call core_dep_plugin,$p,$(firstword $(subst /, ,$p))),\
-               $(call core_dep_plugin,$p/plugins.mk,$p))))
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Configuration.
-
-DTL_FULL_PATH ?=
-DTL_PATH ?= templates/
-DTL_SUFFIX ?= _dtl
-
-# Verbosity.
-
-dtl_verbose_0 = @echo " DTL   " $(filter %.dtl,$(?F));
-dtl_verbose = $(dtl_verbose_$(V))
-
-# Core targets.
-
-DTL_FILES = $(sort $(call core_find,$(DTL_PATH),*.dtl))
-
-ifneq ($(DTL_FILES),)
-
-ifdef DTL_FULL_PATH
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(subst /,_,$(DTL_FILES:$(DTL_PATH)%=%))))
-else
-BEAM_FILES += $(addprefix ebin/,$(patsubst %.dtl,%_dtl.beam,$(notdir $(DTL_FILES))))
-endif
-
-ifneq ($(words $(DTL_FILES)),0)
-# Rebuild templates when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change-erlydtl: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(DTL_FILES); \
-       fi
-       @touch $@
-
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change-erlydtl
-endif
-
-define erlydtl_compile.erl
-       [begin
-               Module0 = case "$(strip $(DTL_FULL_PATH))" of
-                       "" ->
-                               filename:basename(F, ".dtl");
-                       _ ->
-                               "$(DTL_PATH)" ++ F2 = filename:rootname(F, ".dtl"),
-                               re:replace(F2, "/",  "_",  [{return, list}, global])
-               end,
-               Module = list_to_atom(string:to_lower(Module0) ++ "$(DTL_SUFFIX)"),
-               case erlydtl:compile(F, Module, [{out_dir, "ebin/"}, return_errors, {doc_root, "templates"}]) of
-                       ok -> ok;
-                       {ok, _} -> ok
-               end
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ebin/$(PROJECT).app:: $(DTL_FILES) | ebin/
-       $(if $(strip $?),\
-               $(dtl_verbose) $(call erlang,$(call erlydtl_compile.erl,$?),-pa ebin/ $(DEPS_DIR)/erlydtl/ebin/))
-
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Verbosity.
-
-proto_verbose_0 = @echo " PROTO " $(filter %.proto,$(?F));
-proto_verbose = $(proto_verbose_$(V))
-
-# Core targets.
-
-define compile_proto
-       $(verbose) mkdir -p ebin/ include/
-       $(proto_verbose) $(call erlang,$(call compile_proto.erl,$(1)))
-       $(proto_verbose) erlc +debug_info -o ebin/ ebin/*.erl
-       $(verbose) rm ebin/*.erl
-endef
-
-define compile_proto.erl
-       [begin
-               Dir = filename:dirname(filename:dirname(F)),
-               protobuffs_compile:generate_source(F,
-                       [{output_include_dir, Dir ++ "/include"},
-                               {output_src_dir, Dir ++ "/ebin"}])
-       end || F <- string:tokens("$(1)", " ")],
-       halt().
-endef
-
-ifneq ($(wildcard src/),)
-ebin/$(PROJECT).app:: $(sort $(call core_find,src/,*.proto))
-       $(if $(strip $?),$(call compile_proto,$?))
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-app
-
-# Configuration.
-
-ERLC_OPTS ?= -Werror +debug_info +warn_export_vars +warn_shadow_vars \
-       +warn_obsolete_guard # +bin_opt_info +warn_export_all +warn_missing_spec
-COMPILE_FIRST ?=
-COMPILE_FIRST_PATHS = $(addprefix src/,$(addsuffix .erl,$(COMPILE_FIRST)))
-ERLC_EXCLUDE ?=
-ERLC_EXCLUDE_PATHS = $(addprefix src/,$(addsuffix .erl,$(ERLC_EXCLUDE)))
-
-ERLC_MIB_OPTS ?=
-COMPILE_MIB_FIRST ?=
-COMPILE_MIB_FIRST_PATHS = $(addprefix mibs/,$(addsuffix .mib,$(COMPILE_MIB_FIRST)))
-
-# Verbosity.
-
-app_verbose_0 = @echo " APP   " $(PROJECT);
-app_verbose_2 = set -x;
-app_verbose = $(app_verbose_$(V))
-
-appsrc_verbose_0 = @echo " APP   " $(PROJECT).app.src;
-appsrc_verbose_2 = set -x;
-appsrc_verbose = $(appsrc_verbose_$(V))
-
-makedep_verbose_0 = @echo " DEPEND" $(PROJECT).d;
-makedep_verbose_2 = set -x;
-makedep_verbose = $(makedep_verbose_$(V))
-
-erlc_verbose_0 = @echo " ERLC  " $(filter-out $(patsubst %,%.erl,$(ERLC_EXCLUDE)),\
-       $(filter %.erl %.core,$(?F)));
-erlc_verbose_2 = set -x;
-erlc_verbose = $(erlc_verbose_$(V))
-
-xyrl_verbose_0 = @echo " XYRL  " $(filter %.xrl %.yrl,$(?F));
-xyrl_verbose_2 = set -x;
-xyrl_verbose = $(xyrl_verbose_$(V))
-
-asn1_verbose_0 = @echo " ASN1  " $(filter %.asn1,$(?F));
-asn1_verbose_2 = set -x;
-asn1_verbose = $(asn1_verbose_$(V))
-
-mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
-mib_verbose_2 = set -x;
-mib_verbose = $(mib_verbose_$(V))
-
-ifneq ($(wildcard src/),)
-
-# Targets.
-
-ifeq ($(wildcard ebin/test),)
-app:: deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-else
-app:: clean deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build
-endif
-
-ifeq ($(wildcard src/$(PROJECT)_app.erl),)
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, []},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]}
-]}.
-endef
-else
-define app_file
-{application, $(PROJECT), [
-       {description, "$(PROJECT_DESCRIPTION)"},
-       {vsn, "$(PROJECT_VERSION)"},$(if $(IS_DEP),
-       {id$(comma)$(space)"$(1)"}$(comma))
-       {modules, [$(call comma_list,$(2))]},
-       {registered, [$(call comma_list,$(PROJECT)_sup $(PROJECT_REGISTERED))]},
-       {applications, [$(call comma_list,kernel stdlib $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS))]},
-       {mod, {$(PROJECT)_app, []}}
-]}.
-endef
-endif
-
-app-build: ebin/$(PROJECT).app
-       $(verbose) :
-
-# Source files.
-
-ERL_FILES = $(sort $(call core_find,src/,*.erl))
-CORE_FILES = $(sort $(call core_find,src/,*.core))
-
-# ASN.1 files.
-
-ifneq ($(wildcard asn1/),)
-ASN1_FILES = $(sort $(call core_find,asn1/,*.asn1))
-ERL_FILES += $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-define compile_asn1
-       $(verbose) mkdir -p include/
-       $(asn1_verbose) erlc -v -I include/ -o asn1/ +noobj $(1)
-       $(verbose) mv asn1/*.erl src/
-       $(verbose) mv asn1/*.hrl include/
-       $(verbose) mv asn1/*.asn1db include/
-endef
-
-$(PROJECT).d:: $(ASN1_FILES)
-       $(if $(strip $?),$(call compile_asn1,$?))
-endif
-
-# SNMP MIB files.
-
-ifneq ($(wildcard mibs/),)
-MIB_FILES = $(sort $(call core_find,mibs/,*.mib))
-
-$(PROJECT).d:: $(COMPILE_MIB_FIRST_PATHS) $(MIB_FILES)
-       $(verbose) mkdir -p include/ priv/mibs/
-       $(mib_verbose) erlc -v $(ERLC_MIB_OPTS) -o priv/mibs/ -I priv/mibs/ $?
-       $(mib_verbose) erlc -o include/ -- $(addprefix priv/mibs/,$(patsubst %.mib,%.bin,$(notdir $?)))
-endif
-
-# Leex and Yecc files.
-
-XRL_FILES = $(sort $(call core_find,src/,*.xrl))
-XRL_ERL_FILES = $(addprefix src/,$(patsubst %.xrl,%.erl,$(notdir $(XRL_FILES))))
-ERL_FILES += $(XRL_ERL_FILES)
-
-YRL_FILES = $(sort $(call core_find,src/,*.yrl))
-YRL_ERL_FILES = $(addprefix src/,$(patsubst %.yrl,%.erl,$(notdir $(YRL_FILES))))
-ERL_FILES += $(YRL_ERL_FILES)
-
-$(PROJECT).d:: $(XRL_FILES) $(YRL_FILES)
-       $(if $(strip $?),$(xyrl_verbose) erlc -v -o src/ $?)
-
-# Erlang and Core Erlang files.
-
-define makedep.erl
-       E = ets:new(makedep, [bag]),
-       G = digraph:new([acyclic]),
-       ErlFiles = lists:usort(string:tokens("$(ERL_FILES)", " ")),
-       Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],
-       Add = fun (Mod, Dep) ->
-               case lists:keyfind(Dep, 1, Modules) of
-                       false -> ok;
-                       {_, DepFile} ->
-                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
-                               ets:insert(E, {ModFile, DepFile}),
-                               digraph:add_vertex(G, Mod),
-                               digraph:add_vertex(G, Dep),
-                               digraph:add_edge(G, Mod, Dep)
-               end
-       end,
-       AddHd = fun (F, Mod, DepFile) ->
-               case file:open(DepFile, [read]) of
-                       {error, enoent} -> ok;
-                       {ok, Fd} ->
-                               F(F, Fd, Mod),
-                               {_, ModFile} = lists:keyfind(Mod, 1, Modules),
-                               ets:insert(E, {ModFile, DepFile})
-               end
-       end,
-       Attr = fun
-               (F, Mod, behavior, Dep) -> Add(Mod, Dep);
-               (F, Mod, behaviour, Dep) -> Add(Mod, Dep);
-               (F, Mod, compile, {parse_transform, Dep}) -> Add(Mod, Dep);
-               (F, Mod, compile, Opts) when is_list(Opts) ->
-                       case proplists:get_value(parse_transform, Opts) of
-                               undefined -> ok;
-                               Dep -> Add(Mod, Dep)
-                       end;
-               (F, Mod, include, Hrl) ->
-                       case filelib:is_file("include/" ++ Hrl) of
-                               true -> AddHd(F, Mod, "include/" ++ Hrl);
-                               false ->
-                                       case filelib:is_file("src/" ++ Hrl) of
-                                               true -> AddHd(F, Mod, "src/" ++ Hrl);
-                                               false -> false
-                                       end
-                       end;
-               (F, Mod, include_lib, "$1/include/" ++ Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
-               (F, Mod, include_lib, Hrl) -> AddHd(F, Mod, "include/" ++ Hrl);
-               (F, Mod, import, {Imp, _}) ->
-                       case filelib:is_file("src/" ++ atom_to_list(Imp) ++ ".erl") of
-                               false -> ok;
-                               true -> Add(Mod, Imp)
-                       end;
-               (_, _, _, _) -> ok
-       end,
-       MakeDepend = fun(F, Fd, Mod) ->
-               case io:parse_erl_form(Fd, undefined) of
-                       {ok, {attribute, _, Key, Value}, _} ->
-                               Attr(F, Mod, Key, Value),
-                               F(F, Fd, Mod);
-                       {eof, _} ->
-                               file:close(Fd);
-                       _ ->
-                               F(F, Fd, Mod)
-               end
-       end,
-       [begin
-               Mod = list_to_atom(filename:basename(F, ".erl")),
-               {ok, Fd} = file:open(F, [read]),
-               MakeDepend(MakeDepend, Fd, Mod)
-       end || F <- ErlFiles],
-       Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))),
-       CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)],
-       ok = file:write_file("$(1)", [
-               [[F, "::", [[" ", D] || D <- Deps], "; @touch \$$@\n"] || {F, Deps} <- Depend],
-               "\nCOMPILE_FIRST +=", [[" ", atom_to_list(CF)] || CF <- CompileFirst], "\n"
-       ]),
-       halt()
-endef
-
-ifeq ($(if $(NO_MAKEDEP),$(wildcard $(PROJECT).d),),)
-$(PROJECT).d:: $(ERL_FILES) $(call core_find,include/,*.hrl) $(MAKEFILE_LIST)
-       $(makedep_verbose) $(call erlang,$(call makedep.erl,$@))
-endif
-
-ifneq ($(words $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES)),0)
-# Rebuild everything when the Makefile changes.
-$(ERLANG_MK_TMP)/last-makefile-change: $(MAKEFILE_LIST)
-       @mkdir -p $(ERLANG_MK_TMP)
-       @if test -f $@; then \
-               touch $(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES); \
-               touch -c $(PROJECT).d; \
-       fi
-       @touch $@
-
-$(ERL_FILES) $(CORE_FILES) $(ASN1_FILES) $(MIB_FILES) $(XRL_FILES) $(YRL_FILES):: $(ERLANG_MK_TMP)/last-makefile-change
-ebin/$(PROJECT).app:: $(ERLANG_MK_TMP)/last-makefile-change
-endif
-
--include $(PROJECT).d
-
-ebin/$(PROJECT).app:: ebin/
-
-ebin/:
-       $(verbose) mkdir -p ebin/
-
-define compile_erl
-       $(erlc_verbose) erlc -v $(if $(IS_DEP),$(filter-out -Werror,$(ERLC_OPTS)),$(ERLC_OPTS)) -o ebin/ \
-               -pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),$(COMPILE_FIRST_PATHS) $(1))
-endef
-
-ebin/$(PROJECT).app:: $(ERL_FILES) $(CORE_FILES) $(wildcard src/$(PROJECT).app.src)
-       $(eval FILES_TO_COMPILE := $(filter-out src/$(PROJECT).app.src,$?))
-       $(if $(strip $(FILES_TO_COMPILE)),$(call compile_erl,$(FILES_TO_COMPILE)))
-       $(eval GITDESCRIBE := $(shell git describe --dirty --abbrev=7 --tags --always --first-parent 2>/dev/null || true))
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename \
-               $(filter-out $(ERLC_EXCLUDE_PATHS),$(ERL_FILES) $(CORE_FILES) $(BEAM_FILES)))))))
-ifeq ($(wildcard src/$(PROJECT).app.src),)
-       $(app_verbose) printf "$(subst $(newline),\n,$(subst ",\",$(call app_file,$(GITDESCRIBE),$(MODULES))))" \
-               > ebin/$(PROJECT).app
-else
-       $(verbose) if [ -z "$$(grep -E '^[^%]*{\s*modules\s*,' src/$(PROJECT).app.src)" ]; then \
-               echo "Empty modules entry not found in $(PROJECT).app.src. Please consult the erlang.mk README for instructions." >&2; \
-               exit 1; \
-       fi
-       $(appsrc_verbose) cat src/$(PROJECT).app.src \
-               | sed "s/{[[:space:]]*modules[[:space:]]*,[[:space:]]*\[\]}/{modules, \[$(call comma_list,$(MODULES))\]}/" \
-               | sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
-               > ebin/$(PROJECT).app
-endif
-
-clean:: clean-app
-
-clean-app:
-       $(gen_verbose) rm -rf $(PROJECT).d ebin/ priv/mibs/ $(XRL_ERL_FILES) $(YRL_ERL_FILES) \
-               $(addprefix include/,$(patsubst %.mib,%.hrl,$(notdir $(MIB_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.hrl,$(notdir $(ASN1_FILES)))) \
-               $(addprefix include/,$(patsubst %.asn1,%.asn1db,$(notdir $(ASN1_FILES)))) \
-               $(addprefix src/,$(patsubst %.asn1,%.erl,$(notdir $(ASN1_FILES))))
-
-endif
-
-# Copyright (c) 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: docs-deps
-
-# Configuration.
-
-ALL_DOC_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(DOC_DEPS))
-
-# Targets.
-
-$(foreach dep,$(DOC_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-doc-deps:
-else
-doc-deps: $(ALL_DOC_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_DOC_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rel-deps
-
-# Configuration.
-
-ALL_REL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(REL_DEPS))
-
-# Targets.
-
-$(foreach dep,$(REL_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-rel-deps:
-else
-rel-deps: $(ALL_REL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_REL_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: test-deps test-dir test-build clean-test-dir
-
-# Configuration.
-
-TEST_DIR ?= $(CURDIR)/test
-
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1
-
-# Targets.
-
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-ifneq ($(SKIP_DEPS),)
-test-deps:
-else
-test-deps: $(ALL_TEST_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep IS_DEP=1; done
-endif
-
-ifneq ($(wildcard $(TEST_DIR)),)
-test-dir:
-       $(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
-               $(call core_find,$(TEST_DIR)/,*.erl) -pa ebin/
-endif
-
-ifeq ($(wildcard src),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps
-       $(verbose) $(MAKE) --no-print-directory test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-else
-ifeq ($(wildcard ebin/test),)
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: clean deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-       $(gen_verbose) touch ebin/test
-else
-test-build:: ERLC_OPTS=$(TEST_ERLC_OPTS)
-test-build:: deps test-deps $(PROJECT).d
-       $(verbose) $(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
-endif
-
-clean:: clean-test-dir
-
-clean-test-dir:
-ifneq ($(wildcard $(TEST_DIR)/*.beam),)
-       $(gen_verbose) rm -f $(TEST_DIR)/*.beam
-endif
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: rebar.config
-
-# We strip out -Werror because we don't want to fail due to
-# warnings when used as a dependency.
-
-compat_prepare_erlc_opts = $(shell echo "$1" | sed 's/, */,/')
-
-define compat_convert_erlc_opts
-$(if $(filter-out -Werror,$1),\
-       $(if $(findstring +,$1),\
-               $(shell echo $1 | cut -b 2-)))
-endef
-
-define compat_erlc_opts_to_list
-       [$(call comma_list,$(foreach o,$(call compat_prepare_erlc_opts,$1),$(call compat_convert_erlc_opts,$o)))]
-endef
-
-define compat_rebar_config
-{deps, [$(call comma_list,$(foreach d,$(DEPS),\
-       {$(call dep_name,$d),".*",{git,"$(call dep_repo,$d)","$(call dep_commit,$d)"}}))]}.
-{erl_opts, $(call compat_erlc_opts_to_list,$(ERLC_OPTS))}.
-endef
-
-$(eval _compat_rebar_config = $$(compat_rebar_config))
-$(eval export _compat_rebar_config)
-
-rebar.config:
-       $(gen_verbose) echo "$${_compat_rebar_config}" > rebar.config
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: asciidoc asciidoc-guide asciidoc-manual install-asciidoc distclean-asciidoc
-
-MAN_INSTALL_PATH ?= /usr/local/share/man
-MAN_SECTIONS ?= 3 7
-
-docs:: asciidoc
-
-asciidoc: asciidoc-guide asciidoc-manual
-
-ifeq ($(wildcard doc/src/guide/book.asciidoc),)
-asciidoc-guide:
-else
-asciidoc-guide: distclean-asciidoc doc-deps
-       a2x -v -f pdf doc/src/guide/book.asciidoc && mv doc/src/guide/book.pdf doc/guide.pdf
-       a2x -v -f chunked doc/src/guide/book.asciidoc && mv doc/src/guide/book.chunked/ doc/html/
-endif
-
-ifeq ($(wildcard doc/src/manual/*.asciidoc),)
-asciidoc-manual:
-else
-asciidoc-manual: distclean-asciidoc doc-deps
-       for f in doc/src/manual/*.asciidoc ; do \
-               a2x -v -f manpage $$f ; \
-       done
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p doc/man$$s/ ; \
-               mv doc/src/manual/*.$$s doc/man$$s/ ; \
-               gzip doc/man$$s/*.$$s ; \
-       done
-
-install-docs:: install-asciidoc
-
-install-asciidoc: asciidoc-manual
-       for s in $(MAN_SECTIONS); do \
-               mkdir -p $(MAN_INSTALL_PATH)/man$$s/ ; \
-               install -g `id -u` -o `id -g` -m 0644 doc/man$$s/*.gz $(MAN_INSTALL_PATH)/man$$s/ ; \
-       done
-endif
-
-distclean:: distclean-asciidoc
-
-distclean-asciidoc:
-       $(gen_verbose) rm -rf doc/html/ doc/guide.pdf doc/man3/ doc/man7/
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: bootstrap bootstrap-lib bootstrap-rel new list-templates
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Bootstrap targets:" \
-               "  bootstrap          Generate a skeleton of an OTP application" \
-               "  bootstrap-lib      Generate a skeleton of an OTP library" \
-               "  bootstrap-rel      Generate the files needed to build a release" \
-               "  new-app n=NAME     Create a new local OTP application NAME" \
-               "  new-lib n=NAME     Create a new local OTP library NAME" \
-               "  new t=TPL n=NAME   Generate a module NAME based on the template TPL" \
-               "  new t=T n=N in=APP Generate a module NAME based on the template TPL in APP" \
-               "  list-templates     List available templates"
-
-# Bootstrap templates.
-
-define bs_appsrc
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]},
-       {mod, {$p_app, []}},
-       {env, []}
-]}.
-endef
-
-define bs_appsrc_lib
-{application, $p, [
-       {description, ""},
-       {vsn, "0.1.0"},
-       {id, "git"},
-       {modules, []},
-       {registered, []},
-       {applications, [
-               kernel,
-               stdlib
-       ]}
-]}.
-endef
-
-# To prevent autocompletion issues with ZSH, we add "include erlang.mk"
-# separately during the actual bootstrap.
-ifdef SP
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-# Whitespace to be used when creating files from templates.
-SP = $(SP)
-
-endef
-else
-define bs_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-endef
-endif
-
-define bs_apps_Makefile
-PROJECT = $p
-PROJECT_DESCRIPTION = New project
-PROJECT_VERSION = 0.0.1
-
-include $(call core_relpath,$(dir $(ERLANG_MK_FILENAME)),$(APPS_DIR)/app)/erlang.mk
-endef
-
-define bs_app
--module($p_app).
--behaviour(application).
-
--export([start/2]).
--export([stop/1]).
-
-start(_Type, _Args) ->
-       $p_sup:start_link().
-
-stop(_State) ->
-       ok.
-endef
-
-define bs_relx_config
-{release, {$p_release, "1"}, [$p]}.
-{extended_start_script, true}.
-{sys_config, "rel/sys.config"}.
-{vm_args, "rel/vm.args"}.
-endef
-
-define bs_sys_config
-[
-].
-endef
-
-define bs_vm_args
--name $p@127.0.0.1
--setcookie $p
--heart
-endef
-
-# Normal templates.
-
-define tpl_supervisor
--module($(n)).
--behaviour(supervisor).
-
--export([start_link/0]).
--export([init/1]).
-
-start_link() ->
-       supervisor:start_link({local, ?MODULE}, ?MODULE, []).
-
-init([]) ->
-       Procs = [],
-       {ok, {{one_for_one, 1, 5}, Procs}}.
-endef
-
-define tpl_gen_server
--module($(n)).
--behaviour(gen_server).
-
-%% API.
--export([start_link/0]).
-
-%% gen_server.
--export([init/1]).
--export([handle_call/3]).
--export([handle_cast/2]).
--export([handle_info/2]).
--export([terminate/2]).
--export([code_change/3]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_server:start_link(?MODULE, [], []).
-
-%% gen_server.
-
-init([]) ->
-       {ok, #state{}}.
-
-handle_call(_Request, _From, State) ->
-       {reply, ignored, State}.
-
-handle_cast(_Msg, State) ->
-       {noreply, State}.
-
-handle_info(_Info, State) ->
-       {noreply, State}.
-
-terminate(_Reason, _State) ->
-       ok.
-
-code_change(_OldVsn, State, _Extra) ->
-       {ok, State}.
-endef
-
-define tpl_cowboy_http
--module($(n)).
--behaviour(cowboy_http_handler).
-
--export([init/3]).
--export([handle/2]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {ok, Req, #state{}}.
-
-handle(Req, State=#state{}) ->
-       {ok, Req2} = cowboy_req:reply(200, Req),
-       {ok, Req2, State}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_gen_fsm
--module($(n)).
--behaviour(gen_fsm).
-
-%% API.
--export([start_link/0]).
-
-%% gen_fsm.
--export([init/1]).
--export([state_name/2]).
--export([handle_event/3]).
--export([state_name/3]).
--export([handle_sync_event/4]).
--export([handle_info/3]).
--export([terminate/3]).
--export([code_change/4]).
-
--record(state, {
-}).
-
-%% API.
-
--spec start_link() -> {ok, pid()}.
-start_link() ->
-       gen_fsm:start_link(?MODULE, [], []).
-
-%% gen_fsm.
-
-init([]) ->
-       {ok, state_name, #state{}}.
-
-state_name(_Event, StateData) ->
-       {next_state, state_name, StateData}.
-
-handle_event(_Event, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-state_name(_Event, _From, StateData) ->
-       {reply, ignored, state_name, StateData}.
-
-handle_sync_event(_Event, _From, StateName, StateData) ->
-       {reply, ignored, StateName, StateData}.
-
-handle_info(_Info, StateName, StateData) ->
-       {next_state, StateName, StateData}.
-
-terminate(_Reason, _StateName, _StateData) ->
-       ok.
-
-code_change(_OldVsn, StateName, StateData, _Extra) ->
-       {ok, StateName, StateData}.
-endef
-
-define tpl_cowboy_loop
--module($(n)).
--behaviour(cowboy_loop_handler).
-
--export([init/3]).
--export([info/3]).
--export([terminate/3]).
-
--record(state, {
-}).
-
-init(_, Req, _Opts) ->
-       {loop, Req, #state{}, 5000, hibernate}.
-
-info(_Info, Req, State) ->
-       {loop, Req, State, hibernate}.
-
-terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_cowboy_rest
--module($(n)).
-
--export([init/3]).
--export([content_types_provided/2]).
--export([get_html/2]).
-
-init(_, _Req, _Opts) ->
-       {upgrade, protocol, cowboy_rest}.
-
-content_types_provided(Req, State) ->
-       {[{{<<"text">>, <<"html">>, '*'}, get_html}], Req, State}.
-
-get_html(Req, State) ->
-       {<<"<html><body>This is REST!</body></html>">>, Req, State}.
-endef
-
-define tpl_cowboy_ws
--module($(n)).
--behaviour(cowboy_websocket_handler).
-
--export([init/3]).
--export([websocket_init/3]).
--export([websocket_handle/3]).
--export([websocket_info/3]).
--export([websocket_terminate/3]).
-
--record(state, {
-}).
-
-init(_, _, _) ->
-       {upgrade, protocol, cowboy_websocket}.
-
-websocket_init(_, Req, _Opts) ->
-       Req2 = cowboy_req:compact(Req),
-       {ok, Req2, #state{}}.
-
-websocket_handle({text, Data}, Req, State) ->
-       {reply, {text, Data}, Req, State};
-websocket_handle({binary, Data}, Req, State) ->
-       {reply, {binary, Data}, Req, State};
-websocket_handle(_Frame, Req, State) ->
-       {ok, Req, State}.
-
-websocket_info(_Info, Req, State) ->
-       {ok, Req, State}.
-
-websocket_terminate(_Reason, _Req, _State) ->
-       ok.
-endef
-
-define tpl_ranch_protocol
--module($(n)).
--behaviour(ranch_protocol).
-
--export([start_link/4]).
--export([init/4]).
-
--type opts() :: [].
--export_type([opts/0]).
-
--record(state, {
-       socket :: inet:socket(),
-       transport :: module()
-}).
-
-start_link(Ref, Socket, Transport, Opts) ->
-       Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
-       {ok, Pid}.
-
--spec init(ranch:ref(), inet:socket(), module(), opts()) -> ok.
-init(Ref, Socket, Transport, _Opts) ->
-       ok = ranch:accept_ack(Ref),
-       loop(#state{socket=Socket, transport=Transport}).
-
-loop(State) ->
-       loop(State).
-endef
-
-# Plugin-specific targets.
-
-define render_template
-       $(verbose) printf -- '$(subst $(newline),\n,$(subst %,%%,$(subst ','\'',$(subst $(tab),$(WS),$(call $(1))))))\n' > $(2)
-endef
-
-ifndef WS
-ifdef SP
-WS = $(subst a,,a $(wordlist 1,$(SP),a a a a a a a a a a a a a a a a a a a a))
-else
-WS = $(tab)
-endif
-endif
-
-bootstrap:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(eval n := $(PROJECT)_sup)
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) echo "include erlang.mk" >> Makefile
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc,src/$(PROJECT).app.src)
-endif
-       $(call render_template,bs_app,src/$(PROJECT)_app.erl)
-       $(call render_template,tpl_supervisor,src/$(PROJECT)_sup.erl)
-
-bootstrap-lib:
-ifneq ($(wildcard src/),)
-       $(error Error: src/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_Makefile,Makefile)
-       $(verbose) echo "include erlang.mk" >> Makefile
-       $(verbose) mkdir src/
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,src/$(PROJECT).app.src)
-endif
-
-bootstrap-rel:
-ifneq ($(wildcard relx.config),)
-       $(error Error: relx.config already exists)
-endif
-ifneq ($(wildcard rel/),)
-       $(error Error: rel/ directory already exists)
-endif
-       $(eval p := $(PROJECT))
-       $(call render_template,bs_relx_config,relx.config)
-       $(verbose) mkdir rel/
-       $(call render_template,bs_sys_config,rel/sys.config)
-       $(call render_template,bs_vm_args,rel/vm.args)
-
-new-app:
-ifndef in
-       $(error Usage: $(MAKE) new-app in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(eval n := $(in)_sup)
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-       $(call render_template,bs_app,$(APPS_DIR)/$p/src/$p_app.erl)
-       $(call render_template,tpl_supervisor,$(APPS_DIR)/$p/src/$p_sup.erl)
-
-new-lib:
-ifndef in
-       $(error Usage: $(MAKE) new-lib in=APP)
-endif
-ifneq ($(wildcard $(APPS_DIR)/$in),)
-       $(error Error: Application $in already exists)
-endif
-       $(eval p := $(in))
-       $(verbose) mkdir -p $(APPS_DIR)/$p/src/
-       $(call render_template,bs_apps_Makefile,$(APPS_DIR)/$p/Makefile)
-ifdef LEGACY
-       $(call render_template,bs_appsrc_lib,$(APPS_DIR)/$p/src/$p.app.src)
-endif
-
-new:
-ifeq ($(wildcard src/)$(in),)
-       $(error Error: src/ directory does not exist)
-endif
-ifndef t
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifndef tpl_$(t)
-       $(error Unknown template)
-endif
-ifndef n
-       $(error Usage: $(MAKE) new t=TEMPLATE n=NAME [in=APP])
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new t=$t n=$n in=
-else
-       $(call render_template,tpl_$(t),src/$(n).erl)
-endif
-
-list-templates:
-       $(verbose) echo Available templates: $(sort $(patsubst tpl_%,%,$(filter tpl_%,$(.VARIABLES))))
-
-# Copyright (c) 2014-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: clean-c_src distclean-c_src-env
-
-# Configuration.
-
-C_SRC_DIR ?= $(CURDIR)/c_src
-C_SRC_ENV ?= $(C_SRC_DIR)/env.mk
-C_SRC_OUTPUT ?= $(CURDIR)/priv/$(PROJECT)
-C_SRC_TYPE ?= shared
-
-# System type and C compiler/flags.
-
-ifeq ($(PLATFORM),msys2)
-       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?= .exe
-       C_SRC_OUTPUT_SHARED_EXTENSION ?= .dll
-else
-       C_SRC_OUTPUT_EXECUTABLE_EXTENSION ?=
-       C_SRC_OUTPUT_SHARED_EXTENSION ?= .so
-endif
-
-ifeq ($(C_SRC_TYPE),shared)
-       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_SHARED_EXTENSION)
-else
-       C_SRC_OUTPUT_FILE = $(C_SRC_OUTPUT)$(C_SRC_OUTPUT_EXECUTABLE_EXTENSION)
-endif
-
-ifeq ($(PLATFORM),msys2)
-# We hardcode the compiler used on MSYS2. The default CC=cc does
-# not produce working code. The "gcc" MSYS2 package also doesn't.
-       CC = /mingw64/bin/gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),darwin)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -arch x86_64 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -arch x86_64 -finline-functions -Wall
-       LDFLAGS ?= -arch x86_64 -flat_namespace -undefined suppress
-else ifeq ($(PLATFORM),freebsd)
-       CC ?= cc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-else ifeq ($(PLATFORM),linux)
-       CC ?= gcc
-       CFLAGS ?= -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes
-       CXXFLAGS ?= -O3 -finline-functions -Wall
-endif
-
-ifneq ($(PLATFORM),msys2)
-       CFLAGS += -fPIC
-       CXXFLAGS += -fPIC
-endif
-
-CFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
-CXXFLAGS += -I"$(ERTS_INCLUDE_DIR)" -I"$(ERL_INTERFACE_INCLUDE_DIR)"
-
-LDLIBS += -L"$(ERL_INTERFACE_LIB_DIR)" -lerl_interface -lei
-
-# Verbosity.
-
-c_verbose_0 = @echo " C     " $(?F);
-c_verbose = $(c_verbose_$(V))
-
-cpp_verbose_0 = @echo " CPP   " $(?F);
-cpp_verbose = $(cpp_verbose_$(V))
-
-link_verbose_0 = @echo " LD    " $(@F);
-link_verbose = $(link_verbose_$(V))
-
-# Targets.
-
-ifeq ($(wildcard $(C_SRC_DIR)),)
-else ifneq ($(wildcard $(C_SRC_DIR)/Makefile),)
-app:: app-c_src
-
-test-build:: app-c_src
-
-app-c_src:
-       $(MAKE) -C $(C_SRC_DIR)
-
-clean::
-       $(MAKE) -C $(C_SRC_DIR) clean
-
-else
-
-ifeq ($(SOURCES),)
-SOURCES := $(sort $(foreach pat,*.c *.C *.cc *.cpp,$(call core_find,$(C_SRC_DIR)/,$(pat))))
-endif
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-
-COMPILE_C = $(c_verbose) $(CC) $(CFLAGS) $(CPPFLAGS) -c
-COMPILE_CPP = $(cpp_verbose) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c
-
-app:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
-
-test-build:: $(C_SRC_ENV) $(C_SRC_OUTPUT_FILE)
-
-$(C_SRC_OUTPUT_FILE): $(OBJECTS)
-       $(verbose) mkdir -p priv/
-       $(link_verbose) $(CC) $(OBJECTS) \
-               $(LDFLAGS) $(if $(filter $(C_SRC_TYPE),shared),-shared) $(LDLIBS) \
-               -o $(C_SRC_OUTPUT_FILE)
-
-%.o: %.c
-       $(COMPILE_C) $(OUTPUT_OPTION) $<
-
-%.o: %.cc
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.C
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-%.o: %.cpp
-       $(COMPILE_CPP) $(OUTPUT_OPTION) $<
-
-clean:: clean-c_src
-
-clean-c_src:
-       $(gen_verbose) rm -f $(C_SRC_OUTPUT_FILE) $(OBJECTS)
-
-endif
-
-ifneq ($(wildcard $(C_SRC_DIR)),)
-$(C_SRC_ENV):
-       $(verbose) $(ERL) -eval "file:write_file(\"$(call core_native_path,$(C_SRC_ENV))\", \
-               io_lib:format( \
-                       \"ERTS_INCLUDE_DIR ?= ~s/erts-~s/include/~n\" \
-                       \"ERL_INTERFACE_INCLUDE_DIR ?= ~s~n\" \
-                       \"ERL_INTERFACE_LIB_DIR ?= ~s~n\", \
-                       [code:root_dir(), erlang:system_info(version), \
-                       code:lib_dir(erl_interface, include), \
-                       code:lib_dir(erl_interface, lib)])), \
-               halt()."
-
-distclean:: distclean-c_src-env
-
-distclean-c_src-env:
-       $(gen_verbose) rm -f $(C_SRC_ENV)
-
--include $(C_SRC_ENV)
-endif
-
-# Templates.
-
-define bs_c_nif
-#include "erl_nif.h"
-
-static int loads = 0;
-
-static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
-{
-       /* Initialize private data. */
-       *priv_data = NULL;
-
-       loads++;
-
-       return 0;
-}
-
-static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
-{
-       /* Convert the private data to the new version. */
-       *priv_data = *old_priv_data;
-
-       loads++;
-
-       return 0;
-}
-
-static void unload(ErlNifEnv* env, void* priv_data)
-{
-       if (loads == 1) {
-               /* Destroy the private data. */
-       }
-
-       loads--;
-}
-
-static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
-       if (enif_is_atom(env, argv[0])) {
-               return enif_make_tuple2(env,
-                       enif_make_atom(env, "hello"),
-                       argv[0]);
-       }
-
-       return enif_make_tuple2(env,
-               enif_make_atom(env, "error"),
-               enif_make_atom(env, "badarg"));
-}
-
-static ErlNifFunc nif_funcs[] = {
-       {"hello", 1, hello}
-};
-
-ERL_NIF_INIT($n, nif_funcs, load, NULL, upgrade, unload)
-endef
-
-define bs_erl_nif
--module($n).
-
--export([hello/1]).
-
--on_load(on_load/0).
-on_load() ->
-       PrivDir = case code:priv_dir(?MODULE) of
-               {error, _} ->
-                       AppPath = filename:dirname(filename:dirname(code:which(?MODULE))),
-                       filename:join(AppPath, "priv");
-               Path ->
-                       Path
-       end,
-       erlang:load_nif(filename:join(PrivDir, atom_to_list(?MODULE)), 0).
-
-hello(_) ->
-       erlang:nif_error({not_loaded, ?MODULE}).
-endef
-
-new-nif:
-ifneq ($(wildcard $(C_SRC_DIR)/$n.c),)
-       $(error Error: $(C_SRC_DIR)/$n.c already exists)
-endif
-ifneq ($(wildcard src/$n.erl),)
-       $(error Error: src/$n.erl already exists)
-endif
-ifdef in
-       $(verbose) $(MAKE) -C $(APPS_DIR)/$(in)/ new-nif n=$n in=
-else
-       $(verbose) mkdir -p $(C_SRC_DIR) src/
-       $(call render_template,bs_c_nif,$(C_SRC_DIR)/$n.c)
-       $(call render_template,bs_erl_nif,src/$n.erl)
-endif
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ci ci-setup distclean-kerl
-
-KERL ?= $(CURDIR)/kerl
-export KERL
-
-KERL_URL ?= https://raw.githubusercontent.com/yrashk/kerl/master/kerl
-
-OTP_GIT ?= https://github.com/erlang/otp
-
-CI_INSTALL_DIR ?= $(HOME)/erlang
-CI_OTP ?=
-
-ifeq ($(strip $(CI_OTP)),)
-ci::
-else
-ci:: $(addprefix ci-,$(CI_OTP))
-
-ci-prepare: $(addprefix $(CI_INSTALL_DIR)/,$(CI_OTP))
-
-ci-setup::
-
-ci_verbose_0 = @echo " CI    " $(1);
-ci_verbose = $(ci_verbose_$(V))
-
-define ci_target
-ci-$(1): $(CI_INSTALL_DIR)/$(1)
-       $(ci_verbose) \
-               PATH="$(CI_INSTALL_DIR)/$(1)/bin:$(PATH)" \
-               CI_OTP_RELEASE="$(1)" \
-               CT_OPTS="-label $(1)" \
-               $(MAKE) clean ci-setup tests
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_target,$(otp))))
-
-define ci_otp_target
-ifeq ($(wildcard $(CI_INSTALL_DIR)/$(1)),)
-$(CI_INSTALL_DIR)/$(1): $(KERL)
-       $(KERL) build git $(OTP_GIT) $(1) $(1)
-       $(KERL) install $(1) $(CI_INSTALL_DIR)/$(1)
-endif
-endef
-
-$(foreach otp,$(CI_OTP),$(eval $(call ci_otp_target,$(otp))))
-
-$(KERL):
-       $(gen_verbose) $(call core_http_get,$(KERL),$(KERL_URL))
-       $(verbose) chmod +x $(KERL)
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Continuous Integration targets:" \
-               "  ci          Run '$(MAKE) tests' on all configured Erlang versions." \
-               "" \
-               "The CI_OTP variable must be defined with the Erlang versions" \
-               "that must be tested. For example: CI_OTP = OTP-17.3.4 OTP-17.5.3"
-
-distclean:: distclean-kerl
-
-distclean-kerl:
-       $(gen_verbose) rm -rf $(KERL)
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: ct apps-ct distclean-ct
-
-# Configuration.
-
-CT_OPTS ?=
-ifneq ($(wildcard $(TEST_DIR)),)
-       CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(notdir $(call core_find,$(TEST_DIR)/,*_SUITE.erl))))
-else
-       CT_SUITES ?=
-endif
-
-# Core targets.
-
-tests:: ct
-
-distclean:: distclean-ct
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Common_test targets:" \
-               "  ct          Run all the common_test suites for this project" \
-               "" \
-               "All your common_test suites have their associated targets." \
-               "A suite named http_SUITE can be ran using the ct-http target."
-
-# Plugin-specific targets.
-
-CT_RUN = ct_run \
-       -no_auto_compile \
-       -noinput \
-       -pa $(CURDIR)/ebin $(DEPS_DIR)/*/ebin $(TEST_DIR) \
-       -dir $(TEST_DIR) \
-       -logdir $(CURDIR)/logs
-
-ifeq ($(CT_SUITES),)
-ct: $(if $(IS_APP),,apps-ct)
-else
-ct: test-build $(if $(IS_APP),,apps-ct)
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
-endif
-
-ifneq ($(ALL_APPS_DIRS),)
-apps-ct:
-       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app ct IS_APP=1; done
-endif
-
-ifndef t
-CT_EXTRA =
-else
-ifeq (,$(findstring :,$t))
-CT_EXTRA = -group $t
-else
-t_words = $(subst :, ,$t)
-CT_EXTRA = -group $(firstword $(t_words)) -case $(lastword $(t_words))
-endif
-endif
-
-define ct_suite_target
-ct-$(1): test-build
-       $(verbose) mkdir -p $(CURDIR)/logs/
-       $(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_EXTRA) $(CT_OPTS)
-endef
-
-$(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
-
-distclean-ct:
-       $(gen_verbose) rm -rf $(CURDIR)/logs/
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: plt distclean-plt dialyze
-
-# Configuration.
-
-DIALYZER_PLT ?= $(CURDIR)/.$(PROJECT).plt
-export DIALYZER_PLT
-
-PLT_APPS ?=
-DIALYZER_DIRS ?= --src -r $(wildcard src) $(ALL_APPS_DIRS)
-DIALYZER_OPTS ?= -Werror_handling -Wrace_conditions -Wunmatched_returns # -Wunderspecs
-
-# Core targets.
-
-check:: dialyze
-
-distclean:: distclean-plt
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Dialyzer targets:" \
-               "  plt         Build a PLT file for this project" \
-               "  dialyze     Analyze the project using Dialyzer"
-
-# Plugin-specific targets.
-
-define filter_opts.erl
-       Opts = binary:split(<<"$1">>, <<"-">>, [global]),
-       Filtered = lists:reverse(lists:foldl(fun
-               (O = <<"pa ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"D ", _/bits>>, Acc) -> [O|Acc];
-               (O = <<"I ", _/bits>>, Acc) -> [O|Acc];
-               (_, Acc) -> Acc
-       end, [], Opts)),
-       io:format("~s~n", [[["-", O] || O <- Filtered]]),
-       halt().
-endef
-
-$(DIALYZER_PLT): deps app
-       $(verbose) dialyzer --build_plt --apps erts kernel stdlib $(PLT_APPS) $(OTP_DEPS) $(LOCAL_DEPS) $(DEPS)
-
-plt: $(DIALYZER_PLT)
-
-distclean-plt:
-       $(gen_verbose) rm -f $(DIALYZER_PLT)
-
-ifneq ($(wildcard $(DIALYZER_PLT)),)
-dialyze:
-else
-dialyze: $(DIALYZER_PLT)
-endif
-       $(verbose) dialyzer --no_native `$(call erlang,$(call filter_opts.erl,$(ERLC_OPTS)))` $(DIALYZER_DIRS) $(DIALYZER_OPTS)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-edoc edoc
-
-# Configuration.
-
-EDOC_OPTS ?=
-
-# Core targets.
-
-ifneq ($(wildcard doc/overview.edoc),)
-docs:: edoc
-endif
-
-distclean:: distclean-edoc
-
-# Plugin-specific targets.
-
-edoc: distclean-edoc doc-deps
-       $(gen_verbose) $(ERL) -eval 'edoc:application($(PROJECT), ".", [$(EDOC_OPTS)]), halt().'
-
-distclean-edoc:
-       $(gen_verbose) rm -f doc/*.css doc/*.html doc/*.png doc/edoc-info
-
-# Copyright (c) 2014 Dave Cottlehuber <dch@skunkwerks.at>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: distclean-escript escript
-
-# Configuration.
-
-ESCRIPT_NAME ?= $(PROJECT)
-ESCRIPT_COMMENT ?= This is an -*- erlang -*- file
-
-ESCRIPT_BEAMS ?= "ebin/*", "deps/*/ebin/*"
-ESCRIPT_SYS_CONFIG ?= "rel/sys.config"
-ESCRIPT_EMU_ARGS ?= -pa . \
-       -sasl errlog_type error \
-       -escript main $(ESCRIPT_NAME)
-ESCRIPT_SHEBANG ?= /usr/bin/env escript
-ESCRIPT_STATIC ?= "deps/*/priv/**", "priv/**"
-
-# Core targets.
-
-distclean:: distclean-escript
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Escript targets:" \
-               "  escript     Build an executable escript archive" \
-
-# Plugin-specific targets.
-
-# Based on https://github.com/synrc/mad/blob/master/src/mad_bundle.erl
-# Copyright (c) 2013 Maxim Sokhatsky, Synrc Research Center
-# Modified MIT License, https://github.com/synrc/mad/blob/master/LICENSE :
-# Software may only be used for the great good and the true happiness of all
-# sentient beings.
-
-define ESCRIPT_RAW
-'Read = fun(F) -> {ok, B} = file:read_file(filename:absname(F)), B end,'\
-'Files = fun(L) -> A = lists:concat([filelib:wildcard(X)||X<- L ]),'\
-'  [F || F <- A, not filelib:is_dir(F) ] end,'\
-'Squash = fun(L) -> [{filename:basename(F), Read(F) } || F <- L ] end,'\
-'Zip = fun(A, L) -> {ok,{_,Z}} = zip:create(A, L, [{compress,all},memory]), Z end,'\
-'Ez = fun(Escript) ->'\
-'  Static = Files([$(ESCRIPT_STATIC)]),'\
-'  Beams = Squash(Files([$(ESCRIPT_BEAMS), $(ESCRIPT_SYS_CONFIG)])),'\
-'  Archive = Beams ++ [{ "static.gz", Zip("static.gz", Static)}],'\
-'  escript:create(Escript, [ $(ESCRIPT_OPTIONS)'\
-'    {archive, Archive, [memory]},'\
-'    {shebang, "$(ESCRIPT_SHEBANG)"},'\
-'    {comment, "$(ESCRIPT_COMMENT)"},'\
-'    {emu_args, " $(ESCRIPT_EMU_ARGS)"}'\
-'  ]),'\
-'  file:change_mode(Escript, 8#755)'\
-'end,'\
-'Ez("$(ESCRIPT_NAME)"),'\
-'halt().'
-endef
-
-ESCRIPT_COMMAND = $(subst ' ',,$(ESCRIPT_RAW))
-
-escript:: distclean-escript deps app
-       $(gen_verbose) $(ERL) -eval $(ESCRIPT_COMMAND)
-
-distclean-escript:
-       $(gen_verbose) rm -f $(ESCRIPT_NAME)
-
-# Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: eunit apps-eunit
-
-# Configuration
-
-EUNIT_OPTS ?=
-EUNIT_ERL_OPTS ?=
-
-# Core targets.
-
-tests:: eunit
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "EUnit targets:" \
-               "  eunit       Run all the EUnit tests for this project"
-
-# Plugin-specific targets.
-
-define eunit.erl
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       case cover:compile_beam_directory("ebin") of
-                               {error, _} -> halt(1);
-                               _ -> ok
-                       end
-       end,
-       case eunit:test($1, [$(EUNIT_OPTS)]) of
-               ok -> ok;
-               error -> halt(2)
-       end,
-       case "$(COVER)" of
-               "" -> ok;
-               _ ->
-                       cover:export("eunit.coverdata")
-       end,
-       halt()
-endef
-
-EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin ebin
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-eunit: test-build
-       $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS))
-else
-eunit: test-build
-       $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS))
-endif
-else
-EUNIT_EBIN_MODS = $(notdir $(basename $(call core_find,ebin/,*.beam)))
-EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.beam)))
-EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \
-       $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)')
-
-eunit: test-build $(if $(IS_APP),,apps-eunit)
-       $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS))
-
-ifneq ($(ALL_APPS_DIRS),)
-apps-eunit:
-       $(verbose) for app in $(ALL_APPS_DIRS); do $(MAKE) -C $$app eunit IS_APP=1; done
-endif
-endif
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: relx-rel distclean-relx-rel distclean-relx run
-
-# Configuration.
-
-RELX ?= $(CURDIR)/relx
-RELX_CONFIG ?= $(CURDIR)/relx.config
-
-RELX_URL ?= https://github.com/erlware/relx/releases/download/v3.5.0/relx
-RELX_OPTS ?=
-RELX_OUTPUT_DIR ?= _rel
-
-ifeq ($(firstword $(RELX_OPTS)),-o)
-       RELX_OUTPUT_DIR = $(word 2,$(RELX_OPTS))
-else
-       RELX_OPTS += -o $(RELX_OUTPUT_DIR)
-endif
-
-# Core targets.
-
-ifeq ($(IS_DEP),)
-ifneq ($(wildcard $(RELX_CONFIG)),)
-rel:: relx-rel
-endif
-endif
-
-distclean:: distclean-relx-rel distclean-relx
-
-# Plugin-specific targets.
-
-$(RELX):
-       $(gen_verbose) $(call core_http_get,$(RELX),$(RELX_URL))
-       $(verbose) chmod +x $(RELX)
-
-relx-rel: $(RELX) rel-deps app
-       $(verbose) $(RELX) -c $(RELX_CONFIG) $(RELX_OPTS)
-
-distclean-relx-rel:
-       $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
-
-distclean-relx:
-       $(gen_verbose) rm -rf $(RELX)
-
-# Run target.
-
-ifeq ($(wildcard $(RELX_CONFIG)),)
-run:
-else
-
-define get_relx_release.erl
-       {ok, Config} = file:consult("$(RELX_CONFIG)"),
-       {release, {Name, _}, _} = lists:keyfind(release, 1, Config),
-       io:format("~s", [Name]),
-       halt(0).
-endef
-
-RELX_RELEASE = `$(call erlang,$(get_relx_release.erl))`
-
-run: all
-       $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_RELEASE)/bin/$(RELX_RELEASE) console
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Relx targets:" \
-               "  run         Compile the project, build the release and run it"
-
-endif
-
-# Copyright (c) 2014, M Robert Martin <rob@version2beta.com>
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is contributed to erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: shell
-
-# Configuration.
-
-SHELL_ERL ?= erl
-SHELL_PATHS ?= $(CURDIR)/ebin $(APPS_DIR)/*/ebin $(DEPS_DIR)/*/ebin
-SHELL_OPTS ?=
-
-ALL_SHELL_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(SHELL_DEPS))
-
-# Core targets
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Shell targets:" \
-               "  shell       Run an erlang shell with SHELL_OPTS or reasonable default"
-
-# Plugin-specific targets.
-
-$(foreach dep,$(SHELL_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-shell-deps: $(ALL_SHELL_DEPS_DIRS)
-       $(verbose) for dep in $(ALL_SHELL_DEPS_DIRS) ; do $(MAKE) -C $$dep ; done
-
-shell: build-shell-deps
-       $(gen_verbose) $(SHELL_ERL) -pa $(SHELL_PATHS) $(SHELL_OPTS)
-
-# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-ifeq ($(filter triq,$(DEPS) $(TEST_DEPS)),triq)
-.PHONY: triq
-
-# Targets.
-
-tests:: triq
-
-define triq_check.erl
-       code:add_pathsa(["$(CURDIR)/ebin", "$(DEPS_DIR)/*/ebin"]),
-       try
-               case $(1) of
-                       all -> [true] =:= lists:usort([triq:check(M) || M <- [$(call comma_list,$(3))]]);
-                       module -> triq:check($(2));
-                       function -> triq:check($(2))
-               end
-       of
-               true -> halt(0);
-               _ -> halt(1)
-       catch error:undef ->
-               io:format("Undefined property or module~n"),
-               halt(0)
-       end.
-endef
-
-ifdef t
-ifeq (,$(findstring :,$(t)))
-triq: test-build
-       $(verbose) $(call erlang,$(call triq_check.erl,module,$(t)))
-else
-triq: test-build
-       $(verbose) echo Testing $(t)/0
-       $(verbose) $(call erlang,$(call triq_check.erl,function,$(t)()))
-endif
-else
-triq: test-build
-       $(eval MODULES := $(patsubst %,'%',$(sort $(notdir $(basename $(wildcard ebin/*.beam))))))
-       $(gen_verbose) $(call erlang,$(call triq_check.erl,all,undefined,$(MODULES)))
-endif
-endif
-
-# Copyright (c) 2015, Erlang Solutions Ltd.
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-.PHONY: xref distclean-xref
-
-# Configuration.
-
-ifeq ($(XREF_CONFIG),)
-       XREF_ARGS :=
-else
-       XREF_ARGS := -c $(XREF_CONFIG)
-endif
-
-XREFR ?= $(CURDIR)/xrefr
-export XREFR
-
-XREFR_URL ?= https://github.com/inaka/xref_runner/releases/download/0.2.2/xrefr
-
-# Core targets.
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Xref targets:" \
-               "  xref        Run Xrefr using $XREF_CONFIG as config file if defined"
-
-distclean:: distclean-xref
-
-# Plugin-specific targets.
-
-$(XREFR):
-       $(gen_verbose) $(call core_http_get,$(XREFR),$(XREFR_URL))
-       $(verbose) chmod +x $(XREFR)
-
-xref: deps app $(XREFR)
-       $(gen_verbose) $(XREFR) $(XREFR_ARGS)
-
-distclean-xref:
-       $(gen_verbose) rm -rf $(XREFR)
-
-# Copyright 2015, Viktor Söderqvist <viktor@zuiderkwast.se>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-COVER_REPORT_DIR = cover
-
-# Hook in coverage to ct
-
-ifdef COVER
-ifdef CT_RUN
-# All modules in 'ebin'
-COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam)))
-
-test-build:: $(TEST_DIR)/ct.cover.spec
-
-$(TEST_DIR)/ct.cover.spec:
-       $(verbose) echo Cover mods: $(COVER_MODS)
-       $(gen_verbose) printf "%s\n" \
-               '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \
-               '{export,"$(CURDIR)/ct.coverdata"}.' > $@
-
-CT_RUN += -cover $(TEST_DIR)/ct.cover.spec
-endif
-endif
-
-# Core targets
-
-ifdef COVER
-ifneq ($(COVER_REPORT_DIR),)
-tests::
-       $(verbose) $(MAKE) --no-print-directory cover-report
-endif
-endif
-
-clean:: coverdata-clean
-
-ifneq ($(COVER_REPORT_DIR),)
-distclean:: cover-report-clean
-endif
-
-help::
-       $(verbose) printf "%s\n" "" \
-               "Cover targets:" \
-               "  cover-report  Generate a HTML coverage report from previously collected" \
-               "                cover data." \
-               "  all.coverdata Merge {eunit,ct}.coverdata into one coverdata file." \
-               "" \
-               "If COVER=1 is set, coverage data is generated by the targets eunit and ct. The" \
-               "target tests additionally generates a HTML coverage report from the combined" \
-               "coverdata files from each of these testing tools. HTML reports can be disabled" \
-               "by setting COVER_REPORT_DIR to empty."
-
-# Plugin specific targets
-
-COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata))
-
-.PHONY: coverdata-clean
-coverdata-clean:
-       $(gen_verbose) rm -f *.coverdata ct.cover.spec
-
-# Merge all coverdata files into one.
-all.coverdata: $(COVERDATA)
-       $(gen_verbose) $(ERL) -eval ' \
-               $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) \
-               cover:export("$@"), halt(0).'
-
-# These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to
-# empty if you want the coverdata files but not the HTML report.
-ifneq ($(COVER_REPORT_DIR),)
-
-.PHONY: cover-report-clean cover-report
-
-cover-report-clean:
-       $(gen_verbose) rm -rf $(COVER_REPORT_DIR)
-
-ifeq ($(COVERDATA),)
-cover-report:
-else
-
-# Modules which include eunit.hrl always contain one line without coverage
-# because eunit defines test/0 which is never called. We compensate for this.
-EUNIT_HRL_MODS = $(subst $(space),$(comma),$(shell \
-       grep -e '^\s*-include.*include/eunit\.hrl"' src/*.erl \
-       | sed "s/^src\/\(.*\)\.erl:.*/'\1'/" | uniq))
-
-define cover_report.erl
-       $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),)
-       Ms = cover:imported_modules(),
-       [cover:analyse_to_file(M, "$(COVER_REPORT_DIR)/" ++ atom_to_list(M)
-               ++ ".COVER.html", [html])  || M <- Ms],
-       Report = [begin {ok, R} = cover:analyse(M, module), R end || M <- Ms],
-       EunitHrlMods = [$(EUNIT_HRL_MODS)],
-       Report1 = [{M, {Y, case lists:member(M, EunitHrlMods) of
-               true -> N - 1; false -> N end}} || {M, {Y, N}} <- Report],
-       TotalY = lists:sum([Y || {_, {Y, _}} <- Report1]),
-       TotalN = lists:sum([N || {_, {_, N}} <- Report1]),
-       TotalPerc = round(100 * TotalY / (TotalY + TotalN)),
-       {ok, F} = file:open("$(COVER_REPORT_DIR)/index.html", [write]),
-       io:format(F, "<!DOCTYPE html><html>~n"
-               "<head><meta charset=\"UTF-8\">~n"
-               "<title>Coverage report</title></head>~n"
-               "<body>~n", []),
-       io:format(F, "<h1>Coverage</h1>~n<p>Total: ~p%</p>~n", [TotalPerc]),
-       io:format(F, "<table><tr><th>Module</th><th>Coverage</th></tr>~n", []),
-       [io:format(F, "<tr><td><a href=\"~p.COVER.html\">~p</a></td>"
-               "<td>~p%</td></tr>~n",
-               [M, M, round(100 * Y / (Y + N))]) || {M, {Y, N}} <- Report1],
-       How = "$(subst $(space),$(comma)$(space),$(basename $(COVERDATA)))",
-       Date = "$(shell date -u "+%Y-%m-%dT%H:%M:%SZ")",
-       io:format(F, "</table>~n"
-               "<p>Generated using ~s and erlang.mk on ~s.</p>~n"
-               "</body></html>", [How, Date]),
-       halt().
-endef
-
-cover-report:
-       $(gen_verbose) mkdir -p $(COVER_REPORT_DIR)
-       $(gen_verbose) $(call erlang,$(cover_report.erl))
-
-endif
-endif # ifneq ($(COVER_REPORT_DIR),)
-
-# Copyright (c) 2013-2015, Loïc Hoguin <essen@ninenines.eu>
-# Copyright (c) 2015, Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com>
-# This file is part of erlang.mk and subject to the terms of the ISC License.
-
-# Fetch dependencies (without building them).
-
-.PHONY: fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps \
-       fetch-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-       @:
-else
-# By default, we fetch "normal" dependencies. They are also included no
-# matter the type of requested dependencies.
-#
-# $(ALL_DEPS_DIRS) includes $(BUILD_DEPS).
-fetch-deps: $(ALL_DEPS_DIRS)
-fetch-doc-deps: $(ALL_DEPS_DIRS) $(ALL_DOC_DEPS_DIRS)
-fetch-rel-deps: $(ALL_DEPS_DIRS) $(ALL_REL_DEPS_DIRS)
-fetch-test-deps: $(ALL_DEPS_DIRS) $(ALL_TEST_DEPS_DIRS)
-fetch-shell-deps: $(ALL_DEPS_DIRS) $(ALL_SHELL_DEPS_DIRS)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(filter doc,$(DEP_TYPES)),)
-fetch-deps: $(ALL_DOC_DEPS_DIRS)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-fetch-deps: $(ALL_REL_DEPS_DIRS)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-fetch-deps: $(ALL_TEST_DEPS_DIRS)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-fetch-deps: $(ALL_SHELL_DEPS_DIRS)
-endif
-
-fetch-deps fetch-doc-deps fetch-rel-deps fetch-test-deps fetch-shell-deps:
-ifndef IS_APP
-       $(verbose) for dep in $(ALL_APPS_DIRS) ; do \
-               $(MAKE) -C $$dep $@ IS_APP=1 || exit $$?; \
-       done
-endif
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $(ERLANG_MK_TMP)/$@.log
-endif
-       $(verbose) mkdir -p $(ERLANG_MK_TMP)
-       $(verbose) for dep in $^ ; do \
-               if ! grep -qs ^$$dep$$ $(ERLANG_MK_TMP)/$@.log; then \
-                       echo $$dep >> $(ERLANG_MK_TMP)/$@.log; \
-                       if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                        $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                               $(MAKE) -C $$dep fetch-deps IS_DEP=1 || exit $$?; \
-                       fi \
-               fi \
-       done
-endif # ifneq ($(SKIP_DEPS),)
-
-# List dependencies recursively.
-
-.PHONY: list-deps list-doc-deps list-rel-deps list-test-deps \
-       list-shell-deps
-
-ifneq ($(SKIP_DEPS),)
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-       $(verbose) :> $@
-else
-LIST_DIRS = $(ALL_DEPS_DIRS)
-LIST_DEPS = $(BUILD_DEPS) $(DEPS)
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST): fetch-deps
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DIRS += $(ALL_DOC_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): LIST_DEPS += $(DOC_DEPS)
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-doc-deps
-else
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DIRS += $(ALL_REL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): LIST_DEPS += $(REL_DEPS)
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-rel-deps
-else
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DIRS += $(ALL_TEST_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): LIST_DEPS += $(TEST_DEPS)
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-test-deps
-else
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST): fetch-deps
-endif
-
-ifneq ($(IS_DEP),1)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DIRS += $(ALL_SHELL_DEPS_DIRS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): LIST_DEPS += $(SHELL_DEPS)
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-shell-deps
-else
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST): fetch-deps
-endif
-
-$(ERLANG_MK_RECURSIVE_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_REL_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST) \
-$(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST):
-ifneq ($(IS_DEP),1)
-       $(verbose) rm -f $@.orig
-endif
-ifndef IS_APP
-       $(verbose) for app in $(filter-out $(CURDIR),$(ALL_APPS_DIRS)); do \
-               $(MAKE) -C "$$app" --no-print-directory $@ IS_APP=1 || :; \
-       done
-endif
-       $(verbose) for dep in $(filter-out $(CURDIR),$(LIST_DIRS)); do \
-               if grep -qs -E "^[[:blank:]]*include[[:blank:]]+(erlang\.mk|.*/erlang\.mk)$$" \
-                $$dep/GNUmakefile $$dep/makefile $$dep/Makefile; then \
-                       $(MAKE) -C "$$dep" --no-print-directory $@ IS_DEP=1; \
-               fi; \
-       done
-       $(verbose) for dep in $(LIST_DEPS); do \
-               echo $(DEPS_DIR)/$$dep; \
-       done >> $@.orig
-ifndef IS_APP
-ifneq ($(IS_DEP),1)
-       $(verbose) sort < $@.orig | uniq > $@
-       $(verbose) rm -f $@.orig
-endif
-endif
-endif # ifneq ($(SKIP_DEPS),)
-
-ifneq ($(SKIP_DEPS),)
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       @:
-else
-list-deps: $(ERLANG_MK_RECURSIVE_DEPS_LIST)
-list-doc-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-list-rel-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-list-test-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-list-shell-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-
-# Allow to use fetch-deps and $(DEP_TYPES) to fetch multiple types of
-# dependencies with a single target.
-ifneq ($(IS_DEP),1)
-ifneq ($(filter doc,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_DOC_DEPS_LIST)
-endif
-ifneq ($(filter rel,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_REL_DEPS_LIST)
-endif
-ifneq ($(filter test,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_TEST_DEPS_LIST)
-endif
-ifneq ($(filter shell,$(DEP_TYPES)),)
-list-deps: $(ERLANG_MK_RECURSIVE_SHELL_DEPS_LIST)
-endif
-endif
-
-list-deps list-doc-deps list-rel-deps list-test-deps list-shell-deps:
-       $(verbose) cat $^ | sort | uniq
-endif # ifneq ($(SKIP_DEPS),)
diff --git a/rabbitmq-server/git-revisions.txt b/rabbitmq-server/git-revisions.txt
deleted file mode 100644 (file)
index 58400b3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-rabbit ea4e59ee3018bd2824b003ac8f9db3e59c9d3413 rabbitmq_v3_6_5_milestone1
-amqp_client de6e3378391e901bdf1448ded05d6dfc1cfd8a3b rabbitmq_v3_6_4
-cowboy b8e4115eb13488c517d8d8ef33c47d0eaa7838c6 1.0.3
-cowlib 7d8a571b1e50602d701ca203fbf28036b2cf80f5 1.0.1
-mochiweb a1ed381e1c4f56c7d1eaee2c2cb725719905a84a master
-rabbit_common 301f3d2e600c6eed1f74cd36d99f32d7782a0630 rabbitmq_v3_6_5_milestone2
-rabbitmq_amqp1_0 4f23a99a9f28f997f34b8f8a161c3d29da4b47b6 rabbitmq_v3_6_4
-rabbitmq_auth_backend_ldap deb2fa94b65169f2c92171dc6ae9f08801e74769 rabbitmq_v3_6_4
-rabbitmq_auth_mechanism_ssl 9fcd68bb9bd1a11759cdec781328a3169a005338 rabbitmq_v3_6_4
-rabbitmq_codegen 4e725d8cafeaca969082beb0b5fa7d48f7f738fe stable
-rabbitmq_consistent_hash_exchange 9926fddd461aca3fa3d97070712f8f6855cc69cd rabbitmq_v3_6_4
-rabbitmq_event_exchange b9ce9662904917756c23fef4883604637dacf77e rabbitmq_v3_6_4
-rabbitmq_federation d613a738604f6274e96eef26b6cba72e3ae63604 rabbitmq_v3_6_4
-rabbitmq_federation_management 4ef2eac742105367600f85e93cc25016c4a272bb rabbitmq_v3_6_4
-rabbitmq_jms_topic_exchange 82919d6815713445c07dc5faf21b8ed56b7c9143 rabbitmq_v3_6_4
-rabbitmq_management 182787783bff4868a63f6a73573a8ead56421cb2 rabbitmq_v3_6_5_milestone2
-rabbitmq_management_agent 7d7b85d188353f6af87b85ec831f129811c3f983 rabbitmq_v3_6_4
-rabbitmq_management_visualiser d135a528cc8ecc2c1101cd9dc331b1af61eb0ee5 rabbitmq_v3_6_4
-rabbitmq_mqtt 601f6d94ff48b9eda46e4e0ddb45f01a879c613d rabbitmq_v3_6_4
-rabbitmq_recent_history_exchange 7d01b5b03fb1a60d314544f8d9f33994a0803196 rabbitmq_v3_6_4
-rabbitmq_sharding 890c8530700a2812a54acd8893083e9a74226949 rabbitmq_v3_6_4
-rabbitmq_shovel e4b1dc712cd74a9d3b36aca84a984114bdaef724 rabbitmq_v3_6_4
-rabbitmq_shovel_management c83f97a8169608dcaff5538f915cf86b518fb718 rabbitmq_v3_6_4
-rabbitmq_stomp d1117a87e06d8066a5b87cee2c41fd86af19b1cb rabbitmq_v3_6_4
-rabbitmq_top 9ceb7d022e4f75325b050da72bd64d7fba6316ab rabbitmq_v3_6_4
-rabbitmq_tracing 6263db57dac49d673b8d87dcee2799d5363ca197 rabbitmq_v3_6_4
-rabbitmq_trust_store 18334b25081cb59dce2725b667a4fb59926b3b0b rabbitmq_v3_6_4
-rabbitmq_web_dispatch 8415fdd5437ef9efc2f26f5b1dd0437b90c2daba rabbitmq_v3_6_4
-rabbitmq_web_stomp 71b8c97775c04e77eb28a8e4a0c942b9165851e5 rabbitmq_v3_6_4
-rabbitmq_web_stomp_examples f271d08a4090ab12ee6b23de7840e07ebc52a5cd rabbitmq_v3_6_4
-ranch a5d2efcde9a34ad38ab89a26d98ea5335e88625a 1.2.1
-sockjs 7e7112a4935a9aaa89e97954eb612534fa0f6229 master
-webmachine 6b5210c0ed07159f43222255e05a90bbef6c8cbe 
diff --git a/rabbitmq-server/rabbitmq-components.mk b/rabbitmq-server/rabbitmq-components.mk
deleted file mode 100644 (file)
index eb9e9e3..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-ifeq ($(.DEFAULT_GOAL),)
-# Define default goal to `all` because this file defines some targets
-# before the inclusion of erlang.mk leading to the wrong target becoming
-# the default.
-.DEFAULT_GOAL = all
-endif
-
-# Automatically add rabbitmq-common to the dependencies, at least for
-# the Makefiles.
-ifneq ($(PROJECT),rabbit_common)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-ifeq ($(filter rabbit_common,$(DEPS)),)
-DEPS += rabbit_common
-endif
-endif
-endif
-
-# --------------------------------------------------------------------
-# RabbitMQ components.
-# --------------------------------------------------------------------
-
-# For RabbitMQ repositories, we want to checkout branches which match
-# the parent project. For instance, if the parent project is on a
-# release tag, dependencies must be on the same release tag. If the
-# parent project is on a topic branch, dependencies must be on the same
-# topic branch or fallback to `stable` or `master` whichever was the
-# base of the topic branch.
-
-dep_amqp_client                       = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit                            = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbit_common                     = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_amqp1_0                  = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_amqp        = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_http        = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_backend_ldap        = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_auth_mechanism_ssl       = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_boot_steps_visualiser    = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_clusterer                = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_codegen                  = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_dotnet_client            = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_event_exchange           = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation               = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_federation_management    = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_java_client              = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_client               = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_jms_topic_exchange       = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_lvc                      = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management               = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_agent         = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_exchange      = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_themes        = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_management_visualiser    = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_message_timestamp        = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_metronome                = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_mqtt                     = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_objc_client              = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_recent_history_exchange  = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_routing_node_stamp       = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_rtopic_exchange          = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_sharding                 = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel                   = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_shovel_management        = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_stomp                    = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_toke                     = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_top                      = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_tracing                  = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_trust_store              = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_test                     = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_dispatch             = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp                = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_stomp_examples       = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt                 = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_web_mqtt_examples        = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
-dep_rabbitmq_website                  = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
-dep_sockjs                            = git_rmq sockjs-erlang $(current_rmq_ref) $(base_rmq_ref) master
-dep_toke                              = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
-
-dep_rabbitmq_public_umbrella          = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
-
-# FIXME: As of 2015-11-20, we depend on Ranch 1.2.1, but erlang.mk
-# defaults to Ranch 1.1.0. All projects depending indirectly on Ranch
-# needs to add "ranch" as a BUILD_DEPS. The list of projects needing
-# this workaround are:
-#     o  rabbitmq-web-stomp
-dep_ranch = git https://github.com/ninenines/ranch 1.2.1
-
-RABBITMQ_COMPONENTS = amqp_client \
-                     rabbit \
-                     rabbit_common \
-                     rabbitmq_amqp1_0 \
-                     rabbitmq_auth_backend_amqp \
-                     rabbitmq_auth_backend_http \
-                     rabbitmq_auth_backend_ldap \
-                     rabbitmq_auth_mechanism_ssl \
-                     rabbitmq_boot_steps_visualiser \
-                     rabbitmq_clusterer \
-                     rabbitmq_codegen \
-                     rabbitmq_consistent_hash_exchange \
-                     rabbitmq_delayed_message_exchange \
-                     rabbitmq_dotnet_client \
-                     rabbitmq_event_exchange \
-                     rabbitmq_federation \
-                     rabbitmq_federation_management \
-                     rabbitmq_java_client \
-                     rabbitmq_jms_client \
-                     rabbitmq_jms_topic_exchange \
-                     rabbitmq_lvc \
-                     rabbitmq_management \
-                     rabbitmq_management_agent \
-                     rabbitmq_management_exchange \
-                     rabbitmq_management_themes \
-                     rabbitmq_management_visualiser \
-                     rabbitmq_message_timestamp \
-                     rabbitmq_metronome \
-                     rabbitmq_mqtt \
-                     rabbitmq_objc_client \
-                     rabbitmq_recent_history_exchange \
-                     rabbitmq_routing_node_stamp \
-                     rabbitmq_rtopic_exchange \
-                     rabbitmq_sharding \
-                     rabbitmq_shovel \
-                     rabbitmq_shovel_management \
-                     rabbitmq_stomp \
-                     rabbitmq_test \
-                     rabbitmq_toke \
-                     rabbitmq_top \
-                     rabbitmq_tracing \
-                     rabbitmq_trust_store \
-                     rabbitmq_web_dispatch \
-                     rabbitmq_web_mqtt \
-                     rabbitmq_web_mqtt_examples \
-                     rabbitmq_web_stomp \
-                     rabbitmq_web_stomp_examples \
-                     rabbitmq_website
-
-# Several components have a custom erlang.mk/build.config, mainly
-# to disable eunit. Therefore, we can't use the top-level project's
-# erlang.mk copy.
-NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
-
-ifeq ($(origin current_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-current_rmq_ref := $(shell (\
-       ref=$$(git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
-       if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
-else
-current_rmq_ref := master
-endif
-endif
-export current_rmq_ref
-
-ifeq ($(origin base_rmq_ref),undefined)
-ifneq ($(wildcard .git),)
-base_rmq_ref := $(shell \
-       (git rev-parse --verify -q stable >/dev/null && \
-         git merge-base --is-ancestor $$(git merge-base master HEAD) stable && \
-         echo stable) || \
-       echo master)
-else
-base_rmq_ref := master
-endif
-endif
-export base_rmq_ref
-
-# Repository URL selection.
-#
-# First, we infer other components' location from the current project
-# repository URL, if it's a Git repository:
-#   - We take the "origin" remote URL as the base
-# - The current project name and repository name is replaced by the
-#   target's properties:
-#       eg. rabbitmq-common is replaced by rabbitmq-codegen
-#       eg. rabbit_common is replaced by rabbitmq_codegen
-#
-# If cloning from this computed location fails, we fallback to RabbitMQ
-# upstream which is GitHub.
-
-# Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
-rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
-
-# Upstream URL for the current project.
-RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
-RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
-
-# Current URL for the current project. If this is not a Git clone,
-# default to the upstream Git repository.
-ifneq ($(wildcard .git),)
-git_origin_fetch_url := $(shell git config remote.origin.url)
-git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
-RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
-RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
-else
-RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
-RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
-endif
-
-# Macro to replace the following pattern:
-#   1. /foo.git -> /bar.git
-#   2. /foo     -> /bar
-#   3. /foo/    -> /bar/
-subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
-
-# Macro to replace both the project's name (eg. "rabbit_common") and
-# repository name (eg. "rabbitmq-common") by the target's equivalent.
-#
-# This macro is kept on one line because we don't want whitespaces in
-# the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
-# single-quoted string.
-dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
-
-dep_rmq_commits = $(if $(dep_$(1)),                                    \
-                 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))),       \
-                 $(pkg_$(1)_commit))
-
-define dep_fetch_git_rmq
-       fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
-       fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
-       if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
-        git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url1"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
-       elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
-           fetch_url="$$$$fetch_url2"; \
-           push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
-       fi; \
-       cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
-       $(foreach ref,$(call dep_rmq_commits,$(1)), \
-         git checkout -q $(ref) >/dev/null 2>&1 || \
-         ) \
-       (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
-         1>&2 && false) ) && \
-       (test "$$$$fetch_url" = "$$$$push_url" || \
-        git remote set-url --push origin "$$$$push_url")
-endef
-
-# --------------------------------------------------------------------
-# Component distribution.
-# --------------------------------------------------------------------
-
-list-dist-deps::
-       @:
-
-prepare-dist::
-       @:
-
-# --------------------------------------------------------------------
-# Run a RabbitMQ node (moved from rabbitmq-run.mk as a workaround).
-# --------------------------------------------------------------------
-
-# Add "rabbit" to the build dependencies when the user wants to start
-# a broker or to the test dependencies when the user wants to test a
-# project.
-#
-# NOTE: This should belong to rabbitmq-run.mk. Unfortunately, it is
-# loaded *after* erlang.mk which is too late to add a dependency. That's
-# why rabbitmq-components.mk knows the list of targets which start a
-# broker and add "rabbit" to the dependencies in this case.
-
-ifneq ($(PROJECT),rabbit)
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),)
-RUN_RMQ_TARGETS = run-broker \
-                 run-background-broker \
-                 run-node \
-                 run-background-node \
-                 start-background-node
-
-ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),)
-BUILD_DEPS += rabbit
-endif
-endif
-
-ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),)
-TEST_DEPS += rabbit
-endif
-endif
-endif
-
-ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),)
-ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),)
-TEST_DEPS += rabbitmq_test
-endif
-endif
-
-# --------------------------------------------------------------------
-# rabbitmq-components.mk checks.
-# --------------------------------------------------------------------
-
-ifeq ($(PROJECT),rabbit_common)
-else ifdef SKIP_RMQCOMP_CHECK
-else ifeq ($(IS_DEP),1)
-else ifneq ($(filter co up,$(MAKECMDGOALS)),)
-else
-# In all other cases, rabbitmq-components.mk must be in sync.
-deps:: check-rabbitmq-components.mk
-fetch-deps: check-rabbitmq-components.mk
-endif
-
-# If this project is under the Umbrella project, we override $(DEPS_DIR)
-# to point to the Umbrella's one. We also disable `make distclean` so
-# $(DEPS_DIR) is not accidentally removed.
-
-ifneq ($(wildcard ../../UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-else ifneq ($(wildcard UMBRELLA.md),)
-UNDER_UMBRELLA = 1
-endif
-
-ifeq ($(UNDER_UMBRELLA),1)
-ifneq ($(PROJECT),rabbitmq_public_umbrella)
-DEPS_DIR ?= $(abspath ..)
-
-distclean:: distclean-components
-       @:
-
-distclean-components:
-endif
-
-ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
-SKIP_DEPS = 1
-endif
-endif
-
-UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
-
-check-rabbitmq-components.mk:
-       $(verbose) cmp -s rabbitmq-components.mk \
-               $(UPSTREAM_RMQ_COMPONENTS_MK) || \
-               (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
-                 false)
-
-ifeq ($(PROJECT),rabbit_common)
-rabbitmq-components-mk:
-       @:
-else
-rabbitmq-components-mk:
-       $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
-ifeq ($(DO_COMMIT),yes)
-       $(verbose) git diff --quiet rabbitmq-components.mk \
-       || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk
-endif
-endif
diff --git a/rabbitmq-server/src/pg2_fixed.erl b/rabbitmq-server/src/pg2_fixed.erl
deleted file mode 100644 (file)
index 222a0bc..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-%% This is the version of pg2 from R14B02, which contains the fix
-%% described at
-%% http://erlang.2086793.n4.nabble.com/pg2-still-busted-in-R13B04-td2230601.html.
-%% The changes are a search-and-replace to rename the module and avoid
-%% clashes with other versions of pg2, and also a simple rewrite of
-%% "andalso" and "orelse" expressions to case statements where the second
-%% operand is not a boolean since R12B does not allow this.
-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(pg2_fixed).
-
--export([create/1, delete/1, join/2, leave/2]).
--export([get_members/1, get_local_members/1]).
--export([get_closest_pid/1, which_groups/0]).
--export([start/0,start_link/0,init/1,handle_call/3,handle_cast/2,handle_info/2,
-         terminate/2]).
-
-%%% As of R13B03 monitors are used instead of links.
-
-%%%
-%%% Exported functions
-%%%
-
--spec start_link() -> {'ok', pid()} | {'error', term()}.
-
-start_link() ->
-    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
-
--spec start() -> {'ok', pid()} | {'error', term()}.
-
-start() ->
-    ensure_started().
-
--spec create(term()) -> 'ok'.
-
-create(Name) ->
-    _ = ensure_started(),
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        false ->
-            global:trans({{?MODULE, Name}, self()},
-                         fun() ->
-                                 gen_server:multi_call(?MODULE, {create, Name})
-                         end),
-            ok;
-        true ->
-            ok
-    end.
-
--type name() :: term().
-
--spec delete(name()) -> 'ok'.
-
-delete(Name) ->
-    _ = ensure_started(),
-    global:trans({{?MODULE, Name}, self()},
-                 fun() ->
-                         gen_server:multi_call(?MODULE, {delete, Name})
-                 end),
-    ok.
-
--spec join(name(), pid()) -> 'ok' | {'error', {'no_such_group', term()}}.
-
-join(Name, Pid) when is_pid(Pid) ->
-    _ = ensure_started(),
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        false ->
-            {error, {no_such_group, Name}};
-        true ->
-            global:trans({{?MODULE, Name}, self()},
-                         fun() ->
-                                 gen_server:multi_call(?MODULE,
-                                                       {join, Name, Pid})
-                         end),
-            ok
-    end.
-
--spec leave(name(), pid()) -> 'ok' | {'error', {'no_such_group', name()}}.
-
-leave(Name, Pid) when is_pid(Pid) ->
-    _ = ensure_started(),
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        false ->
-            {error, {no_such_group, Name}};
-        true ->
-            global:trans({{?MODULE, Name}, self()},
-                         fun() ->
-                                 gen_server:multi_call(?MODULE,
-                                                       {leave, Name, Pid})
-                         end),
-            ok
-    end.
-
--type get_members_ret() :: [pid()] | {'error', {'no_such_group', name()}}.
-
--spec get_members(name()) -> get_members_ret().
-
-get_members(Name) ->
-    _ = ensure_started(),
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        true ->
-            group_members(Name);
-        false ->
-            {error, {no_such_group, Name}}
-    end.
-
--spec get_local_members(name()) -> get_members_ret().
-
-get_local_members(Name) ->
-    _ = ensure_started(),
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        true ->
-            local_group_members(Name);
-        false ->
-            {error, {no_such_group, Name}}
-    end.
-
--spec which_groups() -> [name()].
-
-which_groups() ->
-    _ = ensure_started(),
-    all_groups().
-
--type gcp_error_reason() :: {'no_process', term()} | {'no_such_group', term()}.
-
--spec get_closest_pid(term()) -> pid() | {'error', gcp_error_reason()}.
-
-get_closest_pid(Name) ->
-    case get_local_members(Name) of
-        [Pid] ->
-            Pid;
-        [] ->
-            case get_members(Name) of
-                [] -> {error, {no_process, Name}};
-                Members ->
-                    X = time_compat:erlang_system_time(micro_seconds),
-                    lists:nth((X rem length(Members))+1, Members)
-            end;
-        Members when is_list(Members) ->
-            X = time_compat:erlang_system_time(micro_seconds),
-            lists:nth((X rem length(Members))+1, Members);
-        Else ->
-            Else
-    end.
-
-%%%
-%%% Callback functions from gen_server
-%%%
-
--record(state, {}).
-
--spec init([]) -> {'ok', #state{}}.
-
-init([]) ->
-    Ns = nodes(),
-    _ = net_kernel:monitor_nodes(true),
-    lists:foreach(fun(N) ->
-                          {?MODULE, N} ! {new_pg2_fixed, node()},
-                          self() ! {nodeup, N}
-                  end, Ns),
-    pg2_fixed_table = ets:new(pg2_fixed_table, [ordered_set, protected, named_table]),
-    {ok, #state{}}.
-
--type call() :: {'create', name()}
-              | {'delete', name()}
-              | {'join', name(), pid()}
-              | {'leave', name(), pid()}.
-
--spec handle_call(call(), _, #state{}) ->
-        {'reply', 'ok', #state{}}.
-
-handle_call({create, Name}, _From, S) ->
-    assure_group(Name),
-    {reply, ok, S};
-handle_call({join, Name, Pid}, _From, S) ->
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        true -> _ = join_group(Name, Pid),
-                ok;
-        _    -> ok
-    end,
-    {reply, ok, S};
-handle_call({leave, Name, Pid}, _From, S) ->
-    case ets:member(pg2_fixed_table, {group, Name}) of
-        true -> leave_group(Name, Pid);
-        _    -> ok
-    end,
-    {reply, ok, S};
-handle_call({delete, Name}, _From, S) ->
-    delete_group(Name),
-    {reply, ok, S};
-handle_call(Request, From, S) ->
-    error_logger:warning_msg("The pg2_fixed server received an unexpected message:\n"
-                             "handle_call(~p, ~p, _)\n",
-                             [Request, From]),
-    {noreply, S}.
-
--type all_members() :: [[name(),...]].
--type cast() :: {'exchange', node(), all_members()}
-              | {'del_member', name(), pid()}.
-
--spec handle_cast(cast(), #state{}) -> {'noreply', #state{}}.
-
-handle_cast({exchange, _Node, List}, S) ->
-    store(List),
-    {noreply, S};
-handle_cast(_, S) ->
-    %% Ignore {del_member, Name, Pid}.
-    {noreply, S}.
-
--spec handle_info(tuple(), #state{}) -> {'noreply', #state{}}.
-
-handle_info({'DOWN', MonitorRef, process, _Pid, _Info}, S) ->
-    member_died(MonitorRef),
-    {noreply, S};
-handle_info({nodeup, Node}, S) ->
-    gen_server:cast({?MODULE, Node}, {exchange, node(), all_members()}),
-    {noreply, S};
-handle_info({new_pg2_fixed, Node}, S) ->
-    gen_server:cast({?MODULE, Node}, {exchange, node(), all_members()}),
-    {noreply, S};
-handle_info(_, S) ->
-    {noreply, S}.
-
--spec terminate(term(), #state{}) -> 'ok'.
-
-terminate(_Reason, _S) ->
-    true = ets:delete(pg2_fixed_table),
-    ok.
-
-%%%
-%%% Local functions
-%%%
-
-%%% One ETS table, pg2_fixed_table, is used for bookkeeping. The type of the
-%%% table is ordered_set, and the fast matching of partially
-%%% instantiated keys is used extensively.
-%%%
-%%% {{group, Name}}
-%%%    Process group Name.
-%%% {{ref, Pid}, RPid, MonitorRef, Counter}
-%%% {{ref, MonitorRef}, Pid}
-%%%    Each process has one monitor. Sometimes a process is spawned to
-%%%    monitor the pid (RPid). Counter is incremented when the Pid joins
-%%%    some group.
-%%% {{member, Name, Pid}, GroupCounter}
-%%% {{local_member, Name, Pid}}
-%%%    Pid is a member of group Name, GroupCounter is incremented when the
-%%%    Pid joins the group Name.
-%%% {{pid, Pid, Name}}
-%%%    Pid is a member of group Name.
-
-store(List) ->
-    _ = [assure_group(Name)
-         andalso
-         [join_group(Name, P) || P <- Members -- group_members(Name)] ||
-            [Name, Members] <- List],
-    ok.
-
-assure_group(Name) ->
-    Key = {group, Name},
-    ets:member(pg2_fixed_table, Key) orelse true =:= ets:insert(pg2_fixed_table, {Key}).
-
-delete_group(Name) ->
-    _ = [leave_group(Name, Pid) || Pid <- group_members(Name)],
-    true = ets:delete(pg2_fixed_table, {group, Name}),
-    ok.
-
-member_died(Ref) ->
-    [{{ref, Ref}, Pid}] = ets:lookup(pg2_fixed_table, {ref, Ref}),
-    Names = member_groups(Pid),
-    _ = [leave_group(Name, P) ||
-            Name <- Names,
-            P <- member_in_group(Pid, Name)],
-    %% Kept for backward compatibility with links. Can be removed, eventually.
-    _ = [gen_server:abcast(nodes(), ?MODULE, {del_member, Name, Pid}) ||
-            Name <- Names],
-    ok.
-
-join_group(Name, Pid) ->
-    Ref_Pid = {ref, Pid},
-    try _ = ets:update_counter(pg2_fixed_table, Ref_Pid, {4, +1})
-    catch _:_ ->
-            {RPid, Ref} = do_monitor(Pid),
-            true = ets:insert(pg2_fixed_table, {Ref_Pid, RPid, Ref, 1}),
-            true = ets:insert(pg2_fixed_table, {{ref, Ref}, Pid})
-    end,
-    Member_Name_Pid = {member, Name, Pid},
-    try _ = ets:update_counter(pg2_fixed_table, Member_Name_Pid, {2, +1, 1, 1})
-    catch _:_ ->
-            true = ets:insert(pg2_fixed_table, {Member_Name_Pid, 1}),
-            _ = [ets:insert(pg2_fixed_table, {{local_member, Name, Pid}}) ||
-                    node(Pid) =:= node()],
-            true = ets:insert(pg2_fixed_table, {{pid, Pid, Name}})
-    end.
-
-leave_group(Name, Pid) ->
-    Member_Name_Pid = {member, Name, Pid},
-    try ets:update_counter(pg2_fixed_table, Member_Name_Pid, {2, -1, 0, 0}) of
-        N ->
-            if
-                N =:= 0 ->
-                    true = ets:delete(pg2_fixed_table, {pid, Pid, Name}),
-                    _ = [ets:delete(pg2_fixed_table, {local_member, Name, Pid}) ||
-                            node(Pid) =:= node()],
-                    true = ets:delete(pg2_fixed_table, Member_Name_Pid);
-                true ->
-                    ok
-            end,
-            Ref_Pid = {ref, Pid},
-            case ets:update_counter(pg2_fixed_table, Ref_Pid, {4, -1}) of
-                0 ->
-                    [{Ref_Pid,RPid,Ref,0}] = ets:lookup(pg2_fixed_table, Ref_Pid),
-                    true = ets:delete(pg2_fixed_table, {ref, Ref}),
-                    true = ets:delete(pg2_fixed_table, Ref_Pid),
-                    true = erlang:demonitor(Ref, [flush]),
-                    kill_monitor_proc(RPid, Pid);
-                _ ->
-                    ok
-            end
-    catch _:_ ->
-            ok
-    end.
-
-all_members() ->
-    [[G, group_members(G)] || G <- all_groups()].
-
-group_members(Name) ->
-    [P ||
-        [P, N] <- ets:match(pg2_fixed_table, {{member, Name, '$1'},'$2'}),
-        _ <- lists:seq(1, N)].
-
-local_group_members(Name) ->
-    [P ||
-        [Pid] <- ets:match(pg2_fixed_table, {{local_member, Name, '$1'}}),
-        P <- member_in_group(Pid, Name)].
-
-member_in_group(Pid, Name) ->
-    case ets:lookup(pg2_fixed_table, {member, Name, Pid}) of
-        [] -> [];
-        [{{member, Name, Pid}, N}] ->
-            lists:duplicate(N, Pid)
-    end.
-
-member_groups(Pid) ->
-    [Name || [Name] <- ets:match(pg2_fixed_table, {{pid, Pid, '$1'}})].
-
-all_groups() ->
-    [N || [N] <- ets:match(pg2_fixed_table, {{group,'$1'}})].
-
-ensure_started() ->
-    case whereis(?MODULE) of
-        undefined ->
-            C = {pg2_fixed, {?MODULE, start_link, []}, permanent,
-                 1000, worker, [?MODULE]},
-            supervisor:start_child(kernel_safe_sup, C);
-        Pg2_FixedPid ->
-            {ok, Pg2_FixedPid}
-    end.
-
-
-kill_monitor_proc(RPid, Pid) ->
-    case RPid of
-        Pid -> ok;
-        _   -> exit(RPid, kill)
-    end.
-
-%% When/if erlang:monitor() returns before trying to connect to the
-%% other node this function can be removed.
-do_monitor(Pid) ->
-    case (node(Pid) =:= node()) orelse lists:member(node(Pid), nodes()) of
-        true ->
-            %% Assume the node is still up
-            {Pid, erlang:monitor(process, Pid)};
-        false ->
-            F = fun() ->
-                        Ref = erlang:monitor(process, Pid),
-                        receive
-                            {'DOWN', Ref, process, Pid, _Info} ->
-                                exit(normal)
-                        end
-                end,
-            erlang:spawn_monitor(F)
-    end.
diff --git a/rabbitmq-server/test/channel_operation_timeout_SUITE.erl b/rabbitmq-server/test/channel_operation_timeout_SUITE.erl
deleted file mode 100644 (file)
index 7b41b9c..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(channel_operation_timeout_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile([export_all]).
-
--import(rabbit_misc, [pget/2]).
-
--define(CONFIG, [cluster_ab]).
--define(DEFAULT_VHOST, <<"/">>).
--define(QRESOURCE(Q), rabbit_misc:r(?DEFAULT_VHOST, queue, Q)).
--define(TIMEOUT_TEST_MSG,   <<"timeout_test_msg!">>).
--define(DELAY,   25).
-
-all() ->
-    [
-      notify_down_all
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = 2,
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, ClusterSize},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-notify_down_all(Config) ->
-    Rabbit = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    RabbitCh = rabbit_ct_client_helpers:open_channel(Config, 0),
-    HareCh = rabbit_ct_client_helpers:open_channel(Config, 1),
-
-    %% success
-    set_channel_operation_timeout_config(Config, 1000),
-    configure_bq(Config),
-    QCfg0    = qconfig(RabbitCh, <<"q0">>, <<"ex0">>, true, false),
-    declare(QCfg0),
-    %% Testing rabbit_amqqueue:notify_down_all via rabbit_channel.
-    %% Consumer count = 0 after correct channel termination and
-    %% notification of queues via delagate:call/3
-    true = (0 =/= length(get_consumers(Config, Rabbit, ?DEFAULT_VHOST))),
-    rabbit_ct_client_helpers:close_channel(RabbitCh),
-    0 = length(get_consumers(Config, Rabbit, ?DEFAULT_VHOST)),
-    false = is_process_alive(RabbitCh),
-
-    %% fail
-    set_channel_operation_timeout_config(Config, 10),
-    QCfg2 = qconfig(HareCh, <<"q1">>, <<"ex1">>, true, false),
-    declare(QCfg2),
-    publish(QCfg2, ?TIMEOUT_TEST_MSG),
-    timer:sleep(?DELAY),
-    rabbit_ct_client_helpers:close_channel(HareCh),
-    timer:sleep(?DELAY),
-    false = is_process_alive(HareCh),
-
-    pass.
-
-%% -------------------------
-%% Internal helper functions
-%% -------------------------
-
-set_channel_operation_timeout_config(Config, Timeout) ->
-    [ok = Ret
-     || Ret <- rabbit_ct_broker_helpers:rpc_all(Config,
-       application, set_env, [rabbit, channel_operation_timeout, Timeout])],
-    ok.
-
-set_channel_operation_backing_queue(Config) ->
-    [ok = Ret
-     || Ret <- rabbit_ct_broker_helpers:rpc_all(Config,
-       application, set_env,
-       [rabbit, backing_queue_module, channel_operation_timeout_test_queue])],
-    ok.
-
-re_enable_priority_queue(Config) ->
-    [ok = Ret
-     || Ret <- rabbit_ct_broker_helpers:rpc_all(Config,
-       rabbit_priority_queue, enable, [])],
-    ok.
-
-declare(QCfg) ->
-    QDeclare = #'queue.declare'{queue = Q = pget(name, QCfg), durable = true},
-    #'queue.declare_ok'{} = amqp_channel:call(Ch = pget(ch, QCfg), QDeclare),
-
-    ExDeclare =  #'exchange.declare'{exchange = Ex = pget(ex, QCfg)},
-    #'exchange.declare_ok'{} = amqp_channel:call(Ch, ExDeclare),
-
-    #'queue.bind_ok'{} =
-        amqp_channel:call(Ch, #'queue.bind'{queue       = Q,
-                                            exchange    = Ex,
-                                            routing_key = Q}),
-    maybe_subscribe(QCfg).
-
-maybe_subscribe(QCfg) ->
-    case pget(consume, QCfg) of
-        true ->
-            Sub = #'basic.consume'{queue  = pget(name, QCfg)},
-            Ch  = pget(ch, QCfg),
-            Del = pget(deliver, QCfg),
-            amqp_channel:subscribe(Ch, Sub,
-                                   spawn(fun() -> consume(Ch, Del) end));
-        _ ->  ok
-    end.
-
-consume(_Ch, false) -> receive_nothing();
-consume(Ch, Deliver = true) ->
-    receive
-        {#'basic.deliver'{}, _Msg} ->
-            consume(Ch, Deliver)
-    end.
-
-publish(QCfg, Msg) ->
-    Publish = #'basic.publish'{exchange = pget(ex, QCfg),
-                               routing_key = pget(name, QCfg)},
-    amqp_channel:call(pget(ch, QCfg), Publish,
-                      #amqp_msg{payload = Msg}).
-
-get_consumers(Config, Node, VHost) when is_atom(Node),
-                                        is_binary(VHost) ->
-    rabbit_ct_broker_helpers:rpc(Config, Node,
-      rabbit_amqqueue, consumers_all, [VHost]).
-
-get_amqqueue(Q, []) -> throw({not_found, Q});
-get_amqqueue(Q, [AMQQ = #amqqueue{name = Q} | _]) -> AMQQ;
-get_amqqueue(Q, [_| Rem]) -> get_amqqueue(Q, Rem).
-
-qconfig(Ch, Name, Ex, Consume, Deliver) ->
-    [{ch, Ch}, {name, Name}, {ex,Ex}, {consume, Consume}, {deliver, Deliver}].
-
-receive_nothing() ->
-    receive
-    after infinity -> void
-    end.
-
-unhandled_req(Fun) ->
-    try
-        Fun()
-    catch
-        exit:{{shutdown,{_, ?NOT_FOUND, _}}, _} -> ok;
-        _:Reason                                -> {error, Reason}
-    end.
-
-configure_bq(Config) ->
-    ok = set_channel_operation_backing_queue(Config),
-    ok = re_enable_priority_queue(Config),
-    ok = rabbit_ct_broker_helpers:add_code_path_to_all_nodes(Config,
-      ?MODULE).
diff --git a/rabbitmq-server/test/channel_operation_timeout_test_queue.erl b/rabbitmq-server/test/channel_operation_timeout_test_queue.erl
deleted file mode 100644 (file)
index 0bb3f5a..0000000
+++ /dev/null
@@ -1,2439 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(channel_operation_timeout_test_queue).
-
--export([init/3, terminate/2, delete_and_terminate/2, delete_crashed/1,
-         purge/1, purge_acks/1,
-         publish/6, publish_delivered/5,
-         batch_publish/4, batch_publish_delivered/4,
-         discard/4, drain_confirmed/1,
-         dropwhile/2, fetchwhile/4, fetch/2, drop/2, ack/2, requeue/2,
-         ackfold/4, fold/3, len/1, is_empty/1, depth/1,
-         set_ram_duration_target/2, ram_duration/1, needs_timeout/1, timeout/1,
-         handle_pre_hibernate/1, resume/1, msg_rates/1,
-         info/2, invoke/3, is_duplicate/2, set_queue_mode/2,
-         zip_msgs_and_acks/4,  multiple_routing_keys/0]).
-
--export([start/1, stop/0]).
-
-%% exported for testing only
--export([start_msg_store/2, stop_msg_store/0, init/6]).
-
-%%----------------------------------------------------------------------------
-%% This test backing queue follows the variable queue implementation, with
-%% the exception that it will introduce infinite delays on some operations if
-%% the test message has been published, and is awaiting acknowledgement in the
-%% queue index. Test message is "timeout_test_msg!".
-%%
-%%----------------------------------------------------------------------------
-
--behaviour(rabbit_backing_queue).
-
--record(vqstate,
-        { q1,
-          q2,
-          delta,
-          q3,
-          q4,
-          next_seq_id,
-          ram_pending_ack,    %% msgs using store, still in RAM
-          disk_pending_ack,   %% msgs in store, paged out
-          qi_pending_ack,     %% msgs using qi, *can't* be paged out
-          index_state,
-          msg_store_clients,
-          durable,
-          transient_threshold,
-          qi_embed_msgs_below,
-
-          len,                %% w/o unacked
-          bytes,              %% w/o unacked
-          unacked_bytes,
-          persistent_count,   %% w   unacked
-          persistent_bytes,   %% w   unacked
-
-          target_ram_count,
-          ram_msg_count,      %% w/o unacked
-          ram_msg_count_prev,
-          ram_ack_count_prev,
-          ram_bytes,          %% w   unacked
-          out_counter,
-          in_counter,
-          rates,
-          msgs_on_disk,
-          msg_indices_on_disk,
-          unconfirmed,
-          confirmed,
-          ack_out_counter,
-          ack_in_counter,
-          %% Unlike the other counters these two do not feed into
-          %% #rates{} and get reset
-          disk_read_count,
-          disk_write_count,
-
-          io_batch_size,
-
-          %% default queue or lazy queue
-          mode
-        }).
-
--record(rates, { in, out, ack_in, ack_out, timestamp }).
-
--record(msg_status,
-        { seq_id,
-          msg_id,
-          msg,
-          is_persistent,
-          is_delivered,
-          msg_in_store,
-          index_on_disk,
-          persist_to,
-          msg_props
-        }).
-
--record(delta,
-        { start_seq_id, %% start_seq_id is inclusive
-          count,
-          end_seq_id    %% end_seq_id is exclusive
-        }).
-
--define(HEADER_GUESS_SIZE, 100). %% see determine_persist_to/2
--define(PERSISTENT_MSG_STORE, msg_store_persistent).
--define(TRANSIENT_MSG_STORE,  msg_store_transient).
--define(QUEUE, lqueue).
--define(TIMEOUT_TEST_MSG, <<"timeout_test_msg!">>).
-
--include("rabbit.hrl").
--include("rabbit_framing.hrl").
-
-%%----------------------------------------------------------------------------
-
--rabbit_upgrade({multiple_routing_keys, local, []}).
-
--type seq_id()  :: non_neg_integer().
-
--type rates() :: #rates { in        :: float(),
-                          out       :: float(),
-                          ack_in    :: float(),
-                          ack_out   :: float(),
-                          timestamp :: rabbit_types:timestamp()}.
-
--type delta() :: #delta { start_seq_id :: non_neg_integer(),
-                          count        :: non_neg_integer(),
-                          end_seq_id   :: non_neg_integer() }.
-
-%% The compiler (rightfully) complains that ack() and state() are
-%% unused. For this reason we duplicate a -spec from
-%% rabbit_backing_queue with the only intent being to remove
-%% warnings. The problem here is that we can't parameterise the BQ
-%% behaviour by these two types as we would like to. We still leave
-%% these here for documentation purposes.
--type ack() :: seq_id().
--type state() :: #vqstate {
-             q1                    :: ?QUEUE:?QUEUE(),
-             q2                    :: ?QUEUE:?QUEUE(),
-             delta                 :: delta(),
-             q3                    :: ?QUEUE:?QUEUE(),
-             q4                    :: ?QUEUE:?QUEUE(),
-             next_seq_id           :: seq_id(),
-             ram_pending_ack       :: gb_trees:tree(),
-             disk_pending_ack      :: gb_trees:tree(),
-             qi_pending_ack        :: gb_trees:tree(),
-             index_state           :: any(),
-             msg_store_clients     :: 'undefined' | {{any(), binary()},
-                                                    {any(), binary()}},
-             durable               :: boolean(),
-             transient_threshold   :: non_neg_integer(),
-             qi_embed_msgs_below   :: non_neg_integer(),
-
-             len                   :: non_neg_integer(),
-             bytes                 :: non_neg_integer(),
-             unacked_bytes         :: non_neg_integer(),
-
-             persistent_count      :: non_neg_integer(),
-             persistent_bytes      :: non_neg_integer(),
-
-             target_ram_count      :: non_neg_integer() | 'infinity',
-             ram_msg_count         :: non_neg_integer(),
-             ram_msg_count_prev    :: non_neg_integer(),
-             ram_ack_count_prev    :: non_neg_integer(),
-             ram_bytes             :: non_neg_integer(),
-             out_counter           :: non_neg_integer(),
-             in_counter            :: non_neg_integer(),
-             rates                 :: rates(),
-             msgs_on_disk          :: ?GB_SET_TYPE(),
-             msg_indices_on_disk   :: ?GB_SET_TYPE(),
-             unconfirmed           :: ?GB_SET_TYPE(),
-             confirmed             :: ?GB_SET_TYPE(),
-             ack_out_counter       :: non_neg_integer(),
-             ack_in_counter        :: non_neg_integer(),
-             disk_read_count       :: non_neg_integer(),
-             disk_write_count      :: non_neg_integer(),
-
-             io_batch_size         :: pos_integer(),
-             mode                  :: 'default' | 'lazy' }.
-%% Duplicated from rabbit_backing_queue
--spec ack([ack()], state()) -> {[rabbit_guid:guid()], state()}.
-
--spec multiple_routing_keys() -> 'ok'.
-
--define(BLANK_DELTA, #delta { start_seq_id = undefined,
-                              count        = 0,
-                              end_seq_id   = undefined }).
--define(BLANK_DELTA_PATTERN(Z), #delta { start_seq_id = Z,
-                                         count        = 0,
-                                         end_seq_id   = Z }).
-
--define(MICROS_PER_SECOND, 1000000.0).
-
-%% We're sampling every 5s for RAM duration; a half life that is of
-%% the same order of magnitude is probably about right.
--define(RATE_AVG_HALF_LIFE, 5.0).
-
-%% We will recalculate the #rates{} every time we get asked for our
-%% RAM duration, or every N messages published, whichever is
-%% sooner. We do this since the priority calculations in
-%% rabbit_amqqueue_process need fairly fresh rates.
--define(MSGS_PER_RATE_CALC, 100).
-
-%%----------------------------------------------------------------------------
-%% Public API
-%%----------------------------------------------------------------------------
-
-start(DurableQueues) ->
-    {AllTerms, StartFunState} = rabbit_queue_index:start(DurableQueues),
-    start_msg_store(
-      [Ref || Terms <- AllTerms,
-              Terms /= non_clean_shutdown,
-              begin
-                  Ref = proplists:get_value(persistent_ref, Terms),
-                  Ref =/= undefined
-              end],
-      StartFunState),
-    {ok, AllTerms}.
-
-stop() ->
-    ok = stop_msg_store(),
-    ok = rabbit_queue_index:stop().
-
-start_msg_store(Refs, StartFunState) ->
-    ok = rabbit_sup:start_child(?TRANSIENT_MSG_STORE, rabbit_msg_store,
-                                [?TRANSIENT_MSG_STORE, rabbit_mnesia:dir(),
-                                 undefined,  {fun (ok) -> finished end, ok}]),
-    ok = rabbit_sup:start_child(?PERSISTENT_MSG_STORE, rabbit_msg_store,
-                                [?PERSISTENT_MSG_STORE, rabbit_mnesia:dir(),
-                                 Refs, StartFunState]).
-
-stop_msg_store() ->
-    ok = rabbit_sup:stop_child(?PERSISTENT_MSG_STORE),
-    ok = rabbit_sup:stop_child(?TRANSIENT_MSG_STORE).
-
-init(Queue, Recover, Callback) ->
-    init(
-      Queue, Recover, Callback,
-      fun (MsgIds, ActionTaken) ->
-              msgs_written_to_disk(Callback, MsgIds, ActionTaken)
-      end,
-      fun (MsgIds) -> msg_indices_written_to_disk(Callback, MsgIds) end,
-      fun (MsgIds) -> msgs_and_indices_written_to_disk(Callback, MsgIds) end).
-
-init(#amqqueue { name = QueueName, durable = IsDurable }, new,
-     AsyncCallback, MsgOnDiskFun, MsgIdxOnDiskFun, MsgAndIdxOnDiskFun) ->
-    IndexState = rabbit_queue_index:init(QueueName,
-                                         MsgIdxOnDiskFun, MsgAndIdxOnDiskFun),
-    init(IsDurable, IndexState, 0, 0, [],
-         case IsDurable of
-             true  -> msg_store_client_init(?PERSISTENT_MSG_STORE,
-                                            MsgOnDiskFun, AsyncCallback);
-             false -> undefined
-         end,
-         msg_store_client_init(?TRANSIENT_MSG_STORE, undefined, AsyncCallback));
-
-%% We can be recovering a transient queue if it crashed
-init(#amqqueue { name = QueueName, durable = IsDurable }, Terms,
-     AsyncCallback, MsgOnDiskFun, MsgIdxOnDiskFun, MsgAndIdxOnDiskFun) ->
-    {PRef, RecoveryTerms} = process_recovery_terms(Terms),
-    {PersistentClient, ContainsCheckFun} =
-        case IsDurable of
-            true  -> C = msg_store_client_init(?PERSISTENT_MSG_STORE, PRef,
-                                               MsgOnDiskFun, AsyncCallback),
-                     {C, fun (MsgId) when is_binary(MsgId) ->
-                                 rabbit_msg_store:contains(MsgId, C);
-                             (#basic_message{is_persistent = Persistent}) ->
-                                 Persistent
-                         end};
-            false -> {undefined, fun(_MsgId) -> false end}
-        end,
-    TransientClient  = msg_store_client_init(?TRANSIENT_MSG_STORE,
-                                             undefined, AsyncCallback),
-    {DeltaCount, DeltaBytes, IndexState} =
-        rabbit_queue_index:recover(
-          QueueName, RecoveryTerms,
-          rabbit_msg_store:successfully_recovered_state(?PERSISTENT_MSG_STORE),
-          ContainsCheckFun, MsgIdxOnDiskFun, MsgAndIdxOnDiskFun),
-    init(IsDurable, IndexState, DeltaCount, DeltaBytes, RecoveryTerms,
-         PersistentClient, TransientClient).
-
-process_recovery_terms(Terms=non_clean_shutdown) ->
-    {rabbit_guid:gen(), Terms};
-process_recovery_terms(Terms) ->
-    case proplists:get_value(persistent_ref, Terms) of
-        undefined -> {rabbit_guid:gen(), []};
-        PRef      -> {PRef, Terms}
-    end.
-
-terminate(_Reason, State) ->
-    State1 = #vqstate { persistent_count  = PCount,
-                        persistent_bytes  = PBytes,
-                        index_state       = IndexState,
-                        msg_store_clients = {MSCStateP, MSCStateT} } =
-        purge_pending_ack(true, State),
-    PRef = case MSCStateP of
-               undefined -> undefined;
-               _         -> ok = rabbit_msg_store:client_terminate(MSCStateP),
-                            rabbit_msg_store:client_ref(MSCStateP)
-           end,
-    ok = rabbit_msg_store:client_delete_and_terminate(MSCStateT),
-    Terms = [{persistent_ref,   PRef},
-             {persistent_count, PCount},
-             {persistent_bytes, PBytes}],
-    a(State1 #vqstate { index_state       = rabbit_queue_index:terminate(
-                                              Terms, IndexState),
-                        msg_store_clients = undefined }).
-
-%% the only difference between purge and delete is that delete also
-%% needs to delete everything that's been delivered and not ack'd.
-delete_and_terminate(_Reason, State) ->
-    %% Normally when we purge messages we interact with the qi by
-    %% issues delivers and acks for every purged message. In this case
-    %% we don't need to do that, so we just delete the qi.
-    State1 = purge_and_index_reset(State),
-    State2 = #vqstate { msg_store_clients = {MSCStateP, MSCStateT} } =
-        purge_pending_ack_delete_and_terminate(State1),
-    case MSCStateP of
-        undefined -> ok;
-        _         -> rabbit_msg_store:client_delete_and_terminate(MSCStateP)
-    end,
-    rabbit_msg_store:client_delete_and_terminate(MSCStateT),
-    a(State2 #vqstate { msg_store_clients = undefined }).
-
-delete_crashed(#amqqueue{name = QName}) ->
-    ok = rabbit_queue_index:erase(QName).
-
-purge(State = #vqstate { len = Len, qi_pending_ack= QPA }) ->
-    maybe_delay(QPA),
-    case is_pending_ack_empty(State) of
-        true ->
-            {Len, purge_and_index_reset(State)};
-        false ->
-            {Len, purge_when_pending_acks(State)}
-    end.
-
-purge_acks(State) -> a(purge_pending_ack(false, State)).
-
-publish(Msg, MsgProps, IsDelivered, ChPid, Flow, State) ->
-    State1 =
-        publish1(Msg, MsgProps, IsDelivered, ChPid, Flow,
-                 fun maybe_write_to_disk/4,
-                 State),
-    a(reduce_memory_use(maybe_update_rates(State1))).
-
-batch_publish(Publishes, ChPid, Flow, State) ->
-    {ChPid, Flow, State1} =
-        lists:foldl(fun batch_publish1/2, {ChPid, Flow, State}, Publishes),
-    State2 = ui(State1),
-    a(reduce_memory_use(maybe_update_rates(State2))).
-
-publish_delivered(Msg, MsgProps, ChPid, Flow, State) ->
-    {SeqId, State1} =
-        publish_delivered1(Msg, MsgProps, ChPid, Flow,
-                           fun maybe_write_to_disk/4,
-                           State),
-    {SeqId, a(reduce_memory_use(maybe_update_rates(State1)))}.
-
-batch_publish_delivered(Publishes, ChPid, Flow, State) ->
-    {ChPid, Flow, SeqIds, State1} =
-        lists:foldl(fun batch_publish_delivered1/2,
-                    {ChPid, Flow, [], State}, Publishes),
-    State2 = ui(State1),
-    {lists:reverse(SeqIds), a(reduce_memory_use(maybe_update_rates(State2)))}.
-
-discard(_MsgId, _ChPid, _Flow, State) -> State.
-
-drain_confirmed(State = #vqstate { confirmed = C }) ->
-    case gb_sets:is_empty(C) of
-        true  -> {[], State}; %% common case
-        false -> {gb_sets:to_list(C), State #vqstate {
-                                        confirmed = gb_sets:new() }}
-    end.
-
-dropwhile(Pred, State) ->
-    {MsgProps, State1} =
-        remove_by_predicate(Pred, State),
-    {MsgProps, a(State1)}.
-
-fetchwhile(Pred, Fun, Acc, State) ->
-    {MsgProps, Acc1, State1} =
-         fetch_by_predicate(Pred, Fun, Acc, State),
-    {MsgProps, Acc1, a(State1)}.
-
-fetch(AckRequired, State) ->
-    case queue_out(State) of
-        {empty, State1} ->
-            {empty, a(State1)};
-        {{value, MsgStatus}, State1} ->
-            %% it is possible that the message wasn't read from disk
-            %% at this point, so read it in.
-            {Msg, State2} = read_msg(MsgStatus, State1),
-            {AckTag, State3} = remove(AckRequired, MsgStatus, State2),
-            {{Msg, MsgStatus#msg_status.is_delivered, AckTag}, a(State3)}
-    end.
-
-drop(AckRequired, State) ->
-    case queue_out(State) of
-        {empty, State1} ->
-            {empty, a(State1)};
-        {{value, MsgStatus}, State1} ->
-            {AckTag, State2} = remove(AckRequired, MsgStatus, State1),
-            {{MsgStatus#msg_status.msg_id, AckTag}, a(State2)}
-    end.
-
-ack([], State) ->
-    {[], State};
-%% optimisation: this head is essentially a partial evaluation of the
-%% general case below, for the single-ack case.
-ack([SeqId], State) ->
-    {#msg_status { msg_id        = MsgId,
-                   is_persistent = IsPersistent,
-                   msg_in_store  = MsgInStore,
-                   index_on_disk = IndexOnDisk },
-     State1 = #vqstate { index_state       = IndexState,
-                         msg_store_clients = MSCState,
-                         ack_out_counter   = AckOutCount }} =
-        remove_pending_ack(true, SeqId, State),
-    IndexState1 = case IndexOnDisk of
-                      true  -> rabbit_queue_index:ack([SeqId], IndexState);
-                      false -> IndexState
-                  end,
-    case MsgInStore of
-        true  -> ok = msg_store_remove(MSCState, IsPersistent, [MsgId]);
-        false -> ok
-    end,
-    {[MsgId],
-     a(State1 #vqstate { index_state      = IndexState1,
-                         ack_out_counter  = AckOutCount + 1 })};
-ack(AckTags, State) ->
-    {{IndexOnDiskSeqIds, MsgIdsByStore, AllMsgIds},
-     State1 = #vqstate { index_state       = IndexState,
-                         msg_store_clients = MSCState,
-                         ack_out_counter   = AckOutCount }} =
-        lists:foldl(
-          fun (SeqId, {Acc, State2}) ->
-                  {MsgStatus, State3} = remove_pending_ack(true, SeqId, State2),
-                  {accumulate_ack(MsgStatus, Acc), State3}
-          end, {accumulate_ack_init(), State}, AckTags),
-    IndexState1 = rabbit_queue_index:ack(IndexOnDiskSeqIds, IndexState),
-    remove_msgs_by_id(MsgIdsByStore, MSCState),
-    {lists:reverse(AllMsgIds),
-     a(State1 #vqstate { index_state      = IndexState1,
-                         ack_out_counter  = AckOutCount + length(AckTags) })}.
-
-requeue(AckTags, #vqstate { mode          = default,
-                            delta         = Delta,
-                            q3            = Q3,
-                            q4            = Q4,
-                            in_counter    = InCounter,
-                            len           = Len,
-                            qi_pending_ack = QPA } = State) ->
-    maybe_delay(QPA),
-    {SeqIds,  Q4a, MsgIds,  State1} = queue_merge(lists:sort(AckTags), Q4, [],
-                                                  beta_limit(Q3),
-                                                  fun publish_alpha/2, State),
-    {SeqIds1, Q3a, MsgIds1, State2} = queue_merge(SeqIds, Q3, MsgIds,
-                                                  delta_limit(Delta),
-                                                  fun publish_beta/2, State1),
-    {Delta1, MsgIds2, State3}       = delta_merge(SeqIds1, Delta, MsgIds1,
-                                                  State2),
-    MsgCount = length(MsgIds2),
-    {MsgIds2, a(reduce_memory_use(
-                  maybe_update_rates(
-                    State3 #vqstate { delta      = Delta1,
-                                      q3         = Q3a,
-                                      q4         = Q4a,
-                                      in_counter = InCounter + MsgCount,
-                                      len        = Len + MsgCount })))};
-requeue(AckTags, #vqstate { mode          = lazy,
-                            delta         = Delta,
-                            q3            = Q3,
-                            in_counter    = InCounter,
-                            len           = Len,
-                            qi_pending_ack = QPA } = State) ->
-    maybe_delay(QPA),
-    {SeqIds, Q3a, MsgIds, State1} = queue_merge(lists:sort(AckTags), Q3, [],
-                                                delta_limit(Delta),
-                                                fun publish_beta/2, State),
-    {Delta1, MsgIds1, State2}     = delta_merge(SeqIds, Delta, MsgIds,
-                                                State1),
-    MsgCount = length(MsgIds1),
-    {MsgIds1, a(reduce_memory_use(
-                  maybe_update_rates(
-                    State2 #vqstate { delta      = Delta1,
-                                      q3         = Q3a,
-                                      in_counter = InCounter + MsgCount,
-                                      len        = Len + MsgCount })))}.
-
-ackfold(MsgFun, Acc, State, AckTags) ->
-    {AccN, StateN} =
-        lists:foldl(fun(SeqId, {Acc0, State0}) ->
-                            MsgStatus = lookup_pending_ack(SeqId, State0),
-                            {Msg, State1} = read_msg(MsgStatus, State0),
-                            {MsgFun(Msg, SeqId, Acc0), State1}
-                    end, {Acc, State}, AckTags),
-    {AccN, a(StateN)}.
-
-fold(Fun, Acc, State = #vqstate{index_state = IndexState}) ->
-    {Its, IndexState1} = lists:foldl(fun inext/2, {[], IndexState},
-                                     [msg_iterator(State),
-                                      disk_ack_iterator(State),
-                                      ram_ack_iterator(State),
-                                      qi_ack_iterator(State)]),
-    ifold(Fun, Acc, Its, State#vqstate{index_state = IndexState1}).
-
-len(#vqstate { len = Len, qi_pending_ack = QPA }) ->
-    maybe_delay(QPA),
-    Len.
-
-is_empty(State) -> 0 == len(State).
-
-depth(State) ->
-    len(State) + count_pending_acks(State).
-
-set_ram_duration_target(
-  DurationTarget, State = #vqstate {
-                    rates = #rates { in      = AvgIngressRate,
-                                     out     = AvgEgressRate,
-                                     ack_in  = AvgAckIngressRate,
-                                     ack_out = AvgAckEgressRate },
-                    target_ram_count = TargetRamCount }) ->
-    Rate =
-        AvgEgressRate + AvgIngressRate + AvgAckEgressRate + AvgAckIngressRate,
-    TargetRamCount1 =
-        case DurationTarget of
-            infinity  -> infinity;
-            _         -> trunc(DurationTarget * Rate) %% msgs = sec * msgs/sec
-        end,
-    State1 = State #vqstate { target_ram_count = TargetRamCount1 },
-    a(case TargetRamCount1 == infinity orelse
-          (TargetRamCount =/= infinity andalso
-           TargetRamCount1 >= TargetRamCount) of
-          true  -> State1;
-          false -> reduce_memory_use(State1)
-      end).
-
-maybe_update_rates(State = #vqstate{ in_counter  = InCount,
-                                     out_counter = OutCount })
-  when InCount + OutCount > ?MSGS_PER_RATE_CALC ->
-    update_rates(State);
-maybe_update_rates(State) ->
-    State.
-
-update_rates(State = #vqstate{ in_counter      =     InCount,
-                               out_counter     =    OutCount,
-                               ack_in_counter  =  AckInCount,
-                               ack_out_counter = AckOutCount,
-                               rates = #rates{ in        =     InRate,
-                                               out       =    OutRate,
-                                               ack_in    =  AckInRate,
-                                               ack_out   = AckOutRate,
-                                               timestamp = TS }}) ->
-    Now = time_compat:monotonic_time(),
-
-    Rates = #rates { in        = update_rate(Now, TS,     InCount,     InRate),
-                     out       = update_rate(Now, TS,    OutCount,    OutRate),
-                     ack_in    = update_rate(Now, TS,  AckInCount,  AckInRate),
-                     ack_out   = update_rate(Now, TS, AckOutCount, AckOutRate),
-                     timestamp = Now },
-
-    State#vqstate{ in_counter      = 0,
-                   out_counter     = 0,
-                   ack_in_counter  = 0,
-                   ack_out_counter = 0,
-                   rates           = Rates }.
-
-update_rate(Now, TS, Count, Rate) ->
-    Time = time_compat:convert_time_unit(Now - TS, native, micro_seconds) /
-        ?MICROS_PER_SECOND,
-    if
-        Time == 0 -> Rate;
-        true      -> rabbit_misc:moving_average(Time, ?RATE_AVG_HALF_LIFE,
-                                                Count / Time, Rate)
-    end.
-
-ram_duration(State) ->
-    State1 = #vqstate { rates = #rates { in      = AvgIngressRate,
-                                         out     = AvgEgressRate,
-                                         ack_in  = AvgAckIngressRate,
-                                         ack_out = AvgAckEgressRate },
-                        ram_msg_count      = RamMsgCount,
-                        ram_msg_count_prev = RamMsgCountPrev,
-                        ram_pending_ack    = RPA,
-                        qi_pending_ack     = QPA,
-                        ram_ack_count_prev = RamAckCountPrev } =
-        update_rates(State),
-
-    RamAckCount = gb_trees:size(RPA) + gb_trees:size(QPA),
-
-    Duration = %% msgs+acks / (msgs+acks/sec) == sec
-        case lists:all(fun (X) -> X < 0.01 end,
-                       [AvgEgressRate, AvgIngressRate,
-                        AvgAckEgressRate, AvgAckIngressRate]) of
-            true  -> infinity;
-            false -> (RamMsgCountPrev + RamMsgCount +
-                          RamAckCount + RamAckCountPrev) /
-                         (4 * (AvgEgressRate + AvgIngressRate +
-                                   AvgAckEgressRate + AvgAckIngressRate))
-        end,
-
-    {Duration, State1}.
-
-needs_timeout(#vqstate { index_state = IndexState }) ->
-    case rabbit_queue_index:needs_sync(IndexState) of
-        confirms -> timed;
-        other    -> idle;
-        false    -> false
-    end.
-
-timeout(State = #vqstate { index_state = IndexState }) ->
-    State #vqstate { index_state = rabbit_queue_index:sync(IndexState) }.
-
-handle_pre_hibernate(State = #vqstate { index_state = IndexState }) ->
-    State #vqstate { index_state = rabbit_queue_index:flush(IndexState) }.
-
-resume(State) -> a(reduce_memory_use(State)).
-
-msg_rates(#vqstate { rates = #rates { in  = AvgIngressRate,
-                                      out = AvgEgressRate } }) ->
-    {AvgIngressRate, AvgEgressRate}.
-
-info(messages_ready_ram, #vqstate{ram_msg_count = RamMsgCount}) ->
-    RamMsgCount;
-info(messages_unacknowledged_ram, #vqstate{ram_pending_ack = RPA,
-                                           qi_pending_ack  = QPA}) ->
-    gb_trees:size(RPA) + gb_trees:size(QPA);
-info(messages_ram, State) ->
-    info(messages_ready_ram, State) + info(messages_unacknowledged_ram, State);
-info(messages_persistent, #vqstate{persistent_count = PersistentCount}) ->
-    PersistentCount;
-info(message_bytes, #vqstate{bytes         = Bytes,
-                             unacked_bytes = UBytes}) ->
-    Bytes + UBytes;
-info(message_bytes_ready, #vqstate{bytes = Bytes}) ->
-    Bytes;
-info(message_bytes_unacknowledged, #vqstate{unacked_bytes = UBytes}) ->
-    UBytes;
-info(message_bytes_ram, #vqstate{ram_bytes = RamBytes}) ->
-    RamBytes;
-info(message_bytes_persistent, #vqstate{persistent_bytes = PersistentBytes}) ->
-    PersistentBytes;
-info(head_message_timestamp, #vqstate{
-          q3               = Q3,
-          q4               = Q4,
-          ram_pending_ack  = RPA,
-          qi_pending_ack   = QPA}) ->
-          head_message_timestamp(Q3, Q4, RPA, QPA);
-info(disk_reads, #vqstate{disk_read_count = Count}) ->
-    Count;
-info(disk_writes, #vqstate{disk_write_count = Count}) ->
-    Count;
-info(backing_queue_status, #vqstate {
-          q1 = Q1, q2 = Q2, delta = Delta, q3 = Q3, q4 = Q4,
-          mode             = Mode,
-          len              = Len,
-          target_ram_count = TargetRamCount,
-          next_seq_id      = NextSeqId,
-          rates            = #rates { in      = AvgIngressRate,
-                                      out     = AvgEgressRate,
-                                      ack_in  = AvgAckIngressRate,
-                                      ack_out = AvgAckEgressRate }}) ->
-
-    [ {mode                , Mode},
-      {q1                  , ?QUEUE:len(Q1)},
-      {q2                  , ?QUEUE:len(Q2)},
-      {delta               , Delta},
-      {q3                  , ?QUEUE:len(Q3)},
-      {q4                  , ?QUEUE:len(Q4)},
-      {len                 , Len},
-      {target_ram_count    , TargetRamCount},
-      {next_seq_id         , NextSeqId},
-      {avg_ingress_rate    , AvgIngressRate},
-      {avg_egress_rate     , AvgEgressRate},
-      {avg_ack_ingress_rate, AvgAckIngressRate},
-      {avg_ack_egress_rate , AvgAckEgressRate} ];
-info(Item, _) ->
-    throw({bad_argument, Item}).
-
-invoke(?MODULE, Fun, State) -> Fun(?MODULE, State);
-invoke(      _,   _, State) -> State.
-
-is_duplicate(_Msg, State) -> {false, State}.
-
-set_queue_mode(Mode, State = #vqstate { mode = Mode }) ->
-    State;
-set_queue_mode(lazy, State = #vqstate {
-                                target_ram_count = TargetRamCount }) ->
-    %% To become a lazy queue we need to page everything to disk first.
-    State1 = convert_to_lazy(State),
-    %% restore the original target_ram_count
-    a(State1 #vqstate { mode = lazy, target_ram_count = TargetRamCount });
-set_queue_mode(default, State) ->
-    %% becoming a default queue means loading messages from disk like
-    %% when a queue is recovered.
-    a(maybe_deltas_to_betas(State #vqstate { mode = default }));
-set_queue_mode(_, State) ->
-    State.
-
-zip_msgs_and_acks(Msgs, AckTags, Accumulator, _State) ->
-    lists:foldl(fun ({{#basic_message{ id = Id }, _Props}, AckTag}, Acc) ->
-                        [{Id, AckTag} | Acc]
-                end, Accumulator, lists:zip(Msgs, AckTags)).
-
-convert_to_lazy(State) ->
-    State1 = #vqstate { delta = Delta, q3 = Q3, len = Len } =
-        set_ram_duration_target(0, State),
-    case Delta#delta.count + ?QUEUE:len(Q3) == Len of
-        true ->
-            State1;
-        false ->
-            %% When pushing messages to disk, we might have been
-            %% blocked by the msg_store, so we need to see if we have
-            %% to wait for more credit, and then keep paging messages.
-            %%
-            %% The amqqueue_process could have taken care of this, but
-            %% between the time it receives the bump_credit msg and
-            %% calls BQ:resume to keep paging messages to disk, some
-            %% other request may arrive to the BQ which at this moment
-            %% is not in a proper state for a lazy BQ (unless all
-            %% messages have been paged to disk already).
-            wait_for_msg_store_credit(),
-            convert_to_lazy(State1)
-    end.
-
-wait_for_msg_store_credit() ->
-    case credit_flow:blocked() of
-        true  -> receive
-                     {bump_credit, Msg} ->
-                         credit_flow:handle_bump_msg(Msg)
-                 end;
-        false -> ok
-    end.
-
-%% Get the Timestamp property of the first msg, if present. This is
-%% the one with the oldest timestamp among the heads of the pending
-%% acks and unread queues.  We can't check disk_pending_acks as these
-%% are paged out - we assume some will soon be paged in rather than
-%% forcing it to happen.  Pending ack msgs are included as they are
-%% regarded as unprocessed until acked, this also prevents the result
-%% apparently oscillating during repeated rejects.  Q3 is only checked
-%% when Q4 is empty as any Q4 msg will be earlier.
-head_message_timestamp(Q3, Q4, RPA, QPA) ->
-    HeadMsgs = [ HeadMsgStatus#msg_status.msg ||
-                   HeadMsgStatus <-
-                       [ get_qs_head([Q4, Q3]),
-                         get_pa_head(RPA),
-                         get_pa_head(QPA) ],
-                   HeadMsgStatus /= undefined,
-                   HeadMsgStatus#msg_status.msg /= undefined ],
-
-    Timestamps =
-        [Timestamp || HeadMsg <- HeadMsgs,
-                      Timestamp <- [rabbit_basic:extract_timestamp(
-                                      HeadMsg#basic_message.content)],
-                      Timestamp /= undefined
-        ],
-
-    case Timestamps == [] of
-        true -> '';
-        false -> lists:min(Timestamps)
-    end.
-
-get_qs_head(Qs) ->
-    catch lists:foldl(
-            fun (Q, Acc) ->
-                    case get_q_head(Q) of
-                        undefined -> Acc;
-                        Val -> throw(Val)
-                    end
-            end, undefined, Qs).
-
-get_q_head(Q) ->
-    get_collection_head(Q, fun ?QUEUE:is_empty/1, fun ?QUEUE:peek/1).
-
-get_pa_head(PA) ->
-    get_collection_head(PA, fun gb_trees:is_empty/1, fun gb_trees:smallest/1).
-
-get_collection_head(Col, IsEmpty, GetVal) ->
-    case IsEmpty(Col) of
-        false ->
-            {_, MsgStatus} = GetVal(Col),
-            MsgStatus;
-        true  -> undefined
-    end.
-
-%%----------------------------------------------------------------------------
-%% Minor helpers
-%%----------------------------------------------------------------------------
-a(State = #vqstate { q1 = Q1, q2 = Q2, delta = Delta, q3 = Q3, q4 = Q4,
-                     mode             = default,
-                     len              = Len,
-                     bytes            = Bytes,
-                     unacked_bytes    = UnackedBytes,
-                     persistent_count = PersistentCount,
-                     persistent_bytes = PersistentBytes,
-                     ram_msg_count    = RamMsgCount,
-                     ram_bytes        = RamBytes}) ->
-    E1 = ?QUEUE:is_empty(Q1),
-    E2 = ?QUEUE:is_empty(Q2),
-    ED = Delta#delta.count == 0,
-    E3 = ?QUEUE:is_empty(Q3),
-    E4 = ?QUEUE:is_empty(Q4),
-    LZ = Len == 0,
-
-    %% if q1 has messages then q3 cannot be empty. See publish/6.
-    true = E1 or not E3,
-    %% if q2 has messages then we have messages in delta (paged to
-    %% disk). See push_alphas_to_betas/2.
-    true = E2 or not ED,
-    %% if delta has messages then q3 cannot be empty. This is enforced
-    %% by paging, where min([?SEGMENT_ENTRY_COUNT, len(q3)]) messages
-    %% are always kept on RAM.
-    true = ED or not E3,
-    %% if the queue length is 0, then q3 and q4 must be empty.
-    true = LZ == (E3 and E4),
-
-    true = Len             >= 0,
-    true = Bytes           >= 0,
-    true = UnackedBytes    >= 0,
-    true = PersistentCount >= 0,
-    true = PersistentBytes >= 0,
-    true = RamMsgCount     >= 0,
-    true = RamMsgCount     =< Len,
-    true = RamBytes        >= 0,
-    true = RamBytes        =< Bytes + UnackedBytes,
-
-    State;
-a(State = #vqstate { q1 = Q1, q2 = Q2, delta = Delta, q3 = Q3, q4 = Q4,
-                     mode             = lazy,
-                     len              = Len,
-                     bytes            = Bytes,
-                     unacked_bytes    = UnackedBytes,
-                     persistent_count = PersistentCount,
-                     persistent_bytes = PersistentBytes,
-                     ram_msg_count    = RamMsgCount,
-                     ram_bytes        = RamBytes}) ->
-    E1 = ?QUEUE:is_empty(Q1),
-    E2 = ?QUEUE:is_empty(Q2),
-    ED = Delta#delta.count == 0,
-    E3 = ?QUEUE:is_empty(Q3),
-    E4 = ?QUEUE:is_empty(Q4),
-    LZ = Len == 0,
-    L3 = ?QUEUE:len(Q3),
-
-    %% q1 must always be empty, since q1 only gets messages during
-    %% publish, but for lazy queues messages go straight to delta.
-    true = E1,
-
-    %% q2 only gets messages from q1 when push_alphas_to_betas is
-    %% called for a non empty delta, which won't be the case for a
-    %% lazy queue. This means q2 must always be empty.
-    true = E2,
-
-    %% q4 must always be empty, since q1 only gets messages during
-    %% publish, but for lazy queues messages go straight to delta.
-    true = E4,
-
-    %% if the queue is empty, then delta is empty and q3 is empty.
-    true = LZ == (ED and E3),
-
-    %% There should be no messages in q1, q2, and q4
-    true = Delta#delta.count + L3 == Len,
-
-    true = Len             >= 0,
-    true = Bytes           >= 0,
-    true = UnackedBytes    >= 0,
-    true = PersistentCount >= 0,
-    true = PersistentBytes >= 0,
-    true = RamMsgCount     >= 0,
-    true = RamMsgCount     =< Len,
-    true = RamBytes        >= 0,
-    true = RamBytes        =< Bytes + UnackedBytes,
-
-    State.
-
-d(Delta = #delta { start_seq_id = Start, count = Count, end_seq_id = End })
-  when Start + Count =< End ->
-    Delta.
-
-m(MsgStatus = #msg_status { is_persistent = IsPersistent,
-                            msg_in_store  = MsgInStore,
-                            index_on_disk = IndexOnDisk }) ->
-    true = (not IsPersistent) or IndexOnDisk,
-    true = msg_in_ram(MsgStatus) or MsgInStore,
-    MsgStatus.
-
-one_if(true ) -> 1;
-one_if(false) -> 0.
-
-cons_if(true,   E, L) -> [E | L];
-cons_if(false, _E, L) -> L.
-
-gb_sets_maybe_insert(false, _Val, Set) -> Set;
-gb_sets_maybe_insert(true,   Val, Set) -> gb_sets:add(Val, Set).
-
-msg_status(IsPersistent, IsDelivered, SeqId,
-           Msg = #basic_message {id = MsgId}, MsgProps, IndexMaxSize) ->
-    #msg_status{seq_id        = SeqId,
-                msg_id        = MsgId,
-                msg           = Msg,
-                is_persistent = IsPersistent,
-                is_delivered  = IsDelivered,
-                msg_in_store  = false,
-                index_on_disk = false,
-                persist_to    = determine_persist_to(Msg, MsgProps, IndexMaxSize),
-                msg_props     = MsgProps}.
-
-beta_msg_status({Msg = #basic_message{id = MsgId},
-                 SeqId, MsgProps, IsPersistent, IsDelivered}) ->
-    MS0 = beta_msg_status0(SeqId, MsgProps, IsPersistent, IsDelivered),
-    MS0#msg_status{msg_id       = MsgId,
-                   msg          = Msg,
-                   persist_to   = queue_index,
-                   msg_in_store = false};
-
-beta_msg_status({MsgId, SeqId, MsgProps, IsPersistent, IsDelivered}) ->
-    MS0 = beta_msg_status0(SeqId, MsgProps, IsPersistent, IsDelivered),
-    MS0#msg_status{msg_id       = MsgId,
-                   msg          = undefined,
-                   persist_to   = msg_store,
-                   msg_in_store = true}.
-
-beta_msg_status0(SeqId, MsgProps, IsPersistent, IsDelivered) ->
-  #msg_status{seq_id        = SeqId,
-              msg           = undefined,
-              is_persistent = IsPersistent,
-              is_delivered  = IsDelivered,
-              index_on_disk = true,
-              msg_props     = MsgProps}.
-
-trim_msg_status(MsgStatus) ->
-    case persist_to(MsgStatus) of
-        msg_store   -> MsgStatus#msg_status{msg = undefined};
-        queue_index -> MsgStatus
-    end.
-
-with_msg_store_state({MSCStateP, MSCStateT},  true, Fun) ->
-    {Result, MSCStateP1} = Fun(MSCStateP),
-    {Result, {MSCStateP1, MSCStateT}};
-with_msg_store_state({MSCStateP, MSCStateT}, false, Fun) ->
-    {Result, MSCStateT1} = Fun(MSCStateT),
-    {Result, {MSCStateP, MSCStateT1}}.
-
-with_immutable_msg_store_state(MSCState, IsPersistent, Fun) ->
-    {Res, MSCState} = with_msg_store_state(MSCState, IsPersistent,
-                                           fun (MSCState1) ->
-                                                   {Fun(MSCState1), MSCState1}
-                                           end),
-    Res.
-
-msg_store_client_init(MsgStore, MsgOnDiskFun, Callback) ->
-    msg_store_client_init(MsgStore, rabbit_guid:gen(), MsgOnDiskFun,
-                          Callback).
-
-msg_store_client_init(MsgStore, Ref, MsgOnDiskFun, Callback) ->
-    CloseFDsFun = msg_store_close_fds_fun(MsgStore =:= ?PERSISTENT_MSG_STORE),
-    rabbit_msg_store:client_init(MsgStore, Ref, MsgOnDiskFun,
-                                 fun () -> Callback(?MODULE, CloseFDsFun) end).
-
-msg_store_write(MSCState, IsPersistent, MsgId, Msg) ->
-    with_immutable_msg_store_state(
-      MSCState, IsPersistent,
-      fun (MSCState1) ->
-              rabbit_msg_store:write_flow(MsgId, Msg, MSCState1)
-      end).
-
-msg_store_read(MSCState, IsPersistent, MsgId) ->
-    with_msg_store_state(
-      MSCState, IsPersistent,
-      fun (MSCState1) ->
-              rabbit_msg_store:read(MsgId, MSCState1)
-      end).
-
-msg_store_remove(MSCState, IsPersistent, MsgIds) ->
-    with_immutable_msg_store_state(
-      MSCState, IsPersistent,
-      fun (MCSState1) ->
-              rabbit_msg_store:remove(MsgIds, MCSState1)
-      end).
-
-msg_store_close_fds(MSCState, IsPersistent) ->
-    with_msg_store_state(
-      MSCState, IsPersistent,
-      fun (MSCState1) -> rabbit_msg_store:close_all_indicated(MSCState1) end).
-
-msg_store_close_fds_fun(IsPersistent) ->
-    fun (?MODULE, State = #vqstate { msg_store_clients = MSCState }) ->
-            {ok, MSCState1} = msg_store_close_fds(MSCState, IsPersistent),
-            State #vqstate { msg_store_clients = MSCState1 }
-    end.
-
-maybe_write_delivered(false, _SeqId, IndexState) ->
-    IndexState;
-maybe_write_delivered(true, SeqId, IndexState) ->
-    rabbit_queue_index:deliver([SeqId], IndexState).
-
-betas_from_index_entries(List, TransientThreshold, DelsAndAcksFun, State) ->
-    {Filtered, Delivers, Acks, RamReadyCount, RamBytes} =
-        lists:foldr(
-          fun ({_MsgOrId, SeqId, _MsgProps, IsPersistent, IsDelivered} = M,
-               {Filtered1, Delivers1, Acks1, RRC, RB} = Acc) ->
-                  case SeqId < TransientThreshold andalso not IsPersistent of
-                      true  -> {Filtered1,
-                                cons_if(not IsDelivered, SeqId, Delivers1),
-                                [SeqId | Acks1], RRC, RB};
-                      false -> MsgStatus = m(beta_msg_status(M)),
-                               HaveMsg = msg_in_ram(MsgStatus),
-                               Size = msg_size(MsgStatus),
-                               case is_msg_in_pending_acks(SeqId, State) of
-                                   false -> {?QUEUE:in_r(MsgStatus, Filtered1),
-                                             Delivers1, Acks1,
-                                             RRC + one_if(HaveMsg),
-                                             RB + one_if(HaveMsg) * Size};
-                                   true  -> Acc %% [0]
-                               end
-                  end
-          end, {?QUEUE:new(), [], [], 0, 0}, List),
-    {Filtered, RamReadyCount, RamBytes, DelsAndAcksFun(Delivers, Acks, State)}.
-%% [0] We don't increase RamBytes here, even though it pertains to
-%% unacked messages too, since if HaveMsg then the message must have
-%% been stored in the QI, thus the message must have been in
-%% qi_pending_ack, thus it must already have been in RAM.
-
-is_msg_in_pending_acks(SeqId, #vqstate { ram_pending_ack  = RPA,
-                                         disk_pending_ack = DPA,
-                                         qi_pending_ack   = QPA }) ->
-    (gb_trees:is_defined(SeqId, RPA) orelse
-     gb_trees:is_defined(SeqId, DPA) orelse
-     gb_trees:is_defined(SeqId, QPA)).
-
-expand_delta(SeqId, ?BLANK_DELTA_PATTERN(X)) ->
-    d(#delta { start_seq_id = SeqId, count = 1, end_seq_id = SeqId + 1 });
-expand_delta(SeqId, #delta { start_seq_id = StartSeqId,
-                             count        = Count } = Delta)
-  when SeqId < StartSeqId ->
-    d(Delta #delta { start_seq_id = SeqId, count = Count + 1 });
-expand_delta(SeqId, #delta { count        = Count,
-                             end_seq_id   = EndSeqId } = Delta)
-  when SeqId >= EndSeqId ->
-    d(Delta #delta { count = Count + 1, end_seq_id = SeqId + 1 });
-expand_delta(_SeqId, #delta { count       = Count } = Delta) ->
-    d(Delta #delta { count = Count + 1 }).
-
-%%----------------------------------------------------------------------------
-%% Internal major helpers for Public API
-%%----------------------------------------------------------------------------
-
-init(IsDurable, IndexState, DeltaCount, DeltaBytes, Terms,
-     PersistentClient, TransientClient) ->
-    {LowSeqId, NextSeqId, IndexState1} = rabbit_queue_index:bounds(IndexState),
-
-    {DeltaCount1, DeltaBytes1} =
-        case Terms of
-            non_clean_shutdown -> {DeltaCount, DeltaBytes};
-            _                  -> {proplists:get_value(persistent_count,
-                                                       Terms, DeltaCount),
-                                   proplists:get_value(persistent_bytes,
-                                                       Terms, DeltaBytes)}
-        end,
-    Delta = case DeltaCount1 == 0 andalso DeltaCount /= undefined of
-                true  -> ?BLANK_DELTA;
-                false -> d(#delta { start_seq_id = LowSeqId,
-                                    count        = DeltaCount1,
-                                    end_seq_id   = NextSeqId })
-            end,
-    Now = time_compat:monotonic_time(),
-    IoBatchSize = rabbit_misc:get_env(rabbit, msg_store_io_batch_size,
-                                      ?IO_BATCH_SIZE),
-
-    {ok, IndexMaxSize} = application:get_env(
-                           rabbit, queue_index_embed_msgs_below),
-    State = #vqstate {
-      q1                  = ?QUEUE:new(),
-      q2                  = ?QUEUE:new(),
-      delta               = Delta,
-      q3                  = ?QUEUE:new(),
-      q4                  = ?QUEUE:new(),
-      next_seq_id         = NextSeqId,
-      ram_pending_ack     = gb_trees:empty(),
-      disk_pending_ack    = gb_trees:empty(),
-      qi_pending_ack      = gb_trees:empty(),
-      index_state         = IndexState1,
-      msg_store_clients   = {PersistentClient, TransientClient},
-      durable             = IsDurable,
-      transient_threshold = NextSeqId,
-      qi_embed_msgs_below = IndexMaxSize,
-
-      len                 = DeltaCount1,
-      persistent_count    = DeltaCount1,
-      bytes               = DeltaBytes1,
-      persistent_bytes    = DeltaBytes1,
-
-      target_ram_count    = infinity,
-      ram_msg_count       = 0,
-      ram_msg_count_prev  = 0,
-      ram_ack_count_prev  = 0,
-      ram_bytes           = 0,
-      unacked_bytes       = 0,
-      out_counter         = 0,
-      in_counter          = 0,
-      rates               = blank_rates(Now),
-      msgs_on_disk        = gb_sets:new(),
-      msg_indices_on_disk = gb_sets:new(),
-      unconfirmed         = gb_sets:new(),
-      confirmed           = gb_sets:new(),
-      ack_out_counter     = 0,
-      ack_in_counter      = 0,
-      disk_read_count     = 0,
-      disk_write_count    = 0,
-
-      io_batch_size       = IoBatchSize,
-
-      mode                = default },
-    a(maybe_deltas_to_betas(State)).
-
-blank_rates(Now) ->
-    #rates { in        = 0.0,
-             out       = 0.0,
-             ack_in    = 0.0,
-             ack_out   = 0.0,
-             timestamp = Now}.
-
-in_r(MsgStatus = #msg_status { msg = undefined },
-     State = #vqstate { mode = default, q3 = Q3, q4 = Q4 }) ->
-    case ?QUEUE:is_empty(Q4) of
-        true  -> State #vqstate { q3 = ?QUEUE:in_r(MsgStatus, Q3) };
-        false -> {Msg, State1 = #vqstate { q4 = Q4a }} =
-                     read_msg(MsgStatus, State),
-                 MsgStatus1 = MsgStatus#msg_status{msg = Msg},
-                 stats(ready0, {MsgStatus, MsgStatus1},
-                       State1 #vqstate { q4 = ?QUEUE:in_r(MsgStatus1, Q4a) })
-    end;
-in_r(MsgStatus,
-     State = #vqstate { mode = default, q4 = Q4 }) ->
-    State #vqstate { q4 = ?QUEUE:in_r(MsgStatus, Q4) };
-%% lazy queues
-in_r(MsgStatus = #msg_status { seq_id = SeqId },
-     State = #vqstate { mode = lazy, q3 = Q3, delta = Delta}) ->
-    case ?QUEUE:is_empty(Q3) of
-        true  ->
-            {_MsgStatus1, State1} =
-                maybe_write_to_disk(true, true, MsgStatus, State),
-            State2 = stats(ready0, {MsgStatus, none}, State1),
-            Delta1 = expand_delta(SeqId, Delta),
-            State2 #vqstate{ delta = Delta1 };
-        false ->
-            State #vqstate { q3 = ?QUEUE:in_r(MsgStatus, Q3) }
-    end.
-
-queue_out(State = #vqstate { mode = default, q4 = Q4 }) ->
-    case ?QUEUE:out(Q4) of
-        {empty, _Q4} ->
-            case fetch_from_q3(State) of
-                {empty, _State1} = Result     -> Result;
-                {loaded, {MsgStatus, State1}} -> {{value, MsgStatus}, State1}
-            end;
-        {{value, MsgStatus}, Q4a} ->
-            {{value, MsgStatus}, State #vqstate { q4 = Q4a }}
-    end;
-%% lazy queues
-queue_out(State = #vqstate { mode = lazy }) ->
-    case fetch_from_q3(State) of
-        {empty, _State1} = Result     -> Result;
-        {loaded, {MsgStatus, State1}} -> {{value, MsgStatus}, State1}
-    end.
-
-read_msg(#msg_status{msg           = undefined,
-                     msg_id        = MsgId,
-                     is_persistent = IsPersistent}, State) ->
-    read_msg(MsgId, IsPersistent, State);
-read_msg(#msg_status{msg = Msg}, State) ->
-    {Msg, State}.
-
-read_msg(MsgId, IsPersistent, State = #vqstate{msg_store_clients = MSCState,
-                                               disk_read_count   = Count}) ->
-    {{ok, Msg = #basic_message {}}, MSCState1} =
-        msg_store_read(MSCState, IsPersistent, MsgId),
-    {Msg, State #vqstate {msg_store_clients = MSCState1,
-                          disk_read_count   = Count + 1}}.
-
-stats(Signs, Statuses, State) ->
-    stats0(expand_signs(Signs), expand_statuses(Statuses), State).
-
-expand_signs(ready0)        -> {0, 0, true};
-expand_signs(lazy_pub)      -> {1, 0, true};
-expand_signs({A, B})        -> {A, B, false}.
-
-expand_statuses({none, A})    -> {false,         msg_in_ram(A), A};
-expand_statuses({B,    none}) -> {msg_in_ram(B), false,         B};
-expand_statuses({lazy, A})    -> {false        , false,         A};
-expand_statuses({B,    A})    -> {msg_in_ram(B), msg_in_ram(A), B}.
-
-%% In this function at least, we are religious: the variable name
-%% contains "Ready" or "Unacked" iff that is what it counts. If
-%% neither is present it counts both.
-stats0({DeltaReady, DeltaUnacked, ReadyMsgPaged},
-       {InRamBefore, InRamAfter, MsgStatus},
-       State = #vqstate{len              = ReadyCount,
-                        bytes            = ReadyBytes,
-                        ram_msg_count    = RamReadyCount,
-                        persistent_count = PersistentCount,
-                        unacked_bytes    = UnackedBytes,
-                        ram_bytes        = RamBytes,
-                        persistent_bytes = PersistentBytes}) ->
-    S = msg_size(MsgStatus),
-    DeltaTotal = DeltaReady + DeltaUnacked,
-    DeltaRam = case {InRamBefore, InRamAfter} of
-                   {false, false} ->  0;
-                   {false, true}  ->  1;
-                   {true,  false} -> -1;
-                   {true,  true}  ->  0
-               end,
-    DeltaRamReady = case DeltaReady of
-                        1                    -> one_if(InRamAfter);
-                        -1                   -> -one_if(InRamBefore);
-                        0 when ReadyMsgPaged -> DeltaRam;
-                        0                    -> 0
-                    end,
-    DeltaPersistent = DeltaTotal * one_if(MsgStatus#msg_status.is_persistent),
-    State#vqstate{len               = ReadyCount      + DeltaReady,
-                  ram_msg_count     = RamReadyCount   + DeltaRamReady,
-                  persistent_count  = PersistentCount + DeltaPersistent,
-                  bytes             = ReadyBytes      + DeltaReady       * S,
-                  unacked_bytes     = UnackedBytes    + DeltaUnacked     * S,
-                  ram_bytes         = RamBytes        + DeltaRam         * S,
-                  persistent_bytes  = PersistentBytes + DeltaPersistent  * S}.
-
-msg_size(#msg_status{msg_props = #message_properties{size = Size}}) -> Size.
-
-msg_in_ram(#msg_status{msg = Msg}) -> Msg =/= undefined.
-
-%% first param: AckRequired
-remove(true, MsgStatus = #msg_status {
-               seq_id        = SeqId,
-               is_delivered  = IsDelivered,
-               index_on_disk = IndexOnDisk },
-       State = #vqstate {out_counter       = OutCount,
-                         index_state       = IndexState}) ->
-    %% Mark it delivered if necessary
-    IndexState1 = maybe_write_delivered(
-                    IndexOnDisk andalso not IsDelivered,
-                    SeqId, IndexState),
-
-    State1 = record_pending_ack(
-               MsgStatus #msg_status {
-                 is_delivered = true }, State),
-
-    State2 = stats({-1, 1}, {MsgStatus, MsgStatus}, State1),
-
-    {SeqId, maybe_update_rates(
-              State2 #vqstate {out_counter = OutCount + 1,
-                               index_state = IndexState1})};
-
-%% This function body has the same behaviour as remove_queue_entries/3
-%% but instead of removing messages based on a ?QUEUE, this removes
-%% just one message, the one referenced by the MsgStatus provided.
-remove(false, MsgStatus = #msg_status {
-                seq_id        = SeqId,
-                msg_id        = MsgId,
-                is_persistent = IsPersistent,
-                is_delivered  = IsDelivered,
-                msg_in_store  = MsgInStore,
-                index_on_disk = IndexOnDisk },
-       State = #vqstate {out_counter       = OutCount,
-                         index_state       = IndexState,
-                         msg_store_clients = MSCState}) ->
-    %% Mark it delivered if necessary
-    IndexState1 = maybe_write_delivered(
-                    IndexOnDisk andalso not IsDelivered,
-                    SeqId, IndexState),
-
-    %% Remove from msg_store and queue index, if necessary
-    case MsgInStore of
-        true  -> ok = msg_store_remove(MSCState, IsPersistent, [MsgId]);
-        false -> ok
-    end,
-
-    IndexState2 =
-        case IndexOnDisk of
-            true  -> rabbit_queue_index:ack([SeqId], IndexState1);
-            false -> IndexState1
-        end,
-
-    State1 = stats({-1, 0}, {MsgStatus, none}, State),
-
-    {undefined, maybe_update_rates(
-                  State1 #vqstate {out_counter = OutCount + 1,
-                                   index_state = IndexState2})}.
-
-%% This function exists as a way to improve dropwhile/2
-%% performance. The idea of having this function is to optimise calls
-%% to rabbit_queue_index by batching delivers and acks, instead of
-%% sending them one by one.
-%%
-%% Instead of removing every message as their are popped from the
-%% queue, it first accumulates them and then removes them by calling
-%% remove_queue_entries/3, since the behaviour of
-%% remove_queue_entries/3 when used with
-%% process_delivers_and_acks_fun(deliver_and_ack) is the same as
-%% calling remove(false, MsgStatus, State).
-%%
-%% remove/3 also updates the out_counter in every call, but here we do
-%% it just once at the end.
-remove_by_predicate(Pred, State = #vqstate {out_counter = OutCount}) ->
-    {MsgProps, QAcc, State1} =
-        collect_by_predicate(Pred, ?QUEUE:new(), State),
-    State2 =
-        remove_queue_entries(
-          QAcc, process_delivers_and_acks_fun(deliver_and_ack), State1),
-    %% maybe_update_rates/1 is called in remove/2 for every
-    %% message. Since we update out_counter only once, we call it just
-    %% there.
-    {MsgProps, maybe_update_rates(
-                 State2 #vqstate {
-                   out_counter = OutCount + ?QUEUE:len(QAcc)})}.
-
-%% This function exists as a way to improve fetchwhile/4
-%% performance. The idea of having this function is to optimise calls
-%% to rabbit_queue_index by batching delivers, instead of sending them
-%% one by one.
-%%
-%% Fun is the function passed to fetchwhile/4 that's
-%% applied to every fetched message and used to build the fetchwhile/4
-%% result accumulator FetchAcc.
-fetch_by_predicate(Pred, Fun, FetchAcc,
-                   State = #vqstate {
-                              index_state = IndexState,
-                              out_counter = OutCount}) ->
-    {MsgProps, QAcc, State1} =
-        collect_by_predicate(Pred, ?QUEUE:new(), State),
-
-    {Delivers, FetchAcc1, State2} =
-        process_queue_entries(QAcc, Fun, FetchAcc, State1),
-
-    IndexState1 = rabbit_queue_index:deliver(Delivers, IndexState),
-
-    {MsgProps, FetchAcc1, maybe_update_rates(
-                            State2 #vqstate {
-                              index_state = IndexState1,
-                              out_counter = OutCount + ?QUEUE:len(QAcc)})}.
-
-%% We try to do here the same as what remove(true, State) does but
-%% processing several messages at the same time. The idea is to
-%% optimize rabbit_queue_index:deliver/2 calls by sending a list of
-%% SeqIds instead of one by one, thus process_queue_entries1 will
-%% accumulate the required deliveries, will record_pending_ack for
-%% each message, and will update stats, like remove/2 does.
-%%
-%% For the meaning of Fun and FetchAcc arguments see
-%% fetch_by_predicate/4 above.
-process_queue_entries(Q, Fun, FetchAcc, State) ->
-    ?QUEUE:foldl(fun (MsgStatus, Acc) ->
-                         process_queue_entries1(MsgStatus, Fun, Acc)
-                 end,
-                 {[], FetchAcc, State}, Q).
-
-process_queue_entries1(
-  #msg_status { seq_id = SeqId, is_delivered = IsDelivered,
-                index_on_disk = IndexOnDisk} = MsgStatus,
-  Fun,
-  {Delivers, FetchAcc, State}) ->
-    {Msg, State1} = read_msg(MsgStatus, State),
-    State2 = record_pending_ack(
-               MsgStatus #msg_status {
-                 is_delivered = true }, State1),
-    {cons_if(IndexOnDisk andalso not IsDelivered, SeqId, Delivers),
-     Fun(Msg, SeqId, FetchAcc),
-     stats({-1, 1}, {MsgStatus, MsgStatus}, State2)}.
-
-collect_by_predicate(Pred, QAcc, State) ->
-    case queue_out(State) of
-        {empty, State1} ->
-            {undefined, QAcc, State1};
-        {{value, MsgStatus = #msg_status { msg_props = MsgProps }}, State1} ->
-            case Pred(MsgProps) of
-                true  -> collect_by_predicate(Pred, ?QUEUE:in(MsgStatus, QAcc),
-                                              State1);
-                false -> {MsgProps, QAcc, in_r(MsgStatus, State1)}
-            end
-    end.
-
-%%----------------------------------------------------------------------------
-%% Helpers for Public API purge/1 function
-%%----------------------------------------------------------------------------
-
-%% The difference between purge_when_pending_acks/1
-%% vs. purge_and_index_reset/1 is that the first one issues a deliver
-%% and an ack to the queue index for every message that's being
-%% removed, while the later just resets the queue index state.
-purge_when_pending_acks(State) ->
-    State1 = purge1(process_delivers_and_acks_fun(deliver_and_ack), State),
-    a(State1).
-
-purge_and_index_reset(State) ->
-    State1 = purge1(process_delivers_and_acks_fun(none), State),
-    a(reset_qi_state(State1)).
-
-%% This function removes messages from each of {q1, q2, q3, q4}.
-%%
-%% With remove_queue_entries/3 q1 and q4 are emptied, while q2 and q3
-%% are specially handled by purge_betas_and_deltas/2.
-%%
-%% purge_betas_and_deltas/2 loads messages from the queue index,
-%% filling up q3 and in some cases moving messages form q2 to q3 while
-%% reseting q2 to an empty queue (see maybe_deltas_to_betas/2). The
-%% messages loaded into q3 are removed by calling
-%% remove_queue_entries/3 until there are no more messages to be read
-%% from the queue index. Messages are read in batches from the queue
-%% index.
-purge1(AfterFun, State = #vqstate { q4 = Q4}) ->
-    State1 = remove_queue_entries(Q4, AfterFun, State),
-
-    State2 = #vqstate {q1 = Q1} =
-        purge_betas_and_deltas(AfterFun, State1#vqstate{q4 = ?QUEUE:new()}),
-
-    State3 = remove_queue_entries(Q1, AfterFun, State2),
-
-    a(State3#vqstate{q1 = ?QUEUE:new()}).
-
-reset_qi_state(State = #vqstate{index_state = IndexState}) ->
-    State#vqstate{index_state =
-                         rabbit_queue_index:reset_state(IndexState)}.
-
-is_pending_ack_empty(State) ->
-    count_pending_acks(State) =:= 0.
-
-count_pending_acks(#vqstate { ram_pending_ack   = RPA,
-                              disk_pending_ack  = DPA,
-                              qi_pending_ack    = QPA }) ->
-    gb_trees:size(RPA) + gb_trees:size(DPA) + gb_trees:size(QPA).
-
-purge_betas_and_deltas(DelsAndAcksFun, State = #vqstate { mode = Mode }) ->
-    State0 = #vqstate { q3 = Q3 } =
-        case Mode of
-            lazy -> maybe_deltas_to_betas(DelsAndAcksFun, State);
-            _    -> State
-        end,
-
-    case ?QUEUE:is_empty(Q3) of
-        true  -> State0;
-        false -> State1 = remove_queue_entries(Q3, DelsAndAcksFun, State0),
-                 purge_betas_and_deltas(DelsAndAcksFun,
-                                        maybe_deltas_to_betas(
-                                          DelsAndAcksFun,
-                                          State1#vqstate{q3 = ?QUEUE:new()}))
-    end.
-
-remove_queue_entries(Q, DelsAndAcksFun,
-                     State = #vqstate{msg_store_clients = MSCState}) ->
-    {MsgIdsByStore, Delivers, Acks, State1} =
-        ?QUEUE:foldl(fun remove_queue_entries1/2,
-                     {orddict:new(), [], [], State}, Q),
-    remove_msgs_by_id(MsgIdsByStore, MSCState),
-    DelsAndAcksFun(Delivers, Acks, State1).
-
-remove_queue_entries1(
-  #msg_status { msg_id = MsgId, seq_id = SeqId, is_delivered = IsDelivered,
-                msg_in_store = MsgInStore, index_on_disk = IndexOnDisk,
-                is_persistent = IsPersistent} = MsgStatus,
-  {MsgIdsByStore, Delivers, Acks, State}) ->
-    {case MsgInStore of
-         true  -> rabbit_misc:orddict_cons(IsPersistent, MsgId, MsgIdsByStore);
-         false -> MsgIdsByStore
-     end,
-     cons_if(IndexOnDisk andalso not IsDelivered, SeqId, Delivers),
-     cons_if(IndexOnDisk, SeqId, Acks),
-     stats({-1, 0}, {MsgStatus, none}, State)}.
-
-process_delivers_and_acks_fun(deliver_and_ack) ->
-    fun (Delivers, Acks, State = #vqstate { index_state = IndexState }) ->
-            IndexState1 =
-                rabbit_queue_index:ack(
-                  Acks, rabbit_queue_index:deliver(Delivers, IndexState)),
-            State #vqstate { index_state = IndexState1 }
-    end;
-process_delivers_and_acks_fun(_) ->
-    fun (_, _, State) ->
-            State
-    end.
-
-%%----------------------------------------------------------------------------
-%% Internal gubbins for publishing
-%%----------------------------------------------------------------------------
-
-publish1(Msg = #basic_message { is_persistent = IsPersistent, id = MsgId },
-         MsgProps = #message_properties { needs_confirming = NeedsConfirming },
-         IsDelivered, _ChPid, _Flow, PersistFun,
-         State = #vqstate { q1 = Q1, q3 = Q3, q4 = Q4,
-                            mode                = default,
-                            qi_embed_msgs_below = IndexMaxSize,
-                            next_seq_id         = SeqId,
-                            in_counter          = InCount,
-                            durable             = IsDurable,
-                            unconfirmed         = UC }) ->
-    IsPersistent1 = IsDurable andalso IsPersistent,
-    MsgStatus = msg_status(IsPersistent1, IsDelivered, SeqId, Msg, MsgProps, IndexMaxSize),
-    {MsgStatus1, State1} = PersistFun(false, false, MsgStatus, State),
-    State2 = case ?QUEUE:is_empty(Q3) of
-                 false -> State1 #vqstate { q1 = ?QUEUE:in(m(MsgStatus1), Q1) };
-                 true  -> State1 #vqstate { q4 = ?QUEUE:in(m(MsgStatus1), Q4) }
-             end,
-    InCount1 = InCount + 1,
-    UC1 = gb_sets_maybe_insert(NeedsConfirming, MsgId, UC),
-    stats({1, 0}, {none, MsgStatus1},
-          State2#vqstate{ next_seq_id = SeqId + 1,
-                          in_counter  = InCount1,
-                          unconfirmed = UC1 });
-publish1(Msg = #basic_message { is_persistent = IsPersistent, id = MsgId },
-             MsgProps = #message_properties { needs_confirming = NeedsConfirming },
-             IsDelivered, _ChPid, _Flow, PersistFun,
-             State = #vqstate { mode                = lazy,
-                                qi_embed_msgs_below = IndexMaxSize,
-                                next_seq_id         = SeqId,
-                                in_counter          = InCount,
-                                durable             = IsDurable,
-                                unconfirmed         = UC,
-                                delta               = Delta }) ->
-    IsPersistent1 = IsDurable andalso IsPersistent,
-    MsgStatus = msg_status(IsPersistent1, IsDelivered, SeqId, Msg, MsgProps, IndexMaxSize),
-    {MsgStatus1, State1} = PersistFun(true, true, MsgStatus, State),
-    Delta1 = expand_delta(SeqId, Delta),
-    UC1 = gb_sets_maybe_insert(NeedsConfirming, MsgId, UC),
-    stats(lazy_pub, {lazy, m(MsgStatus1)},
-          State1#vqstate{ delta       = Delta1,
-                          next_seq_id = SeqId + 1,
-                          in_counter  = InCount + 1,
-                          unconfirmed = UC1 }).
-
-batch_publish1({Msg, MsgProps, IsDelivered}, {ChPid, Flow, State}) ->
-    {ChPid, Flow, publish1(Msg, MsgProps, IsDelivered, ChPid, Flow,
-                           fun maybe_prepare_write_to_disk/4, State)}.
-
-publish_delivered1(Msg = #basic_message { is_persistent = IsPersistent,
-                                          id = MsgId },
-                   MsgProps = #message_properties {
-                                 needs_confirming = NeedsConfirming },
-                   _ChPid, _Flow, PersistFun,
-                   State = #vqstate { mode                = default,
-                                      qi_embed_msgs_below = IndexMaxSize,
-                                      next_seq_id         = SeqId,
-                                      out_counter         = OutCount,
-                                      in_counter          = InCount,
-                                      durable             = IsDurable,
-                                      unconfirmed         = UC }) ->
-    IsPersistent1 = IsDurable andalso IsPersistent,
-    MsgStatus = msg_status(IsPersistent1, true, SeqId, Msg, MsgProps, IndexMaxSize),
-    {MsgStatus1, State1} = PersistFun(false, false, MsgStatus, State),
-    State2 = record_pending_ack(m(MsgStatus1), State1),
-    UC1 = gb_sets_maybe_insert(NeedsConfirming, MsgId, UC),
-    State3 = stats({0, 1}, {none, MsgStatus1},
-                   State2 #vqstate { next_seq_id      = SeqId    + 1,
-                                     out_counter      = OutCount + 1,
-                                     in_counter       = InCount  + 1,
-                                     unconfirmed      = UC1 }),
-    {SeqId, State3};
-publish_delivered1(Msg = #basic_message { is_persistent = IsPersistent,
-                                          id = MsgId },
-                   MsgProps = #message_properties {
-                                 needs_confirming = NeedsConfirming },
-                   _ChPid, _Flow, PersistFun,
-                   State = #vqstate { mode                = lazy,
-                                      qi_embed_msgs_below = IndexMaxSize,
-                                      next_seq_id         = SeqId,
-                                      out_counter         = OutCount,
-                                      in_counter          = InCount,
-                                      durable             = IsDurable,
-                                      unconfirmed         = UC }) ->
-    IsPersistent1 = IsDurable andalso IsPersistent,
-    MsgStatus = msg_status(IsPersistent1, true, SeqId, Msg, MsgProps, IndexMaxSize),
-    {MsgStatus1, State1} = PersistFun(true, true, MsgStatus, State),
-    State2 = record_pending_ack(m(MsgStatus1), State1),
-    UC1 = gb_sets_maybe_insert(NeedsConfirming, MsgId, UC),
-    State3 = stats({0, 1}, {none, MsgStatus1},
-                   State2 #vqstate { next_seq_id      = SeqId    + 1,
-                                     out_counter      = OutCount + 1,
-                                     in_counter       = InCount  + 1,
-                                     unconfirmed      = UC1 }),
-    {SeqId, State3}.
-
-batch_publish_delivered1({Msg, MsgProps}, {ChPid, Flow, SeqIds, State}) ->
-    {SeqId, State1} =
-        publish_delivered1(Msg, MsgProps, ChPid, Flow,
-                           fun maybe_prepare_write_to_disk/4,
-                           State),
-    {ChPid, Flow, [SeqId | SeqIds], State1}.
-
-maybe_write_msg_to_disk(_Force, MsgStatus = #msg_status {
-                                  msg_in_store = true }, State) ->
-    {MsgStatus, State};
-maybe_write_msg_to_disk(Force, MsgStatus = #msg_status {
-                                 msg = Msg, msg_id = MsgId,
-                                 is_persistent = IsPersistent },
-                        State = #vqstate{ msg_store_clients = MSCState,
-                                          disk_write_count  = Count})
-  when Force orelse IsPersistent ->
-    case persist_to(MsgStatus) of
-        msg_store   -> ok = msg_store_write(MSCState, IsPersistent, MsgId,
-                                            prepare_to_store(Msg)),
-                       {MsgStatus#msg_status{msg_in_store = true},
-                        State#vqstate{disk_write_count = Count + 1}};
-        queue_index -> {MsgStatus, State}
-    end;
-maybe_write_msg_to_disk(_Force, MsgStatus, State) ->
-    {MsgStatus, State}.
-
-%% Due to certain optimizations made inside
-%% rabbit_queue_index:pre_publish/7 we need to have two separate
-%% functions for index persistence. This one is only used when paging
-%% during memory pressure. We didn't want to modify
-%% maybe_write_index_to_disk/3 because that function is used in other
-%% places.
-maybe_batch_write_index_to_disk(_Force,
-                                MsgStatus = #msg_status {
-                                  index_on_disk = true }, State) ->
-    {MsgStatus, State};
-maybe_batch_write_index_to_disk(Force,
-                                MsgStatus = #msg_status {
-                                  msg           = Msg,
-                                  msg_id        = MsgId,
-                                  seq_id        = SeqId,
-                                  is_persistent = IsPersistent,
-                                  is_delivered  = IsDelivered,
-                                  msg_props     = MsgProps},
-                                State = #vqstate {
-                                           target_ram_count = TargetRamCount,
-                                           disk_write_count = DiskWriteCount,
-                                           index_state      = IndexState})
-  when Force orelse IsPersistent ->
-    {MsgOrId, DiskWriteCount1} =
-        case persist_to(MsgStatus) of
-            msg_store   -> {MsgId, DiskWriteCount};
-            queue_index -> {prepare_to_store(Msg), DiskWriteCount + 1}
-        end,
-    IndexState1 = rabbit_queue_index:pre_publish(
-                    MsgOrId, SeqId, MsgProps, IsPersistent, IsDelivered,
-                    TargetRamCount, IndexState),
-    {MsgStatus#msg_status{index_on_disk = true},
-     State#vqstate{index_state      = IndexState1,
-                   disk_write_count = DiskWriteCount1}};
-maybe_batch_write_index_to_disk(_Force, MsgStatus, State) ->
-    {MsgStatus, State}.
-
-maybe_write_index_to_disk(_Force, MsgStatus = #msg_status {
-                                    index_on_disk = true }, State) ->
-    {MsgStatus, State};
-maybe_write_index_to_disk(Force, MsgStatus = #msg_status {
-                                   msg           = Msg,
-                                   msg_id        = MsgId,
-                                   seq_id        = SeqId,
-                                   is_persistent = IsPersistent,
-                                   is_delivered  = IsDelivered,
-                                   msg_props     = MsgProps},
-                          State = #vqstate{target_ram_count = TargetRamCount,
-                                           disk_write_count = DiskWriteCount,
-                                           index_state      = IndexState})
-  when Force orelse IsPersistent ->
-    {MsgOrId, DiskWriteCount1} =
-        case persist_to(MsgStatus) of
-            msg_store   -> {MsgId, DiskWriteCount};
-            queue_index -> {prepare_to_store(Msg), DiskWriteCount + 1}
-        end,
-    IndexState1 = rabbit_queue_index:publish(
-                    MsgOrId, SeqId, MsgProps, IsPersistent, TargetRamCount,
-                    IndexState),
-    IndexState2 = maybe_write_delivered(IsDelivered, SeqId, IndexState1),
-    {MsgStatus#msg_status{index_on_disk = true},
-     State#vqstate{index_state      = IndexState2,
-                   disk_write_count = DiskWriteCount1}};
-
-maybe_write_index_to_disk(_Force, MsgStatus, State) ->
-    {MsgStatus, State}.
-
-maybe_write_to_disk(ForceMsg, ForceIndex, MsgStatus, State) ->
-    {MsgStatus1, State1} = maybe_write_msg_to_disk(ForceMsg, MsgStatus, State),
-    maybe_write_index_to_disk(ForceIndex, MsgStatus1, State1).
-
-maybe_prepare_write_to_disk(ForceMsg, ForceIndex, MsgStatus, State) ->
-    {MsgStatus1, State1} = maybe_write_msg_to_disk(ForceMsg, MsgStatus, State),
-    maybe_batch_write_index_to_disk(ForceIndex, MsgStatus1, State1).
-
-determine_persist_to(#basic_message{
-                        content = #content{properties     = Props,
-                                           properties_bin = PropsBin}},
-                     #message_properties{size = BodySize},
-                     IndexMaxSize) ->
-    %% The >= is so that you can set the env to 0 and never persist
-    %% to the index.
-    %%
-    %% We want this to be fast, so we avoid size(term_to_binary())
-    %% here, or using the term size estimation from truncate.erl, both
-    %% of which are too slow. So instead, if the message body size
-    %% goes over the limit then we avoid any other checks.
-    %%
-    %% If it doesn't we need to decide if the properties will push
-    %% it past the limit. If we have the encoded properties (usual
-    %% case) we can just check their size. If we don't (message came
-    %% via the direct client), we make a guess based on the number of
-    %% headers.
-    case BodySize >= IndexMaxSize of
-        true  -> msg_store;
-        false -> Est = case is_binary(PropsBin) of
-                           true  -> BodySize + size(PropsBin);
-                           false -> #'P_basic'{headers = Hs} = Props,
-                                    case Hs of
-                                        undefined -> 0;
-                                        _         -> length(Hs)
-                                    end * ?HEADER_GUESS_SIZE + BodySize
-                       end,
-                 case Est >= IndexMaxSize of
-                     true  -> msg_store;
-                     false -> queue_index
-                 end
-    end.
-
-persist_to(#msg_status{persist_to = To}) -> To.
-
-prepare_to_store(Msg) ->
-    Msg#basic_message{
-      %% don't persist any recoverable decoded properties
-      content = rabbit_binary_parser:clear_decoded_content(
-                  Msg #basic_message.content)}.
-
-%%----------------------------------------------------------------------------
-%% Internal gubbins for acks
-%%----------------------------------------------------------------------------
-
-record_pending_ack(#msg_status { seq_id = SeqId } = MsgStatus,
-                   State = #vqstate { ram_pending_ack  = RPA,
-                                      disk_pending_ack = DPA,
-                                      qi_pending_ack   = QPA,
-                                      ack_in_counter   = AckInCount}) ->
-    Insert = fun (Tree) -> gb_trees:insert(SeqId, MsgStatus, Tree) end,
-    {RPA1, DPA1, QPA1} =
-        case {msg_in_ram(MsgStatus), persist_to(MsgStatus)} of
-            {false, _}           -> {RPA, Insert(DPA), QPA};
-            {_,     queue_index} -> {RPA, DPA, Insert(QPA)};
-            {_,     msg_store}   -> {Insert(RPA), DPA, QPA}
-        end,
-    State #vqstate { ram_pending_ack  = RPA1,
-                     disk_pending_ack = DPA1,
-                     qi_pending_ack   = QPA1,
-                     ack_in_counter   = AckInCount + 1}.
-
-lookup_pending_ack(SeqId, #vqstate { ram_pending_ack  = RPA,
-                                     disk_pending_ack = DPA,
-                                     qi_pending_ack   = QPA}) ->
-    case gb_trees:lookup(SeqId, RPA) of
-        {value, V} -> V;
-        none       -> case gb_trees:lookup(SeqId, DPA) of
-                          {value, V} -> V;
-                          none       -> gb_trees:get(SeqId, QPA)
-                      end
-    end.
-
-%% First parameter = UpdateStats
-remove_pending_ack(true, SeqId, State) ->
-    {MsgStatus, State1} = remove_pending_ack(false, SeqId, State),
-    {MsgStatus, stats({0, -1}, {MsgStatus, none}, State1)};
-remove_pending_ack(false, SeqId, State = #vqstate{ram_pending_ack  = RPA,
-                                                  disk_pending_ack = DPA,
-                                                  qi_pending_ack   = QPA}) ->
-    case gb_trees:lookup(SeqId, RPA) of
-        {value, V} -> RPA1 = gb_trees:delete(SeqId, RPA),
-                      {V, State #vqstate { ram_pending_ack = RPA1 }};
-        none       -> case gb_trees:lookup(SeqId, DPA) of
-                          {value, V} ->
-                              DPA1 = gb_trees:delete(SeqId, DPA),
-                              {V, State#vqstate{disk_pending_ack = DPA1}};
-                          none ->
-                              QPA1 = gb_trees:delete(SeqId, QPA),
-                              {gb_trees:get(SeqId, QPA),
-                               State#vqstate{qi_pending_ack = QPA1}}
-                      end
-    end.
-
-purge_pending_ack(KeepPersistent,
-                  State = #vqstate { index_state       = IndexState,
-                                     msg_store_clients = MSCState }) ->
-    {IndexOnDiskSeqIds, MsgIdsByStore, State1} = purge_pending_ack1(State),
-    case KeepPersistent of
-        true  -> remove_transient_msgs_by_id(MsgIdsByStore, MSCState),
-                 State1;
-        false -> IndexState1 =
-                     rabbit_queue_index:ack(IndexOnDiskSeqIds, IndexState),
-                 remove_msgs_by_id(MsgIdsByStore, MSCState),
-                 State1 #vqstate { index_state = IndexState1 }
-    end.
-
-purge_pending_ack_delete_and_terminate(
-  State = #vqstate { index_state       = IndexState,
-                     msg_store_clients = MSCState }) ->
-    {_, MsgIdsByStore, State1} = purge_pending_ack1(State),
-    IndexState1 = rabbit_queue_index:delete_and_terminate(IndexState),
-    remove_msgs_by_id(MsgIdsByStore, MSCState),
-    State1 #vqstate { index_state = IndexState1 }.
-
-purge_pending_ack1(State = #vqstate { ram_pending_ack   = RPA,
-                                      disk_pending_ack  = DPA,
-                                      qi_pending_ack    = QPA }) ->
-    F = fun (_SeqId, MsgStatus, Acc) -> accumulate_ack(MsgStatus, Acc) end,
-    {IndexOnDiskSeqIds, MsgIdsByStore, _AllMsgIds} =
-        rabbit_misc:gb_trees_fold(
-          F, rabbit_misc:gb_trees_fold(
-               F,  rabbit_misc:gb_trees_fold(
-                     F, accumulate_ack_init(), RPA), DPA), QPA),
-    State1 = State #vqstate { ram_pending_ack  = gb_trees:empty(),
-                              disk_pending_ack = gb_trees:empty(),
-                              qi_pending_ack   = gb_trees:empty()},
-    {IndexOnDiskSeqIds, MsgIdsByStore, State1}.
-
-%% MsgIdsByStore is an orddict with two keys:
-%%
-%% true: holds a list of Persistent Message Ids.
-%% false: holds a list of Transient Message Ids.
-%%
-%% When we call orddict:to_list/1 we get two sets of msg ids, where
-%% IsPersistent is either true for persistent messages or false for
-%% transient ones. The msg_store_remove/3 function takes this boolean
-%% flag to determine from which store the messages should be removed
-%% from.
-remove_msgs_by_id(MsgIdsByStore, MSCState) ->
-    [ok = msg_store_remove(MSCState, IsPersistent, MsgIds)
-     || {IsPersistent, MsgIds} <- orddict:to_list(MsgIdsByStore)].
-
-remove_transient_msgs_by_id(MsgIdsByStore, MSCState) ->
-    case orddict:find(false, MsgIdsByStore) of
-        error        -> ok;
-        {ok, MsgIds} -> ok = msg_store_remove(MSCState, false, MsgIds)
-    end.
-
-accumulate_ack_init() -> {[], orddict:new(), []}.
-
-accumulate_ack(#msg_status { seq_id        = SeqId,
-                             msg_id        = MsgId,
-                             is_persistent = IsPersistent,
-                             msg_in_store  = MsgInStore,
-                             index_on_disk = IndexOnDisk },
-               {IndexOnDiskSeqIdsAcc, MsgIdsByStore, AllMsgIds}) ->
-    {cons_if(IndexOnDisk, SeqId, IndexOnDiskSeqIdsAcc),
-     case MsgInStore of
-         true  -> rabbit_misc:orddict_cons(IsPersistent, MsgId, MsgIdsByStore);
-         false -> MsgIdsByStore
-     end,
-     [MsgId | AllMsgIds]}.
-
-%%----------------------------------------------------------------------------
-%% Internal plumbing for confirms (aka publisher acks)
-%%----------------------------------------------------------------------------
-
-record_confirms(MsgIdSet, State = #vqstate { msgs_on_disk        = MOD,
-                                             msg_indices_on_disk = MIOD,
-                                             unconfirmed         = UC,
-                                             confirmed           = C }) ->
-    State #vqstate {
-      msgs_on_disk        = rabbit_misc:gb_sets_difference(MOD,  MsgIdSet),
-      msg_indices_on_disk = rabbit_misc:gb_sets_difference(MIOD, MsgIdSet),
-      unconfirmed         = rabbit_misc:gb_sets_difference(UC,   MsgIdSet),
-      confirmed           = gb_sets:union(C, MsgIdSet) }.
-
-msgs_written_to_disk(Callback, MsgIdSet, ignored) ->
-    Callback(?MODULE,
-             fun (?MODULE, State) -> record_confirms(MsgIdSet, State) end);
-msgs_written_to_disk(Callback, MsgIdSet, written) ->
-    Callback(?MODULE,
-             fun (?MODULE, State = #vqstate { msgs_on_disk        = MOD,
-                                              msg_indices_on_disk = MIOD,
-                                              unconfirmed         = UC }) ->
-                     Confirmed = gb_sets:intersection(UC, MsgIdSet),
-                     record_confirms(gb_sets:intersection(MsgIdSet, MIOD),
-                                     State #vqstate {
-                                       msgs_on_disk =
-                                           gb_sets:union(MOD, Confirmed) })
-             end).
-
-msg_indices_written_to_disk(Callback, MsgIdSet) ->
-    Callback(?MODULE,
-             fun (?MODULE, State = #vqstate { msgs_on_disk        = MOD,
-                                              msg_indices_on_disk = MIOD,
-                                              unconfirmed         = UC }) ->
-                     Confirmed = gb_sets:intersection(UC, MsgIdSet),
-                     record_confirms(gb_sets:intersection(MsgIdSet, MOD),
-                                     State #vqstate {
-                                       msg_indices_on_disk =
-                                           gb_sets:union(MIOD, Confirmed) })
-             end).
-
-msgs_and_indices_written_to_disk(Callback, MsgIdSet) ->
-    Callback(?MODULE,
-             fun (?MODULE, State) -> record_confirms(MsgIdSet, State) end).
-
-%%----------------------------------------------------------------------------
-%% Internal plumbing for requeue
-%%----------------------------------------------------------------------------
-
-publish_alpha(#msg_status { msg = undefined } = MsgStatus, State) ->
-    {Msg, State1} = read_msg(MsgStatus, State),
-    MsgStatus1 = MsgStatus#msg_status { msg = Msg },
-    {MsgStatus1, stats({1, -1}, {MsgStatus, MsgStatus1}, State1)};
-publish_alpha(MsgStatus, State) ->
-    {MsgStatus, stats({1, -1}, {MsgStatus, MsgStatus}, State)}.
-
-publish_beta(MsgStatus, State) ->
-    {MsgStatus1, State1} = maybe_write_to_disk(true, false, MsgStatus, State),
-    MsgStatus2 = m(trim_msg_status(MsgStatus1)),
-    {MsgStatus2, stats({1, -1}, {MsgStatus, MsgStatus2}, State1)}.
-
-%% Rebuild queue, inserting sequence ids to maintain ordering
-queue_merge(SeqIds, Q, MsgIds, Limit, PubFun, State) ->
-    queue_merge(SeqIds, Q, ?QUEUE:new(), MsgIds,
-                Limit, PubFun, State).
-
-queue_merge([SeqId | Rest] = SeqIds, Q, Front, MsgIds,
-            Limit, PubFun, State)
-  when Limit == undefined orelse SeqId < Limit ->
-    case ?QUEUE:out(Q) of
-        {{value, #msg_status { seq_id = SeqIdQ } = MsgStatus}, Q1}
-          when SeqIdQ < SeqId ->
-            %% enqueue from the remaining queue
-            queue_merge(SeqIds, Q1, ?QUEUE:in(MsgStatus, Front), MsgIds,
-                        Limit, PubFun, State);
-        {_, _Q1} ->
-            %% enqueue from the remaining list of sequence ids
-            {MsgStatus, State1} = msg_from_pending_ack(SeqId, State),
-            {#msg_status { msg_id = MsgId } = MsgStatus1, State2} =
-                PubFun(MsgStatus, State1),
-            queue_merge(Rest, Q, ?QUEUE:in(MsgStatus1, Front), [MsgId | MsgIds],
-                        Limit, PubFun, State2)
-    end;
-queue_merge(SeqIds, Q, Front, MsgIds,
-            _Limit, _PubFun, State) ->
-    {SeqIds, ?QUEUE:join(Front, Q), MsgIds, State}.
-
-delta_merge([], Delta, MsgIds, State) ->
-    {Delta, MsgIds, State};
-delta_merge(SeqIds, Delta, MsgIds, State) ->
-    lists:foldl(fun (SeqId, {Delta0, MsgIds0, State0}) ->
-                        {#msg_status { msg_id = MsgId } = MsgStatus, State1} =
-                            msg_from_pending_ack(SeqId, State0),
-                        {_MsgStatus, State2} =
-                            maybe_write_to_disk(true, true, MsgStatus, State1),
-                        {expand_delta(SeqId, Delta0), [MsgId | MsgIds0],
-                         stats({1, -1}, {MsgStatus, none}, State2)}
-                end, {Delta, MsgIds, State}, SeqIds).
-
-%% Mostly opposite of record_pending_ack/2
-msg_from_pending_ack(SeqId, State) ->
-    {#msg_status { msg_props = MsgProps } = MsgStatus, State1} =
-        remove_pending_ack(false, SeqId, State),
-    {MsgStatus #msg_status {
-       msg_props = MsgProps #message_properties { needs_confirming = false } },
-     State1}.
-
-beta_limit(Q) ->
-    case ?QUEUE:peek(Q) of
-        {value, #msg_status { seq_id = SeqId }} -> SeqId;
-        empty                                   -> undefined
-    end.
-
-delta_limit(?BLANK_DELTA_PATTERN(_X))             -> undefined;
-delta_limit(#delta { start_seq_id = StartSeqId }) -> StartSeqId.
-
-%%----------------------------------------------------------------------------
-%% Iterator
-%%----------------------------------------------------------------------------
-
-ram_ack_iterator(State) ->
-    {ack, gb_trees:iterator(State#vqstate.ram_pending_ack)}.
-
-disk_ack_iterator(State) ->
-    {ack, gb_trees:iterator(State#vqstate.disk_pending_ack)}.
-
-qi_ack_iterator(State) ->
-    {ack, gb_trees:iterator(State#vqstate.qi_pending_ack)}.
-
-msg_iterator(State) -> istate(start, State).
-
-istate(start, State) -> {q4,    State#vqstate.q4,    State};
-istate(q4,    State) -> {q3,    State#vqstate.q3,    State};
-istate(q3,    State) -> {delta, State#vqstate.delta, State};
-istate(delta, State) -> {q2,    State#vqstate.q2,    State};
-istate(q2,    State) -> {q1,    State#vqstate.q1,    State};
-istate(q1,   _State) -> done.
-
-next({ack, It}, IndexState) ->
-    case gb_trees:next(It) of
-        none                     -> {empty, IndexState};
-        {_SeqId, MsgStatus, It1} -> Next = {ack, It1},
-                                    {value, MsgStatus, true, Next, IndexState}
-    end;
-next(done, IndexState) -> {empty, IndexState};
-next({delta, #delta{start_seq_id = SeqId,
-                    end_seq_id   = SeqId}, State}, IndexState) ->
-    next(istate(delta, State), IndexState);
-next({delta, #delta{start_seq_id = SeqId,
-                    end_seq_id   = SeqIdEnd} = Delta, State}, IndexState) ->
-    SeqIdB = rabbit_queue_index:next_segment_boundary(SeqId),
-    SeqId1 = lists:min([SeqIdB, SeqIdEnd]),
-    {List, IndexState1} = rabbit_queue_index:read(SeqId, SeqId1, IndexState),
-    next({delta, Delta#delta{start_seq_id = SeqId1}, List, State}, IndexState1);
-next({delta, Delta, [], State}, IndexState) ->
-    next({delta, Delta, State}, IndexState);
-next({delta, Delta, [{_, SeqId, _, _, _} = M | Rest], State}, IndexState) ->
-    case is_msg_in_pending_acks(SeqId, State) of
-        false -> Next = {delta, Delta, Rest, State},
-                 {value, beta_msg_status(M), false, Next, IndexState};
-        true  -> next({delta, Delta, Rest, State}, IndexState)
-    end;
-next({Key, Q, State}, IndexState) ->
-    case ?QUEUE:out(Q) of
-        {empty, _Q}              -> next(istate(Key, State), IndexState);
-        {{value, MsgStatus}, QN} -> Next = {Key, QN, State},
-                                    {value, MsgStatus, false, Next, IndexState}
-    end.
-
-inext(It, {Its, IndexState}) ->
-    case next(It, IndexState) of
-        {empty, IndexState1} ->
-            {Its, IndexState1};
-        {value, MsgStatus1, Unacked, It1, IndexState1} ->
-            {[{MsgStatus1, Unacked, It1} | Its], IndexState1}
-    end.
-
-ifold(_Fun, Acc, [], State) ->
-    {Acc, State};
-ifold(Fun, Acc, Its, State) ->
-    [{MsgStatus, Unacked, It} | Rest] =
-        lists:sort(fun ({#msg_status{seq_id = SeqId1}, _, _},
-                        {#msg_status{seq_id = SeqId2}, _, _}) ->
-                           SeqId1 =< SeqId2
-                   end, Its),
-    {Msg, State1} = read_msg(MsgStatus, State),
-    case Fun(Msg, MsgStatus#msg_status.msg_props, Unacked, Acc) of
-        {stop, Acc1} ->
-            {Acc1, State};
-        {cont, Acc1} ->
-            {Its1, IndexState1} = inext(It, {Rest, State1#vqstate.index_state}),
-            ifold(Fun, Acc1, Its1, State1#vqstate{index_state = IndexState1})
-    end.
-
-%%----------------------------------------------------------------------------
-%% Phase changes
-%%----------------------------------------------------------------------------
-
-reduce_memory_use(State = #vqstate { target_ram_count = infinity }) ->
-    State;
-reduce_memory_use(State = #vqstate {
-                    mode             = default,
-                    ram_pending_ack  = RPA,
-                    ram_msg_count    = RamMsgCount,
-                    target_ram_count = TargetRamCount,
-                    io_batch_size    = IoBatchSize,
-                    rates            = #rates { in      = AvgIngress,
-                                                out     = AvgEgress,
-                                                ack_in  = AvgAckIngress,
-                                                ack_out = AvgAckEgress } }) ->
-
-    State1 = #vqstate { q2 = Q2, q3 = Q3 } =
-        case chunk_size(RamMsgCount + gb_trees:size(RPA), TargetRamCount) of
-            0  -> State;
-            %% Reduce memory of pending acks and alphas. The order is
-            %% determined based on which is growing faster. Whichever
-            %% comes second may very well get a quota of 0 if the
-            %% first manages to push out the max number of messages.
-            S1 -> Funs = case ((AvgAckIngress - AvgAckEgress) >
-                                   (AvgIngress - AvgEgress)) of
-                             true  -> [fun limit_ram_acks/2,
-                                       fun push_alphas_to_betas/2];
-                             false -> [fun push_alphas_to_betas/2,
-                                       fun limit_ram_acks/2]
-                         end,
-                  {_, State2} = lists:foldl(fun (ReduceFun, {QuotaN, StateN}) ->
-                                                    ReduceFun(QuotaN, StateN)
-                                            end, {S1, State}, Funs),
-                  State2
-        end,
-
-    State3 =
-        case chunk_size(?QUEUE:len(Q2) + ?QUEUE:len(Q3),
-                        permitted_beta_count(State1)) of
-            S2 when S2 >= IoBatchSize ->
-                %% There is an implicit, but subtle, upper bound here. We
-                %% may shuffle a lot of messages from Q2/3 into delta, but
-                %% the number of these that require any disk operation,
-                %% namely index writing, i.e. messages that are genuine
-                %% betas and not gammas, is bounded by the credit_flow
-                %% limiting of the alpha->beta conversion above.
-                push_betas_to_deltas(S2, State1);
-            _  ->
-                State1
-        end,
-    %% See rabbitmq-server-290 for the reasons behind this GC call.
-    garbage_collect(),
-    State3;
-%% When using lazy queues, there are no alphas, so we don't need to
-%% call push_alphas_to_betas/2.
-reduce_memory_use(State = #vqstate {
-                             mode = lazy,
-                             ram_pending_ack  = RPA,
-                             ram_msg_count    = RamMsgCount,
-                             target_ram_count = TargetRamCount }) ->
-    State1 = #vqstate { q3 = Q3 } =
-        case chunk_size(RamMsgCount + gb_trees:size(RPA), TargetRamCount) of
-            0  -> State;
-            S1 -> {_, State2} = limit_ram_acks(S1, State),
-                  State2
-        end,
-
-    State3 =
-        case chunk_size(?QUEUE:len(Q3),
-                        permitted_beta_count(State1)) of
-            0  ->
-                State1;
-            S2 ->
-                push_betas_to_deltas(S2, State1)
-        end,
-    garbage_collect(),
-    State3.
-
-limit_ram_acks(0, State) ->
-    {0, ui(State)};
-limit_ram_acks(Quota, State = #vqstate { ram_pending_ack  = RPA,
-                                         disk_pending_ack = DPA }) ->
-    case gb_trees:is_empty(RPA) of
-        true ->
-            {Quota, ui(State)};
-        false ->
-            {SeqId, MsgStatus, RPA1} = gb_trees:take_largest(RPA),
-            {MsgStatus1, State1} =
-                maybe_prepare_write_to_disk(true, false, MsgStatus, State),
-            MsgStatus2 = m(trim_msg_status(MsgStatus1)),
-            DPA1 = gb_trees:insert(SeqId, MsgStatus2, DPA),
-            limit_ram_acks(Quota - 1,
-                           stats({0, 0}, {MsgStatus, MsgStatus2},
-                                 State1 #vqstate { ram_pending_ack  = RPA1,
-                                                   disk_pending_ack = DPA1 }))
-    end.
-
-permitted_beta_count(#vqstate { len = 0 }) ->
-    infinity;
-permitted_beta_count(#vqstate { mode             = lazy,
-                                target_ram_count = TargetRamCount}) ->
-    TargetRamCount;
-permitted_beta_count(#vqstate { target_ram_count = 0, q3 = Q3 }) ->
-    lists:min([?QUEUE:len(Q3), rabbit_queue_index:next_segment_boundary(0)]);
-permitted_beta_count(#vqstate { q1               = Q1,
-                                q4               = Q4,
-                                target_ram_count = TargetRamCount,
-                                len              = Len }) ->
-    BetaDelta = Len - ?QUEUE:len(Q1) - ?QUEUE:len(Q4),
-    lists:max([rabbit_queue_index:next_segment_boundary(0),
-               BetaDelta - ((BetaDelta * BetaDelta) div
-                                (BetaDelta + TargetRamCount))]).
-
-chunk_size(Current, Permitted)
-  when Permitted =:= infinity orelse Permitted >= Current ->
-    0;
-chunk_size(Current, Permitted) ->
-    Current - Permitted.
-
-fetch_from_q3(State = #vqstate { mode  = default,
-                                 q1    = Q1,
-                                 q2    = Q2,
-                                 delta = #delta { count = DeltaCount },
-                                 q3    = Q3,
-                                 q4    = Q4 }) ->
-    case ?QUEUE:out(Q3) of
-        {empty, _Q3} ->
-            {empty, State};
-        {{value, MsgStatus}, Q3a} ->
-            State1 = State #vqstate { q3 = Q3a },
-            State2 = case {?QUEUE:is_empty(Q3a), 0 == DeltaCount} of
-                         {true, true} ->
-                             %% q3 is now empty, it wasn't before;
-                             %% delta is still empty. So q2 must be
-                             %% empty, and we know q4 is empty
-                             %% otherwise we wouldn't be loading from
-                             %% q3. As such, we can just set q4 to Q1.
-                             true = ?QUEUE:is_empty(Q2), %% ASSERTION
-                             true = ?QUEUE:is_empty(Q4), %% ASSERTION
-                             State1 #vqstate { q1 = ?QUEUE:new(), q4 = Q1 };
-                         {true, false} ->
-                             maybe_deltas_to_betas(State1);
-                         {false, _} ->
-                             %% q3 still isn't empty, we've not
-                             %% touched delta, so the invariants
-                             %% between q1, q2, delta and q3 are
-                             %% maintained
-                             State1
-                     end,
-            {loaded, {MsgStatus, State2}}
-    end;
-%% lazy queues
-fetch_from_q3(State = #vqstate { mode  = lazy,
-                                 delta = #delta { count = DeltaCount },
-                                 q3    = Q3 }) ->
-    case ?QUEUE:out(Q3) of
-        {empty, _Q3} when DeltaCount =:= 0 ->
-            {empty, State};
-        {empty, _Q3} ->
-            fetch_from_q3(maybe_deltas_to_betas(State));
-        {{value, MsgStatus}, Q3a} ->
-            State1 = State #vqstate { q3 = Q3a },
-            {loaded, {MsgStatus, State1}}
-    end.
-
-maybe_deltas_to_betas(State) ->
-    AfterFun = process_delivers_and_acks_fun(deliver_and_ack),
-    maybe_deltas_to_betas(AfterFun, State).
-
-maybe_deltas_to_betas(_DelsAndAcksFun,
-                      State = #vqstate {delta = ?BLANK_DELTA_PATTERN(X) }) ->
-    State;
-maybe_deltas_to_betas(DelsAndAcksFun,
-                      State = #vqstate {
-                        q2                   = Q2,
-                        delta                = Delta,
-                        q3                   = Q3,
-                        index_state          = IndexState,
-                        ram_msg_count        = RamMsgCount,
-                        ram_bytes            = RamBytes,
-                        disk_read_count      = DiskReadCount,
-                        transient_threshold  = TransientThreshold }) ->
-    #delta { start_seq_id = DeltaSeqId,
-             count        = DeltaCount,
-             end_seq_id   = DeltaSeqIdEnd } = Delta,
-    DeltaSeqId1 =
-        lists:min([rabbit_queue_index:next_segment_boundary(DeltaSeqId),
-                   DeltaSeqIdEnd]),
-    {List, IndexState1} = rabbit_queue_index:read(DeltaSeqId, DeltaSeqId1,
-                                                  IndexState),
-    {Q3a, RamCountsInc, RamBytesInc, State1} =
-        betas_from_index_entries(List, TransientThreshold,
-                                 DelsAndAcksFun,
-                                 State #vqstate { index_state = IndexState1 }),
-    State2 = State1 #vqstate { ram_msg_count     = RamMsgCount   + RamCountsInc,
-                               ram_bytes         = RamBytes      + RamBytesInc,
-                               disk_read_count   = DiskReadCount + RamCountsInc },
-    case ?QUEUE:len(Q3a) of
-        0 ->
-            %% we ignored every message in the segment due to it being
-            %% transient and below the threshold
-            maybe_deltas_to_betas(
-              DelsAndAcksFun,
-              State2 #vqstate {
-                delta = d(Delta #delta { start_seq_id = DeltaSeqId1 })});
-        Q3aLen ->
-            Q3b = ?QUEUE:join(Q3, Q3a),
-            case DeltaCount - Q3aLen of
-                0 ->
-                    %% delta is now empty, but it wasn't before, so
-                    %% can now join q2 onto q3
-                    State2 #vqstate { q2    = ?QUEUE:new(),
-                                      delta = ?BLANK_DELTA,
-                                      q3    = ?QUEUE:join(Q3b, Q2) };
-                N when N > 0 ->
-                    Delta1 = d(#delta { start_seq_id = DeltaSeqId1,
-                                        count        = N,
-                                        end_seq_id   = DeltaSeqIdEnd }),
-                    State2 #vqstate { delta = Delta1,
-                                      q3    = Q3b }
-            end
-    end.
-
-push_alphas_to_betas(Quota, State) ->
-    {Quota1, State1} =
-        push_alphas_to_betas(
-          fun ?QUEUE:out/1,
-          fun (MsgStatus, Q1a,
-               State0 = #vqstate { q3 = Q3, delta = #delta { count = 0 } }) ->
-                  State0 #vqstate { q1 = Q1a, q3 = ?QUEUE:in(MsgStatus, Q3) };
-              (MsgStatus, Q1a, State0 = #vqstate { q2 = Q2 }) ->
-                  State0 #vqstate { q1 = Q1a, q2 = ?QUEUE:in(MsgStatus, Q2) }
-          end, Quota, State #vqstate.q1, State),
-    {Quota2, State2} =
-        push_alphas_to_betas(
-          fun ?QUEUE:out_r/1,
-          fun (MsgStatus, Q4a, State0 = #vqstate { q3 = Q3 }) ->
-                  State0 #vqstate { q3 = ?QUEUE:in_r(MsgStatus, Q3), q4 = Q4a }
-          end, Quota1, State1 #vqstate.q4, State1),
-    {Quota2, State2}.
-
-push_alphas_to_betas(_Generator, _Consumer, Quota, _Q,
-                     State = #vqstate { ram_msg_count    = RamMsgCount,
-                                        target_ram_count = TargetRamCount })
-  when Quota =:= 0 orelse
-       TargetRamCount =:= infinity orelse
-       TargetRamCount >= RamMsgCount ->
-    {Quota, ui(State)};
-push_alphas_to_betas(Generator, Consumer, Quota, Q, State) ->
-    %% We consume credits from the message_store whenever we need to
-    %% persist a message to disk. See:
-    %% rabbit_variable_queue:msg_store_write/4. So perhaps the
-    %% msg_store is trying to throttle down our queue.
-    case credit_flow:blocked() of
-        true  -> {Quota, ui(State)};
-        false -> case Generator(Q) of
-                     {empty, _Q} ->
-                         {Quota, ui(State)};
-                     {{value, MsgStatus}, Qa} ->
-                         {MsgStatus1, State1} =
-                             maybe_prepare_write_to_disk(true, false, MsgStatus,
-                                                         State),
-                         MsgStatus2 = m(trim_msg_status(MsgStatus1)),
-                         State2 = stats(
-                                    ready0, {MsgStatus, MsgStatus2}, State1),
-                         State3 = Consumer(MsgStatus2, Qa, State2),
-                         push_alphas_to_betas(Generator, Consumer, Quota - 1,
-                                              Qa, State3)
-                 end
-    end.
-
-push_betas_to_deltas(Quota, State = #vqstate { mode  = default,
-                                               q2    = Q2,
-                                               delta = Delta,
-                                               q3    = Q3}) ->
-    PushState = {Quota, Delta, State},
-    {Q3a, PushState1} = push_betas_to_deltas(
-                          fun ?QUEUE:out_r/1,
-                          fun rabbit_queue_index:next_segment_boundary/1,
-                          Q3, PushState),
-    {Q2a, PushState2} = push_betas_to_deltas(
-                          fun ?QUEUE:out/1,
-                          fun (Q2MinSeqId) -> Q2MinSeqId end,
-                          Q2, PushState1),
-    {_, Delta1, State1} = PushState2,
-    State1 #vqstate { q2    = Q2a,
-                      delta = Delta1,
-                      q3    = Q3a };
-%% In the case of lazy queues we want to page as many messages as
-%% possible from q3.
-push_betas_to_deltas(Quota, State = #vqstate { mode  = lazy,
-                                               delta = Delta,
-                                               q3    = Q3}) ->
-    PushState = {Quota, Delta, State},
-    {Q3a, PushState1} = push_betas_to_deltas(
-                          fun ?QUEUE:out_r/1,
-                          fun (Q2MinSeqId) -> Q2MinSeqId end,
-                          Q3, PushState),
-    {_, Delta1, State1} = PushState1,
-    State1 #vqstate { delta = Delta1,
-                      q3    = Q3a }.
-
-
-push_betas_to_deltas(Generator, LimitFun, Q, PushState) ->
-    case ?QUEUE:is_empty(Q) of
-        true ->
-            {Q, PushState};
-        false ->
-            {value, #msg_status { seq_id = MinSeqId }} = ?QUEUE:peek(Q),
-            {value, #msg_status { seq_id = MaxSeqId }} = ?QUEUE:peek_r(Q),
-            Limit = LimitFun(MinSeqId),
-            case MaxSeqId < Limit of
-                true  -> {Q, PushState};
-                false -> push_betas_to_deltas1(Generator, Limit, Q, PushState)
-            end
-    end.
-
-push_betas_to_deltas1(_Generator, _Limit, Q, {0, Delta, State}) ->
-    {Q, {0, Delta, ui(State)}};
-push_betas_to_deltas1(Generator, Limit, Q, {Quota, Delta, State}) ->
-    case Generator(Q) of
-        {empty, _Q} ->
-            {Q, {Quota, Delta, ui(State)}};
-        {{value, #msg_status { seq_id = SeqId }}, _Qa}
-          when SeqId < Limit ->
-            {Q, {Quota, Delta, ui(State)}};
-        {{value, MsgStatus = #msg_status { seq_id = SeqId }}, Qa} ->
-            {#msg_status { index_on_disk = true }, State1} =
-                maybe_batch_write_index_to_disk(true, MsgStatus, State),
-            State2 = stats(ready0, {MsgStatus, none}, State1),
-            Delta1 = expand_delta(SeqId, Delta),
-            push_betas_to_deltas1(Generator, Limit, Qa,
-                                  {Quota - 1, Delta1, State2})
-    end.
-
-%% Flushes queue index batch caches and updates queue index state.
-ui(#vqstate{index_state      = IndexState,
-            target_ram_count = TargetRamCount} = State) ->
-    IndexState1 = rabbit_queue_index:flush_pre_publish_cache(
-                    TargetRamCount, IndexState),
-    State#vqstate{index_state = IndexState1}.
-
-%% Delay
-maybe_delay(QPA) ->
-  case is_timeout_test(gb_trees:values(QPA)) of
-    true -> receive
-              %% The queue received an EXIT message, it's probably the
-              %% node being stopped with "rabbitmqctl stop". Thus, abort
-              %% the wait and requeue the EXIT message.
-              {'EXIT', _, shutdown} = ExitMsg -> self() ! ExitMsg,
-                                                 void
-            after infinity -> void
-            end;
-    _ -> void
-  end.
-
-is_timeout_test([]) -> false;
-is_timeout_test([#msg_status{
-                    msg = #basic_message{
-                             content = #content{
-                                          payload_fragments_rev = PFR}}}|Rem]) ->
-  case lists:member(?TIMEOUT_TEST_MSG, PFR) of
-    T = true -> T;
-    _        -> is_timeout_test(Rem)
-  end;
-is_timeout_test([_|Rem]) -> is_timeout_test(Rem).
-
-%%----------------------------------------------------------------------------
-%% Upgrading
-%%----------------------------------------------------------------------------
-
-multiple_routing_keys() ->
-    transform_storage(
-      fun ({basic_message, ExchangeName, Routing_Key, Content,
-            MsgId, Persistent}) ->
-              {ok, {basic_message, ExchangeName, [Routing_Key], Content,
-                    MsgId, Persistent}};
-          (_) -> {error, corrupt_message}
-      end),
-    ok.
-
-
-%% Assumes message store is not running
-transform_storage(TransformFun) ->
-    transform_store(?PERSISTENT_MSG_STORE, TransformFun),
-    transform_store(?TRANSIENT_MSG_STORE, TransformFun).
-
-transform_store(Store, TransformFun) ->
-    rabbit_msg_store:force_recovery(rabbit_mnesia:dir(), Store),
-    rabbit_msg_store:transform_dir(rabbit_mnesia:dir(), Store, TransformFun).
diff --git a/rabbitmq-server/test/cluster_rename_SUITE.erl b/rabbitmq-server/test/cluster_rename_SUITE.erl
deleted file mode 100644 (file)
index 8ce29a6..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(cluster_rename_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, cluster_size_2},
-      {group, cluster_size_3}
-    ].
-
-groups() ->
-    [
-      {cluster_size_2, [], [
-          % XXX post_change_nodename,
-          abortive_rename,
-          rename_fail,
-          rename_twice_fail
-        ]},
-      {cluster_size_3, [], [
-          rename_cluster_one_by_one,
-          rename_cluster_big_bang,
-          partial_one_by_one,
-          partial_big_bang
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 2} %% Replaced with a list of node names later.
-      ]);
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 3} %% Replaced with a list of node names later.
-      ]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    Nodenames = [
-      list_to_atom(rabbit_misc:format("~s-~b", [Testcase, I]))
-      || I <- lists:seq(1, ClusterSize)
-    ],
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, Nodenames},
-        {rmq_nodes_clustered, true}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = case rabbit_ct_helpers:get_config(Config, save_config) of
-        undefined -> Config;
-        C         -> C
-    end,
-    Config2 = rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config2, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-%% Rolling rename of a cluster, each node should do a secondary rename.
-rename_cluster_one_by_one(Config) ->
-    [Node1, Node2, Node3] = rabbit_ct_broker_helpers:get_node_configs(
-      Config, nodename),
-    publish_all(Config,
-      [{Node1, <<"1">>}, {Node2, <<"2">>}, {Node3, <<"3">>}]),
-
-    Config1 = stop_rename_start(Config,  Node1, [Node1, jessica]),
-    Config2 = stop_rename_start(Config1, Node2, [Node2, hazel]),
-    Config3 = stop_rename_start(Config2, Node3, [Node3, flopsy]),
-
-    [Jessica, Hazel, Flopsy] = rabbit_ct_broker_helpers:get_node_configs(
-      Config3, nodename),
-    consume_all(Config3,
-      [{Jessica, <<"1">>}, {Hazel, <<"2">>}, {Flopsy, <<"3">>}]),
-    {save_config, Config3}.
-
-%% Big bang rename of a cluster, Node1 should do a primary rename.
-rename_cluster_big_bang(Config) ->
-    [Node1, Node2, Node3] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    publish_all(Config,
-      [{Node1, <<"1">>}, {Node2, <<"2">>}, {Node3, <<"3">>}]),
-
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node3),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node2),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node1),
-
-    Map = [Node1, jessica, Node2, hazel, Node3, flopsy],
-    Config1 = rename_node(Config,  Node1, Map),
-    Config2 = rename_node(Config1, Node2, Map),
-    Config3 = rename_node(Config2, Node3, Map),
-
-    [Jessica, Hazel, Flopsy] = rabbit_ct_broker_helpers:get_node_configs(
-      Config3, nodename),
-    ok = rabbit_ct_broker_helpers:start_node(Config3, Jessica),
-    ok = rabbit_ct_broker_helpers:start_node(Config3, Hazel),
-    ok = rabbit_ct_broker_helpers:start_node(Config3, Flopsy),
-
-    consume_all(Config3,
-      [{Jessica, <<"1">>}, {Hazel, <<"2">>}, {Flopsy, <<"3">>}]),
-    {save_config, Config3}.
-
-%% Here we test that Node1 copes with things being renamed around it.
-partial_one_by_one(Config) ->
-    [Node1, Node2, Node3] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    publish_all(Config,
-      [{Node1, <<"1">>}, {Node2, <<"2">>}, {Node3, <<"3">>}]),
-
-    Config1 = stop_rename_start(Config,  Node1, [Node1, jessica]),
-    Config2 = stop_rename_start(Config1, Node2, [Node2, hazel]),
-
-    [Jessica, Hazel, Node3] = rabbit_ct_broker_helpers:get_node_configs(
-      Config2, nodename),
-    consume_all(Config2,
-      [{Jessica, <<"1">>}, {Hazel, <<"2">>}, {Node3, <<"3">>}]),
-    {save_config, Config2}.
-
-%% Here we test that Node1 copes with things being renamed around it.
-partial_big_bang(Config) ->
-    [Node1, Node2, Node3] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    publish_all(Config,
-      [{Node1, <<"1">>}, {Node2, <<"2">>}, {Node3, <<"3">>}]),
-
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node3),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node2),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node1),
-
-    Map = [Node2, hazel, Node3, flopsy],
-    Config1 = rename_node(Config,  Node2, Map),
-    Config2 = rename_node(Config1, Node3, Map),
-
-    [Node1, Hazel, Flopsy] = rabbit_ct_broker_helpers:get_node_configs(Config2,
-      nodename),
-    ok = rabbit_ct_broker_helpers:start_node(Config2, Node1),
-    ok = rabbit_ct_broker_helpers:start_node(Config2, Hazel),
-    ok = rabbit_ct_broker_helpers:start_node(Config2, Flopsy),
-
-    consume_all(Config2,
-      [{Node1, <<"1">>}, {Hazel, <<"2">>}, {Flopsy, <<"3">>}]),
-    {save_config, Config2}.
-
-% XXX %% We should be able to specify the -n parameter on ctl with either
-% XXX %% the before or after name for the local node (since in real cases
-% XXX %% one might want to invoke the command before or after the hostname
-% XXX %% has changed) - usually we test before so here we test after.
-% XXX post_change_nodename([Node1, _Bigwig]) ->
-% XXX     publish(Node1, <<"Node1">>),
-% XXX
-% XXX     Bugs1    = rabbit_test_configs:stop_node(Node1),
-% XXX     Bugs2    = [{nodename, jessica} | proplists:delete(nodename, Bugs1)],
-% XXX     Jessica0 = rename_node(Bugs2, jessica, [Node1, jessica]),
-% XXX     Jessica  = rabbit_test_configs:start_node(Jessica0),
-% XXX
-% XXX     consume(Jessica, <<"Node1">>),
-% XXX     stop_all([Jessica]),
-% XXX     ok.
-
-%% If we invoke rename but the node name does not actually change, we
-%% should roll back.
-abortive_rename(Config) ->
-    Node1 = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    publish(Config, Node1,  <<"Node1">>),
-
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node1),
-    _Config1 = rename_node(Config, Node1, [Node1, jessica]),
-    ok = rabbit_ct_broker_helpers:start_node(Config, Node1),
-
-    consume(Config, Node1, <<"Node1">>),
-    ok.
-
-%% And test some ways the command can fail.
-rename_fail(Config) ->
-    [Node1, Node2] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node1),
-    %% Rename from a node that does not exist
-    ok = rename_node_fail(Config, Node1, [bugzilla, jessica]),
-    %% Rename to a node which does
-    ok = rename_node_fail(Config, Node1, [Node1, Node2]),
-    %% Rename two nodes to the same thing
-    ok = rename_node_fail(Config, Node1, [Node1, jessica, Node2, jessica]),
-    %% Rename while impersonating a node not in the cluster
-    Config1 = rabbit_ct_broker_helpers:set_node_config(Config, Node1,
-      {nodename, 'rabbit@localhost'}),
-    ok = rename_node_fail(Config1, Node1, [Node1, jessica]),
-    ok.
-
-rename_twice_fail(Config) ->
-    Node1 = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Node1),
-    Config1 = rename_node(Config, Node1, [Node1, indecisive]),
-    ok = rename_node_fail(Config, Node1, [indecisive, jessica]),
-    {save_config, Config1}.
-
-%% ----------------------------------------------------------------------------
-
-stop_rename_start(Config, Nodename, Map) ->
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Nodename),
-    Config1 = rename_node(Config, Nodename, Map),
-    ok = rabbit_ct_broker_helpers:start_node(Config1, Nodename),
-    Config1.
-
-rename_node(Config, Nodename, Map) ->
-    {ok, Config1} = do_rename_node(Config, Nodename, Map),
-    Config1.
-
-rename_node_fail(Config, Nodename, Map) ->
-    error = do_rename_node(Config, Nodename, Map),
-    ok.
-
-do_rename_node(Config, Nodename, Map) ->
-    Map1 = [
-      begin
-          NStr = atom_to_list(N),
-          case lists:member($@, NStr) of
-              true  -> N;
-              false -> rabbit_nodes:make({NStr, "localhost"})
-          end
-      end
-      || N <- Map
-    ],
-    Ret = rabbit_ct_broker_helpers:rabbitmqctl(Config, Nodename,
-      ["rename_cluster_node" | Map1]),
-    case Ret of
-        {ok, _} ->
-            Config1 = update_config_after_rename(Config, Map1),
-            {ok, Config1};
-        {error, _, _} ->
-            error
-    end.
-
-update_config_after_rename(Config, [Old, New | Rest]) ->
-    Config1 = rabbit_ct_broker_helpers:set_node_config(Config, Old,
-      {nodename, New}),
-    update_config_after_rename(Config1, Rest);
-update_config_after_rename(Config, []) ->
-    Config.
-
-publish(Config, Node, Q) ->
-    Ch = rabbit_ct_client_helpers:open_channel(Config, Node),
-    amqp_channel:call(Ch, #'confirm.select'{}),
-    amqp_channel:call(Ch, #'queue.declare'{queue = Q, durable = true}),
-    amqp_channel:cast(Ch, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props   = #'P_basic'{delivery_mode = 2},
-                                payload = Q}),
-    amqp_channel:wait_for_confirms(Ch),
-    rabbit_ct_client_helpers:close_channels_and_connection(Config, Node).
-
-consume(Config, Node, Q) ->
-    Ch = rabbit_ct_client_helpers:open_channel(Config, Node),
-    amqp_channel:call(Ch, #'queue.declare'{queue = Q, durable = true}),
-    {#'basic.get_ok'{}, #amqp_msg{payload = Q}} =
-        amqp_channel:call(Ch, #'basic.get'{queue = Q}),
-    rabbit_ct_client_helpers:close_channels_and_connection(Config, Node).
-
-
-publish_all(Config, Nodes) ->
-    [publish(Config, Node, Key) || {Node, Key} <- Nodes].
-
-consume_all(Config, Nodes) ->
-    [consume(Config, Node, Key) || {Node, Key} <- Nodes].
-
-set_node(Nodename, Cfg) ->
-    [{nodename, Nodename} | proplists:delete(nodename, Cfg)].
diff --git a/rabbitmq-server/test/clustering_management_SUITE.erl b/rabbitmq-server/test/clustering_management_SUITE.erl
deleted file mode 100644 (file)
index 00ddfa4..0000000
+++ /dev/null
@@ -1,728 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(clustering_management_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(LOOP_RECURSION_DELAY, 100).
-
-all() ->
-    [
-      {group, unclustered},
-      {group, clustered}
-    ].
-
-groups() ->
-    [
-      {unclustered, [], [
-          {cluster_size_2, [], [
-              erlang_config
-            ]},
-          {cluster_size_3, [], [
-              join_and_part_cluster,
-              join_cluster_bad_operations,
-              join_to_start_interval,
-              forget_cluster_node,
-              change_cluster_node_type,
-              change_cluster_when_node_offline,
-              update_cluster_nodes,
-              force_reset_node
-            ]}
-        ]},
-      {clustered, [], [
-          {cluster_size_2, [], [
-              forget_removes_things,
-              reset_removes_things,
-              forget_offline_removes_things,
-              force_boot,
-              status_with_alarm
-            ]},
-          {cluster_size_4, [], [
-              forget_promotes_offline_slave
-            ]}
-        ]}
-    ].
-
-suite() ->
-    [
-      %% If a test hangs, no need to wait for 30 minutes.
-      {timetrap, {minutes, 5}}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(unclustered, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_clustered, false}]);
-init_per_group(clustered, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_clustered, true}]);
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 2}]);
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 3}]);
-init_per_group(cluster_size_4, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 4}]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-join_and_part_cluster(Config) ->
-    [Rabbit, Hare, Bunny] = cluster_members(Config),
-    assert_not_clustered(Rabbit),
-    assert_not_clustered(Hare),
-    assert_not_clustered(Bunny),
-
-    stop_join_start(Rabbit, Bunny),
-    assert_clustered([Rabbit, Bunny]),
-
-    stop_join_start(Hare, Bunny, true),
-    assert_cluster_status(
-      {[Bunny, Hare, Rabbit], [Bunny, Rabbit], [Bunny, Hare, Rabbit]},
-      [Rabbit, Hare, Bunny]),
-
-    %% Allow clustering with already clustered node
-    ok = stop_app(Rabbit),
-    {ok, already_member} = join_cluster(Rabbit, Hare),
-    ok = start_app(Rabbit),
-
-    stop_reset_start(Rabbit),
-    assert_not_clustered(Rabbit),
-    assert_cluster_status({[Bunny, Hare], [Bunny], [Bunny, Hare]},
-                          [Hare, Bunny]),
-
-    stop_reset_start(Hare),
-    assert_not_clustered(Hare),
-    assert_not_clustered(Bunny).
-
-join_cluster_bad_operations(Config) ->
-    [Rabbit, Hare, Bunny] = cluster_members(Config),
-
-    %% Non-existant node
-    ok = stop_app(Rabbit),
-    assert_failure(fun () -> join_cluster(Rabbit, non@existant) end),
-    ok = start_app(Rabbit),
-    assert_not_clustered(Rabbit),
-
-    %% Trying to cluster with mnesia running
-    assert_failure(fun () -> join_cluster(Rabbit, Bunny) end),
-    assert_not_clustered(Rabbit),
-
-    %% Trying to cluster the node with itself
-    ok = stop_app(Rabbit),
-    assert_failure(fun () -> join_cluster(Rabbit, Rabbit) end),
-    ok = start_app(Rabbit),
-    assert_not_clustered(Rabbit),
-
-    %% Do not let the node leave the cluster or reset if it's the only
-    %% ram node
-    stop_join_start(Hare, Rabbit, true),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit], [Rabbit, Hare]},
-                          [Rabbit, Hare]),
-    ok = stop_app(Hare),
-    assert_failure(fun () -> join_cluster(Rabbit, Bunny) end),
-    assert_failure(fun () -> reset(Rabbit) end),
-    ok = start_app(Hare),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit], [Rabbit, Hare]},
-                          [Rabbit, Hare]),
-
-    %% Cannot start RAM-only node first
-    ok = stop_app(Rabbit),
-    ok = stop_app(Hare),
-    assert_failure(fun () -> start_app(Hare) end),
-    ok = start_app(Rabbit),
-    ok = start_app(Hare),
-    ok.
-
-%% This tests that the nodes in the cluster are notified immediately of a node
-%% join, and not just after the app is started.
-join_to_start_interval(Config) ->
-    [Rabbit, Hare, _Bunny] = cluster_members(Config),
-
-    ok = stop_app(Rabbit),
-    ok = join_cluster(Rabbit, Hare),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit, Hare], [Hare]},
-                          [Rabbit, Hare]),
-    ok = start_app(Rabbit),
-    assert_clustered([Rabbit, Hare]).
-
-forget_cluster_node(Config) ->
-    [Rabbit, Hare, Bunny] = cluster_members(Config),
-
-    %% Trying to remove a node not in the cluster should fail
-    assert_failure(fun () -> forget_cluster_node(Hare, Rabbit) end),
-
-    stop_join_start(Rabbit, Hare),
-    assert_clustered([Rabbit, Hare]),
-
-    %% Trying to remove an online node should fail
-    assert_failure(fun () -> forget_cluster_node(Hare, Rabbit) end),
-
-    ok = stop_app(Rabbit),
-    %% We're passing the --offline flag, but Hare is online
-    assert_failure(fun () -> forget_cluster_node(Hare, Rabbit, true) end),
-    %% Removing some non-existant node will fail
-    assert_failure(fun () -> forget_cluster_node(Hare, non@existant) end),
-    ok = forget_cluster_node(Hare, Rabbit),
-    assert_not_clustered(Hare),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit, Hare], [Hare]},
-                          [Rabbit]),
-
-    %% Now we can't start Rabbit since it thinks that it's still in the cluster
-    %% with Hare, while Hare disagrees.
-    assert_failure(fun () -> start_app(Rabbit) end),
-
-    ok = reset(Rabbit),
-    ok = start_app(Rabbit),
-    assert_not_clustered(Rabbit),
-
-    %% Now we remove Rabbit from an offline node.
-    stop_join_start(Bunny, Hare),
-    stop_join_start(Rabbit, Hare),
-    assert_clustered([Rabbit, Hare, Bunny]),
-    ok = stop_app(Hare),
-    ok = stop_app(Rabbit),
-    ok = stop_app(Bunny),
-    %% This is fine but we need the flag
-    assert_failure(fun () -> forget_cluster_node(Hare, Bunny) end),
-    %% Also fails because hare node is still running
-    assert_failure(fun () -> forget_cluster_node(Hare, Bunny, true) end),
-    %% But this works
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Hare),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Hare,
-      ["forget_cluster_node", "--offline", Bunny]),
-    ok = rabbit_ct_broker_helpers:start_node(Config, Hare),
-    ok = start_app(Rabbit),
-    %% Bunny still thinks its clustered with Rabbit and Hare
-    assert_failure(fun () -> start_app(Bunny) end),
-    ok = reset(Bunny),
-    ok = start_app(Bunny),
-    assert_not_clustered(Bunny),
-    assert_clustered([Rabbit, Hare]).
-
-forget_removes_things(Config) ->
-    test_removes_things(Config, fun (R, H) -> ok = forget_cluster_node(H, R) end).
-
-reset_removes_things(Config) ->
-    test_removes_things(Config, fun (R, _H) -> ok = reset(R) end).
-
-test_removes_things(Config, LoseRabbit) ->
-    Unmirrored = <<"unmirrored-queue">>,
-    [Rabbit, Hare] = cluster_members(Config),
-    RCh = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    declare(RCh, Unmirrored),
-    ok = stop_app(Rabbit),
-
-    HCh = rabbit_ct_client_helpers:open_channel(Config, Hare),
-    {'EXIT',{{shutdown,{server_initiated_close,404,_}}, _}} =
-        (catch declare(HCh, Unmirrored)),
-
-    ok = LoseRabbit(Rabbit, Hare),
-    HCh2 = rabbit_ct_client_helpers:open_channel(Config, Hare),
-    declare(HCh2, Unmirrored),
-    ok.
-
-forget_offline_removes_things(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    Unmirrored = <<"unmirrored-queue">>,
-    X = <<"X">>,
-    RCh = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    declare(RCh, Unmirrored),
-
-    amqp_channel:call(RCh, #'exchange.declare'{durable     = true,
-                                               exchange    = X,
-                                               auto_delete = true}),
-    amqp_channel:call(RCh, #'queue.bind'{queue    = Unmirrored,
-                                         exchange = X}),
-    ok = rabbit_ct_broker_helpers:stop_broker(Config, Rabbit),
-
-    HCh = rabbit_ct_client_helpers:open_channel(Config, Hare),
-    {'EXIT',{{shutdown,{server_initiated_close,404,_}}, _}} =
-        (catch declare(HCh, Unmirrored)),
-
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Hare),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Rabbit),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Hare,
-      ["forget_cluster_node", "--offline", Rabbit]),
-    ok = rabbit_ct_broker_helpers:start_node(Config, Hare),
-
-    HCh2 = rabbit_ct_client_helpers:open_channel(Config, Hare),
-    declare(HCh2, Unmirrored),
-    {'EXIT',{{shutdown,{server_initiated_close,404,_}}, _}} =
-        (catch amqp_channel:call(HCh2,#'exchange.declare'{durable     = true,
-                                                          exchange    = X,
-                                                          auto_delete = true,
-                                                          passive     = true})),
-    ok.
-
-forget_promotes_offline_slave(Config) ->
-    [A, B, C, D] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    Q = <<"mirrored-queue">>,
-    declare(ACh, Q),
-    set_ha_policy(Config, Q, A, [B, C]),
-    set_ha_policy(Config, Q, A, [C, D]), %% Test add and remove from recoverable_slaves
-
-    %% Publish and confirm
-    amqp_channel:call(ACh, #'confirm.select'{}),
-    amqp_channel:cast(ACh, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props = #'P_basic'{delivery_mode = 2}}),
-    amqp_channel:wait_for_confirms(ACh),
-
-    %% We kill nodes rather than stop them in order to make sure
-    %% that we aren't dependent on anything that happens as they shut
-    %% down (see bug 26467).
-    ok = rabbit_ct_broker_helpers:kill_node(Config, D),
-    ok = rabbit_ct_broker_helpers:kill_node(Config, C),
-    ok = rabbit_ct_broker_helpers:kill_node(Config, B),
-    ok = rabbit_ct_broker_helpers:kill_node(Config, A),
-
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, C,
-      ["force_boot"]),
-
-    ok = rabbit_ct_broker_helpers:start_node(Config, C),
-
-    %% We should now have the following dramatis personae:
-    %% A - down, master
-    %% B - down, used to be slave, no longer is, never had the message
-    %% C - running, should be slave, but has wiped the message on restart
-    %% D - down, recoverable slave, contains message
-    %%
-    %% So forgetting A should offline-promote the queue to D, keeping
-    %% the message.
-
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, C,
-      ["forget_cluster_node", A]),
-
-    ok = rabbit_ct_broker_helpers:start_node(Config, D),
-    DCh2 = rabbit_ct_client_helpers:open_channel(Config, D),
-    #'queue.declare_ok'{message_count = 1} = declare(DCh2, Q),
-    ok.
-
-set_ha_policy(Config, Q, Master, Slaves) ->
-    Nodes = [list_to_binary(atom_to_list(N)) || N <- [Master | Slaves]],
-    rabbit_ct_broker_helpers:set_ha_policy(Config, Master, Q,
-      {<<"nodes">>, Nodes}),
-    await_slaves(Q, Master, Slaves).
-
-await_slaves(Q, Master, Slaves) ->
-    {ok, #amqqueue{pid        = MPid,
-                   slave_pids = SPids}} =
-        rpc:call(Master, rabbit_amqqueue, lookup,
-                 [rabbit_misc:r(<<"/">>, queue, Q)]),
-    ActMaster = node(MPid),
-    ActSlaves = lists:usort([node(P) || P <- SPids]),
-    case {Master, lists:usort(Slaves)} of
-        {ActMaster, ActSlaves} -> ok;
-        _                      -> timer:sleep(100),
-                                  await_slaves(Q, Master, Slaves)
-    end.
-
-force_boot(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    {error, _, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Rabbit,
-      ["force_boot"]),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Rabbit),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, Hare),
-    {error, _} = rabbit_ct_broker_helpers:start_node(Config, Rabbit),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Rabbit,
-      ["force_boot"]),
-    ok = rabbit_ct_broker_helpers:start_node(Config, Rabbit),
-    ok.
-
-change_cluster_node_type(Config) ->
-    [Rabbit, Hare, _Bunny] = cluster_members(Config),
-
-    %% Trying to change the ram node when not clustered should always fail
-    ok = stop_app(Rabbit),
-    assert_failure(fun () -> change_cluster_node_type(Rabbit, ram) end),
-    assert_failure(fun () -> change_cluster_node_type(Rabbit, disc) end),
-    ok = start_app(Rabbit),
-
-    ok = stop_app(Rabbit),
-    join_cluster(Rabbit, Hare),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit, Hare], [Hare]},
-                          [Rabbit, Hare]),
-    change_cluster_node_type(Rabbit, ram),
-    assert_cluster_status({[Rabbit, Hare], [Hare], [Hare]},
-                          [Rabbit, Hare]),
-    change_cluster_node_type(Rabbit, disc),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit, Hare], [Hare]},
-                          [Rabbit, Hare]),
-    change_cluster_node_type(Rabbit, ram),
-    ok = start_app(Rabbit),
-    assert_cluster_status({[Rabbit, Hare], [Hare], [Hare, Rabbit]},
-                          [Rabbit, Hare]),
-
-    %% Changing to ram when you're the only ram node should fail
-    ok = stop_app(Hare),
-    assert_failure(fun () -> change_cluster_node_type(Hare, ram) end),
-    ok = start_app(Hare).
-
-change_cluster_when_node_offline(Config) ->
-    [Rabbit, Hare, Bunny] = cluster_members(Config),
-
-    %% Cluster the three notes
-    stop_join_start(Rabbit, Hare),
-    assert_clustered([Rabbit, Hare]),
-
-    stop_join_start(Bunny, Hare),
-    assert_clustered([Rabbit, Hare, Bunny]),
-
-    %% Bring down Rabbit, and remove Bunny from the cluster while
-    %% Rabbit is offline
-    ok = stop_app(Rabbit),
-    ok = stop_app(Bunny),
-    ok = reset(Bunny),
-    assert_cluster_status({[Bunny], [Bunny], []}, [Bunny]),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit, Hare], [Hare]}, [Hare]),
-    assert_cluster_status(
-      {[Rabbit, Hare, Bunny], [Rabbit, Hare, Bunny], [Hare, Bunny]}, [Rabbit]),
-
-    %% Bring Rabbit back up
-    ok = start_app(Rabbit),
-    assert_clustered([Rabbit, Hare]),
-    ok = start_app(Bunny),
-    assert_not_clustered(Bunny),
-
-    %% Now the same, but Rabbit is a RAM node, and we bring up Bunny
-    %% before
-    ok = stop_app(Rabbit),
-    ok = change_cluster_node_type(Rabbit, ram),
-    ok = start_app(Rabbit),
-    stop_join_start(Bunny, Hare),
-    assert_cluster_status(
-      {[Rabbit, Hare, Bunny], [Hare, Bunny], [Rabbit, Hare, Bunny]},
-      [Rabbit, Hare, Bunny]),
-    ok = stop_app(Rabbit),
-    ok = stop_app(Bunny),
-    ok = reset(Bunny),
-    ok = start_app(Bunny),
-    assert_not_clustered(Bunny),
-    assert_cluster_status({[Rabbit, Hare], [Hare], [Hare]}, [Hare]),
-    assert_cluster_status(
-      {[Rabbit, Hare, Bunny], [Hare, Bunny], [Hare, Bunny]},
-      [Rabbit]),
-    ok = start_app(Rabbit),
-    assert_cluster_status({[Rabbit, Hare], [Hare], [Rabbit, Hare]},
-                          [Rabbit, Hare]),
-    assert_not_clustered(Bunny).
-
-update_cluster_nodes(Config) ->
-    [Rabbit, Hare, Bunny] = cluster_members(Config),
-
-    %% Mnesia is running...
-    assert_failure(fun () -> update_cluster_nodes(Rabbit, Hare) end),
-
-    ok = stop_app(Rabbit),
-    ok = join_cluster(Rabbit, Hare),
-    ok = stop_app(Bunny),
-    ok = join_cluster(Bunny, Hare),
-    ok = start_app(Bunny),
-    stop_reset_start(Hare),
-    assert_failure(fun () -> start_app(Rabbit) end),
-    %% Bogus node
-    assert_failure(fun () -> update_cluster_nodes(Rabbit, non@existant) end),
-    %% Inconsisent node
-    assert_failure(fun () -> update_cluster_nodes(Rabbit, Hare) end),
-    ok = update_cluster_nodes(Rabbit, Bunny),
-    ok = start_app(Rabbit),
-    assert_not_clustered(Hare),
-    assert_clustered([Rabbit, Bunny]).
-
-erlang_config(Config) ->
-    [Rabbit, Hare] = cluster_members(Config),
-
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, {[Rabbit], disc}]),
-    ok = start_app(Hare),
-    assert_clustered([Rabbit, Hare]),
-
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, {[Rabbit], ram}]),
-    ok = start_app(Hare),
-    assert_cluster_status({[Rabbit, Hare], [Rabbit], [Rabbit, Hare]},
-                          [Rabbit, Hare]),
-
-    %% Check having a stop_app'ed node around doesn't break completely.
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = stop_app(Rabbit),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, {[Rabbit], disc}]),
-    ok = start_app(Hare),
-    ok = start_app(Rabbit),
-    assert_not_clustered(Hare),
-    assert_not_clustered(Rabbit),
-
-    %% We get a warning but we start anyway
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, {[non@existent], disc}]),
-    ok = start_app(Hare),
-    assert_not_clustered(Hare),
-    assert_not_clustered(Rabbit),
-
-    %% If we use a legacy config file, the node fails to start.
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, [Rabbit]]),
-    assert_failure(fun () -> start_app(Hare) end),
-    assert_not_clustered(Rabbit),
-
-    %% If we use an invalid node name, the node fails to start.
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, {["Mike's computer"], disc}]),
-    assert_failure(fun () -> start_app(Hare) end),
-    assert_not_clustered(Rabbit),
-
-    %% If we use an invalid node type, the node fails to start.
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, {[Rabbit], blue}]),
-    assert_failure(fun () -> start_app(Hare) end),
-    assert_not_clustered(Rabbit),
-
-    %% If we use an invalid cluster_nodes conf, the node fails to start.
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, true]),
-    assert_failure(fun () -> start_app(Hare) end),
-    assert_not_clustered(Rabbit),
-
-    ok = stop_app(Hare),
-    ok = reset(Hare),
-    ok = rpc:call(Hare, application, set_env,
-                  [rabbit, cluster_nodes, "Yes, please"]),
-    assert_failure(fun () -> start_app(Hare) end),
-    assert_not_clustered(Rabbit).
-
-force_reset_node(Config) ->
-    [Rabbit, Hare, _Bunny] = cluster_members(Config),
-
-    stop_join_start(Rabbit, Hare),
-    stop_app(Rabbit),
-    force_reset(Rabbit),
-    %% Hare thinks that Rabbit is still clustered
-    assert_cluster_status({[Rabbit, Hare], [Rabbit, Hare], [Hare]},
-                          [Hare]),
-    %% %% ...but it isn't
-    assert_cluster_status({[Rabbit], [Rabbit], []}, [Rabbit]),
-    %% We can rejoin Rabbit and Hare
-    update_cluster_nodes(Rabbit, Hare),
-    start_app(Rabbit),
-    assert_clustered([Rabbit, Hare]).
-
-status_with_alarm(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-
-    %% Given: an alarm is raised each node.
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, Rabbit,
-      ["set_vm_memory_high_watermark", "0.000000001"]),
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, Hare,
-      ["set_disk_free_limit", "2048G"]),
-
-    %% When: we ask for cluster status.
-    {ok, S} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Rabbit,
-      ["cluster_status"]),
-    {ok, R} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Hare,
-      ["cluster_status"]),
-
-    %% Then: both nodes have printed alarm information for eachother.
-    ok = alarm_information_on_each_node(S, Rabbit, Hare),
-    ok = alarm_information_on_each_node(R, Rabbit, Hare).
-
-
-%% ----------------------------------------------------------------------------
-%% Internal utils
-
-cluster_members(Config) ->
-    rabbit_ct_broker_helpers:get_node_configs(Config, nodename).
-
-assert_cluster_status(Status0, Nodes) ->
-    Status = {AllNodes, _, _} = sort_cluster_status(Status0),
-    wait_for_cluster_status(Status, AllNodes, Nodes).
-
-wait_for_cluster_status(Status, AllNodes, Nodes) ->
-    Max = 10000 / ?LOOP_RECURSION_DELAY,
-    wait_for_cluster_status(0, Max, Status, AllNodes, Nodes).
-
-wait_for_cluster_status(N, Max, Status, _AllNodes, Nodes) when N >= Max ->
-    erlang:error({cluster_status_max_tries_failed,
-                  [{nodes, Nodes},
-                   {expected_status, Status},
-                   {max_tried, Max}]});
-wait_for_cluster_status(N, Max, Status, AllNodes, Nodes) ->
-    case lists:all(fun (Node) ->
-                            verify_status_equal(Node, Status, AllNodes)
-                   end, Nodes) of
-        true  -> ok;
-        false -> timer:sleep(?LOOP_RECURSION_DELAY),
-                 wait_for_cluster_status(N + 1, Max, Status, AllNodes, Nodes)
-    end.
-
-verify_status_equal(Node, Status, AllNodes) ->
-    NodeStatus = sort_cluster_status(cluster_status(Node)),
-    (AllNodes =/= [Node]) =:= rpc:call(Node, rabbit_mnesia, is_clustered, [])
-        andalso NodeStatus =:= Status.
-
-cluster_status(Node) ->
-    {rpc:call(Node, rabbit_mnesia, cluster_nodes, [all]),
-     rpc:call(Node, rabbit_mnesia, cluster_nodes, [disc]),
-     rpc:call(Node, rabbit_mnesia, cluster_nodes, [running])}.
-
-sort_cluster_status({All, Disc, Running}) ->
-    {lists:sort(All), lists:sort(Disc), lists:sort(Running)}.
-
-assert_clustered(Nodes) ->
-    assert_cluster_status({Nodes, Nodes, Nodes}, Nodes).
-
-assert_not_clustered(Node) ->
-    assert_cluster_status({[Node], [Node], [Node]}, [Node]).
-
-assert_failure(Fun) ->
-    case catch Fun() of
-        {error, Reason}                -> Reason;
-        {error_string, Reason}         -> Reason;
-        {badrpc, {'EXIT', Reason}}     -> Reason;
-        {badrpc_multi, Reason, _Nodes} -> Reason;
-        Other                          -> exit({expected_failure, Other})
-    end.
-
-stop_app(Node) ->
-    control_action(stop_app, Node).
-
-start_app(Node) ->
-    control_action(start_app, Node).
-
-join_cluster(Node, To) ->
-    join_cluster(Node, To, false).
-
-join_cluster(Node, To, Ram) ->
-    control_action(join_cluster, Node, [atom_to_list(To)], [{"--ram", Ram}]).
-
-reset(Node) ->
-    control_action(reset, Node).
-
-force_reset(Node) ->
-    control_action(force_reset, Node).
-
-forget_cluster_node(Node, Removee, RemoveWhenOffline) ->
-    control_action(forget_cluster_node, Node, [atom_to_list(Removee)],
-                   [{"--offline", RemoveWhenOffline}]).
-
-forget_cluster_node(Node, Removee) ->
-    forget_cluster_node(Node, Removee, false).
-
-change_cluster_node_type(Node, Type) ->
-    control_action(change_cluster_node_type, Node, [atom_to_list(Type)]).
-
-update_cluster_nodes(Node, DiscoveryNode) ->
-    control_action(update_cluster_nodes, Node, [atom_to_list(DiscoveryNode)]).
-
-stop_join_start(Node, ClusterTo, Ram) ->
-    ok = stop_app(Node),
-    ok = join_cluster(Node, ClusterTo, Ram),
-    ok = start_app(Node).
-
-stop_join_start(Node, ClusterTo) ->
-    stop_join_start(Node, ClusterTo, false).
-
-stop_reset_start(Node) ->
-    ok = stop_app(Node),
-    ok = reset(Node),
-    ok = start_app(Node).
-
-control_action(Command, Node) ->
-    control_action(Command, Node, [], []).
-
-control_action(Command, Node, Args) ->
-    control_action(Command, Node, Args, []).
-
-control_action(Command, Node, Args, Opts) ->
-    rpc:call(Node, rabbit_control_main, action,
-             [Command, Node, Args, Opts,
-              fun io:format/2]).
-
-declare(Ch, Name) ->
-    Res = amqp_channel:call(Ch, #'queue.declare'{durable = true,
-                                                 queue   = Name}),
-    amqp_channel:call(Ch, #'queue.bind'{queue    = Name,
-                                        exchange = <<"amq.fanout">>}),
-    Res.
-
-alarm_information_on_each_node(Output, Rabbit, Hare) ->
-
-    A = string:str(Output, "alarms"), true = A > 0,
-
-    %% Test that names are printed after `alarms': this counts on
-    %% output with a `{Name, Value}' kind of format, for listing
-    %% alarms, so that we can miss any node names in preamble text.
-    Alarms = string:substr(Output, A),
-    RabbitStr = atom_to_list(Rabbit),
-    HareStr = atom_to_list(Hare),
-    match = re:run(Alarms, "\\{'?" ++ RabbitStr ++ "'?,\\[memory\\]\\}",
-      [{capture, none}]),
-    match = re:run(Alarms, "\\{'?" ++ HareStr ++ "'?,\\[disk\\]\\}",
-      [{capture, none}]),
-
-    ok.
diff --git a/rabbitmq-server/test/crashing_queues_SUITE.erl b/rabbitmq-server/test/crashing_queues_SUITE.erl
deleted file mode 100644 (file)
index 872b771..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(crashing_queues_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, cluster_size_2}
-    ].
-
-groups() ->
-    [
-      {cluster_size_2, [], [
-          crashing_unmirrored,
-          crashing_mirrored,
-          give_up_after_repeated_crashes
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 2}
-      ]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-crashing_unmirrored(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ChA = rabbit_ct_client_helpers:open_channel(Config, A),
-    ConnB = rabbit_ct_client_helpers:open_connection(Config, B),
-    QName = <<"crashing_unmirrored-q">>,
-    amqp_channel:call(ChA, #'confirm.select'{}),
-    test_queue_failure(A, ChA, ConnB, 1, 0,
-                       #'queue.declare'{queue = QName, durable = true}),
-    test_queue_failure(A, ChA, ConnB, 0, 0,
-                       #'queue.declare'{queue = QName, durable = false}),
-    ok.
-
-crashing_mirrored(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, <<".*">>, <<"all">>),
-    ChA = rabbit_ct_client_helpers:open_channel(Config, A),
-    ConnB = rabbit_ct_client_helpers:open_connection(Config, B),
-    QName = <<"crashing_mirrored-q">>,
-    amqp_channel:call(ChA, #'confirm.select'{}),
-    test_queue_failure(A, ChA, ConnB, 2, 1,
-                       #'queue.declare'{queue = QName, durable = true}),
-    ok.
-
-test_queue_failure(Node, Ch, RaceConn, MsgCount, SlaveCount, Decl) ->
-    #'queue.declare_ok'{queue = QName} = amqp_channel:call(Ch, Decl),
-    try
-        publish(Ch, QName, transient),
-        publish(Ch, QName, durable),
-        Racer = spawn_declare_racer(RaceConn, Decl),
-        kill_queue(Node, QName),
-        assert_message_count(MsgCount, Ch, QName),
-        assert_slave_count(SlaveCount, Node, QName),
-        stop_declare_racer(Racer)
-    after
-        amqp_channel:call(Ch, #'queue.delete'{queue = QName})
-    end.
-
-give_up_after_repeated_crashes(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ChA = rabbit_ct_client_helpers:open_channel(Config, A),
-    ChB = rabbit_ct_client_helpers:open_channel(Config, B),
-    QName = <<"give_up_after_repeated_crashes-q">>,
-    amqp_channel:call(ChA, #'confirm.select'{}),
-    amqp_channel:call(ChA, #'queue.declare'{queue   = QName,
-                                            durable = true}),
-    await_state(A, QName, running),
-    publish(ChA, QName, durable),
-    kill_queue_hard(A, QName),
-    {'EXIT', _} = (catch amqp_channel:call(
-                           ChA, #'queue.declare'{queue   = QName,
-                                                 durable = true})),
-    await_state(A, QName, crashed),
-    amqp_channel:call(ChB, #'queue.delete'{queue = QName}),
-    amqp_channel:call(ChB, #'queue.declare'{queue   = QName,
-                                            durable = true}),
-    await_state(A, QName, running),
-
-    %% Since it's convenient, also test absent queue status here.
-    rabbit_ct_broker_helpers:stop_node(Config, B),
-    await_state(A, QName, down),
-    ok.
-
-
-publish(Ch, QName, DelMode) ->
-    Publish = #'basic.publish'{exchange = <<>>, routing_key = QName},
-    Msg = #amqp_msg{props = #'P_basic'{delivery_mode = del_mode(DelMode)}},
-    amqp_channel:cast(Ch, Publish, Msg),
-    amqp_channel:wait_for_confirms(Ch).
-
-del_mode(transient) -> 1;
-del_mode(durable)   -> 2.
-
-spawn_declare_racer(Conn, Decl) ->
-    Self = self(),
-    spawn_link(fun() -> declare_racer_loop(Self, Conn, Decl) end).
-
-stop_declare_racer(Pid) ->
-    Pid ! stop,
-    MRef = erlang:monitor(process, Pid),
-    receive
-        {'DOWN', MRef, process, Pid, _} -> ok
-    end.
-
-declare_racer_loop(Parent, Conn, Decl) ->
-    receive
-        stop -> unlink(Parent)
-    after 0 ->
-            %% Catch here because we might happen to catch the queue
-            %% while it is in the middle of recovering and thus
-            %% explode with NOT_FOUND because crashed. Doesn't matter,
-            %% we are only in this loop to try to fool the recovery
-            %% code anyway.
-            try
-                case amqp_connection:open_channel(Conn) of
-                    {ok, Ch} -> amqp_channel:call(Ch, Decl);
-                    closing  -> ok
-                end
-            catch
-                exit:_ ->
-                    ok
-            end,
-            declare_racer_loop(Parent, Conn, Decl)
-    end.
-
-await_state(Node, QName, State) ->
-    await_state(Node, QName, State, 30000).
-
-await_state(Node, QName, State, Time) ->
-    case state(Node, QName) of
-        State ->
-            ok;
-        Other ->
-            case Time of
-                0 -> exit({timeout_awaiting_state, State, Other});
-                _ -> timer:sleep(100),
-                     await_state(Node, QName, State, Time - 100)
-            end
-    end.
-
-state(Node, QName) ->
-    V = <<"/">>,
-    Res = rabbit_misc:r(V, queue, QName),
-    Infos = rpc:call(Node, rabbit_amqqueue, info_all, [V, [name, state]]),
-    case Infos of
-        []                               -> undefined;
-        [[{name,  Res}, {state, State}]] -> State
-    end.
-
-kill_queue_hard(Node, QName) ->
-    case kill_queue(Node, QName) of
-        crashed -> ok;
-        _NewPid -> timer:sleep(100),
-                   kill_queue_hard(Node, QName)
-    end.
-
-kill_queue(Node, QName) ->
-    Pid1 = queue_pid(Node, QName),
-    exit(Pid1, boom),
-    await_new_pid(Node, QName, Pid1).
-
-queue_pid(Node, QName) ->
-    #amqqueue{pid   = QPid,
-              state = State} = lookup(Node, QName),
-    case State of
-        crashed -> case sup_child(Node, rabbit_amqqueue_sup_sup) of
-                       {ok, _}           -> QPid;   %% restarting
-                       {error, no_child} -> crashed %% given up
-                   end;
-        _       -> QPid
-    end.
-
-sup_child(Node, Sup) ->
-    case rpc:call(Node, supervisor2, which_children, [Sup]) of
-        [{_, Child, _, _}]              -> {ok, Child};
-        []                              -> {error, no_child};
-        {badrpc, {'EXIT', {noproc, _}}} -> {error, no_sup}
-    end.
-
-lookup(Node, QName) ->
-    {ok, Q} = rpc:call(Node, rabbit_amqqueue, lookup,
-                       [rabbit_misc:r(<<"/">>, queue, QName)]),
-    Q.
-
-await_new_pid(Node, QName, OldPid) ->
-    case queue_pid(Node, QName) of
-        OldPid -> timer:sleep(10),
-                  await_new_pid(Node, QName, OldPid);
-        New    -> New
-    end.
-
-assert_message_count(Count, Ch, QName) ->
-    #'queue.declare_ok'{message_count = Count} =
-        amqp_channel:call(Ch, #'queue.declare'{queue   = QName,
-                                               passive = true}).
-
-assert_slave_count(Count, Node, QName) ->
-    Q = lookup(Node, QName),
-    [{_, Pids}] = rpc:call(Node, rabbit_amqqueue, info, [Q, [slave_pids]]),
-    RealCount = case Pids of
-                    '' -> 0;
-                    _  -> length(Pids)
-                end,
-    case RealCount of
-        Count ->
-            ok;
-        _ when RealCount < Count ->
-            timer:sleep(10),
-            assert_slave_count(Count, Node, QName);
-        _ ->
-            exit({too_many_slaves, Count, RealCount})
-    end.
diff --git a/rabbitmq-server/test/dummy_event_receiver.erl b/rabbitmq-server/test/dummy_event_receiver.erl
deleted file mode 100644 (file)
index 75db367..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(dummy_event_receiver).
-
--export([start/3, stop/0]).
-
--export([init/1, handle_call/2, handle_event/2, handle_info/2,
-         terminate/2, code_change/3]).
-
--include("rabbit.hrl").
-
-start(Pid, Nodes, Types) ->
-    Oks = [ok || _ <- Nodes],
-    {Oks, _} = rpc:multicall(Nodes, gen_event, add_handler,
-                             [rabbit_event, ?MODULE, [Pid, Types]]).
-
-stop() ->
-    gen_event:delete_handler(rabbit_event, ?MODULE, []).
-
-%%----------------------------------------------------------------------------
-
-init([Pid, Types]) ->
-    {ok, {Pid, Types}}.
-
-handle_call(_Request, State) ->
-    {ok, not_understood, State}.
-
-handle_event(Event = #event{type = Type}, State = {Pid, Types}) ->
-    case lists:member(Type, Types) of
-        true  -> Pid ! Event;
-        false -> ok
-    end,
-    {ok, State}.
-
-handle_info(_Info, State) ->
-    {ok, State}.
-
-terminate(_Arg, _State) ->
-    ok.
-
-code_change(_OldVsn, State, _Extra) ->
-    {ok, State}.
-
-%%----------------------------------------------------------------------------
diff --git a/rabbitmq-server/test/dummy_runtime_parameters.erl b/rabbitmq-server/test/dummy_runtime_parameters.erl
deleted file mode 100644 (file)
index d80ec78..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(dummy_runtime_parameters).
--behaviour(rabbit_runtime_parameter).
--behaviour(rabbit_policy_validator).
-
--include("rabbit.hrl").
-
--export([validate/5, notify/4, notify_clear/3]).
--export([register/0, unregister/0]).
--export([validate_policy/1]).
--export([register_policy_validator/0, unregister_policy_validator/0]).
-
-%----------------------------------------------------------------------------
-
-register() ->
-    rabbit_registry:register(runtime_parameter, <<"test">>, ?MODULE).
-
-unregister() ->
-    rabbit_registry:unregister(runtime_parameter, <<"test">>).
-
-validate(_, <<"test">>, <<"good">>,  _Term, _User)      -> ok;
-validate(_, <<"test">>, <<"maybe">>, <<"good">>, _User) -> ok;
-validate(_, <<"test">>, <<"admin">>, _Term, none)       -> ok;
-validate(_, <<"test">>, <<"admin">>, _Term, User) ->
-    case lists:member(administrator, User#user.tags) of
-        true  -> ok;
-        false -> {error, "meh", []}
-    end;
-validate(_, <<"test">>, _, _, _)                        -> {error, "meh", []}.
-
-notify(_, _, _, _) -> ok.
-notify_clear(_, _, _) -> ok.
-
-%----------------------------------------------------------------------------
-
-register_policy_validator() ->
-    rabbit_registry:register(policy_validator, <<"testeven">>, ?MODULE),
-    rabbit_registry:register(policy_validator, <<"testpos">>,  ?MODULE).
-
-unregister_policy_validator() ->
-    rabbit_registry:unregister(policy_validator, <<"testeven">>),
-    rabbit_registry:unregister(policy_validator, <<"testpos">>).
-
-validate_policy([{<<"testeven">>, Terms}]) when is_list(Terms) ->
-    case  length(Terms) rem 2 =:= 0 of
-        true  -> ok;
-        false -> {error, "meh", []}
-    end;
-
-validate_policy([{<<"testpos">>, Terms}]) when is_list(Terms) ->
-    case lists:all(fun (N) -> is_integer(N) andalso N > 0 end, Terms) of
-        true  -> ok;
-        false -> {error, "meh", []}
-    end;
-
-validate_policy(_) ->
-    {error, "meh", []}.
diff --git a/rabbitmq-server/test/dummy_supervisor2.erl b/rabbitmq-server/test/dummy_supervisor2.erl
deleted file mode 100644 (file)
index 9ca3f63..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(dummy_supervisor2).
-
--behaviour(supervisor2).
-
--export([
-    start_link/0,
-    init/1
-  ]).
-
-start_link() ->
-    Pid = spawn_link(fun () ->
-                             process_flag(trap_exit, true),
-                             receive stop -> ok end
-                     end),
-    {ok, Pid}.
-
-init([Timeout]) ->
-    {ok, {{one_for_one, 0, 1},
-          [{test_sup, {supervisor2, start_link,
-                       [{local, ?MODULE}, ?MODULE, []]},
-            transient, Timeout, supervisor, [?MODULE]}]}};
-init([]) ->
-    {ok, {{simple_one_for_one, 0, 1},
-          [{test_worker, {?MODULE, start_link, []},
-            temporary, 1000, worker, [?MODULE]}]}}.
diff --git a/rabbitmq-server/test/dynamic_ha_SUITE.erl b/rabbitmq-server/test/dynamic_ha_SUITE.erl
deleted file mode 100644 (file)
index 5872d97..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(dynamic_ha_SUITE).
-
-%% rabbit_tests:test_dynamic_mirroring() is a unit test which should
-%% test the logic of what all the policies decide to do, so we don't
-%% need to exhaustively test that here. What we need to test is that:
-%%
-%% * Going from non-mirrored to mirrored works and vice versa
-%% * Changing policy can add / remove mirrors and change the master
-%% * Adding a node will create a new mirror when there are not enough nodes
-%%   for the policy
-%% * Removing a node will not create a new mirror even if the policy
-%%   logic wants it (since this gives us a good way to lose messages
-%%   on cluster shutdown, by repeated failover to new nodes)
-%%
-%% The first two are change_policy, the last two are change_cluster
-
--include_lib("common_test/include/ct.hrl").
--include_lib("eunit/include/eunit.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(QNAME, <<"ha.test">>).
--define(POLICY, <<"^ha.test$">>). %% " emacs
--define(VHOST, <<"/">>).
-
-all() ->
-    [
-      {group, unclustered},
-      {group, clustered}
-    ].
-
-groups() ->
-    [
-      {unclustered, [], [
-          {cluster_size_5, [], [
-              change_cluster
-            ]}
-        ]},
-      {clustered, [], [
-          {cluster_size_2, [], [
-              vhost_deletion,
-              promote_on_shutdown
-            ]},
-          {cluster_size_3, [], [
-              change_policy,
-              rapid_change
-            ]}
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(unclustered, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_clustered, false}]);
-init_per_group(clustered, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_clustered, true}]);
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 2}]);
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 3}]);
-init_per_group(cluster_size_5, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 5}]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-change_policy(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-
-    %% When we first declare a queue with no policy, it's not HA.
-    amqp_channel:call(ACh, #'queue.declare'{queue = ?QNAME}),
-    assert_slaves(A, ?QNAME, {A, ''}),
-
-    %% Give it policy "all", it becomes HA and gets all mirrors
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, ?POLICY, <<"all">>),
-    assert_slaves(A, ?QNAME, {A, [B, C]}),
-
-    %% Give it policy "nodes", it gets specific mirrors
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, ?POLICY,
-      {<<"nodes">>, [rabbit_misc:atom_to_binary(A),
-                     rabbit_misc:atom_to_binary(B)]}),
-    assert_slaves(A, ?QNAME, {A, [B]}),
-
-    %% Now explicitly change the mirrors
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, ?POLICY,
-      {<<"nodes">>, [rabbit_misc:atom_to_binary(A),
-                     rabbit_misc:atom_to_binary(C)]}),
-    assert_slaves(A, ?QNAME, {A, [C]}, [{A, [B, C]}]),
-
-    %% Clear the policy, and we go back to non-mirrored
-    rabbit_ct_broker_helpers:clear_policy(Config, A, ?POLICY),
-    assert_slaves(A, ?QNAME, {A, ''}),
-
-    %% Test switching "away" from an unmirrored node
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, ?POLICY,
-      {<<"nodes">>, [rabbit_misc:atom_to_binary(B),
-                     rabbit_misc:atom_to_binary(C)]}),
-    assert_slaves(A, ?QNAME, {A, [B, C]}, [{A, [B]}, {A, [C]}]),
-
-    ok.
-
-change_cluster(Config) ->
-    [A, B, C, D, E] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    rabbit_ct_broker_helpers:cluster_nodes(Config, [A, B, C]),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-
-    amqp_channel:call(ACh, #'queue.declare'{queue = ?QNAME}),
-    assert_slaves(A, ?QNAME, {A, ''}),
-
-    %% Give it policy exactly 4, it should mirror to all 3 nodes
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, ?POLICY,
-      {<<"exactly">>, 4}),
-    assert_slaves(A, ?QNAME, {A, [B, C]}),
-
-    %% Add D and E, D joins in
-    rabbit_ct_broker_helpers:cluster_nodes(Config, [A, D, E]),
-    assert_slaves(A, ?QNAME, {A, [B, C, D]}),
-
-    %% Remove D, E joins in
-    rabbit_ct_broker_helpers:stop_node(Config, D),
-    assert_slaves(A, ?QNAME, {A, [B, C, E]}),
-
-    ok.
-
-rapid_change(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    {_Pid, MRef} = spawn_monitor(
-                     fun() ->
-                             [rapid_amqp_ops(ACh, I) || I <- lists:seq(1, 100)]
-                     end),
-    rapid_loop(Config, A, MRef),
-    ok.
-
-rapid_amqp_ops(Ch, I) ->
-    Payload = list_to_binary(integer_to_list(I)),
-    amqp_channel:call(Ch, #'queue.declare'{queue = ?QNAME}),
-    amqp_channel:cast(Ch, #'basic.publish'{exchange = <<"">>,
-                                           routing_key = ?QNAME},
-                      #amqp_msg{payload = Payload}),
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue    = ?QNAME,
-                                                no_ack   = true}, self()),
-    receive #'basic.consume_ok'{} -> ok
-    end,
-    receive {#'basic.deliver'{}, #amqp_msg{payload = Payload}} ->
-            ok
-    end,
-    amqp_channel:call(Ch, #'queue.delete'{queue = ?QNAME}).
-
-rapid_loop(Config, Node, MRef) ->
-    receive
-        {'DOWN', MRef, process, _Pid, normal} ->
-            ok;
-        {'DOWN', MRef, process, _Pid, Reason} ->
-            exit({amqp_ops_died, Reason})
-    after 0 ->
-            rabbit_ct_broker_helpers:set_ha_policy(Config, Node, ?POLICY,
-              <<"all">>),
-            rabbit_ct_broker_helpers:clear_policy(Config, Node, ?POLICY),
-            rapid_loop(Config, Node, MRef)
-    end.
-
-%% Vhost deletion needs to successfully tear down policies and queues
-%% with policies. At least smoke-test that it doesn't blow up.
-vhost_deletion(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    rabbit_ct_broker_helpers:set_ha_policy_all(Config),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    amqp_channel:call(ACh, #'queue.declare'{queue = <<"vhost_deletion-q">>}),
-    ok = rpc:call(A, rabbit_vhost, delete, [<<"/">>]),
-    ok.
-
-promote_on_shutdown(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, <<"^ha.promote">>,
-      <<"all">>, [{<<"ha-promote-on-shutdown">>, <<"always">>}]),
-    rabbit_ct_broker_helpers:set_ha_policy(Config, A, <<"^ha.nopromote">>,
-      <<"all">>),
-
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    [begin
-         amqp_channel:call(ACh, #'queue.declare'{queue   = Q,
-                                                 durable = true}),
-         rabbit_ct_client_helpers:publish(ACh, Q, 10)
-     end || Q <- [<<"ha.promote.test">>, <<"ha.nopromote.test">>]],
-    ok = rabbit_ct_broker_helpers:restart_node(Config, B),
-    ok = rabbit_ct_broker_helpers:stop_node(Config, A),
-    BCh = rabbit_ct_client_helpers:open_channel(Config, B),
-    #'queue.declare_ok'{message_count = 0} =
-        amqp_channel:call(
-          BCh, #'queue.declare'{queue   = <<"ha.promote.test">>,
-                                durable = true}),
-    ?assertExit(
-       {{shutdown, {server_initiated_close, 404, _}}, _},
-       amqp_channel:call(
-         BCh, #'queue.declare'{queue   = <<"ha.nopromote.test">>,
-                               durable = true})),
-    ok = rabbit_ct_broker_helpers:start_node(Config, A),
-    ACh2 = rabbit_ct_client_helpers:open_channel(Config, A),
-    #'queue.declare_ok'{message_count = 10} =
-        amqp_channel:call(
-          ACh2, #'queue.declare'{queue   = <<"ha.nopromote.test">>,
-                                 durable = true}),
-    ok.
-
-%%----------------------------------------------------------------------------
-
-assert_slaves(RPCNode, QName, Exp) ->
-    assert_slaves(RPCNode, QName, Exp, []).
-
-assert_slaves(RPCNode, QName, Exp, PermittedIntermediate) ->
-    assert_slaves0(RPCNode, QName, Exp,
-                  [{get(previous_exp_m_node), get(previous_exp_s_nodes)} |
-                   PermittedIntermediate]).
-
-assert_slaves0(RPCNode, QName, {ExpMNode, ExpSNodes}, PermittedIntermediate) ->
-    Q = find_queue(QName, RPCNode),
-    Pid = proplists:get_value(pid, Q),
-    SPids = proplists:get_value(slave_pids, Q),
-    ActMNode = node(Pid),
-    ActSNodes = case SPids of
-                    '' -> '';
-                    _  -> [node(SPid) || SPid <- SPids]
-                end,
-    case ExpMNode =:= ActMNode andalso equal_list(ExpSNodes, ActSNodes) of
-        false ->
-            %% It's an async change, so if nothing has changed let's
-            %% just wait - of course this means if something does not
-            %% change when expected then we time out the test which is
-            %% a bit tedious
-            case [found || {PermMNode, PermSNodes} <- PermittedIntermediate,
-                           PermMNode =:= ActMNode,
-                           equal_list(PermSNodes, ActSNodes)] of
-                [] -> ct:fail("Expected ~p / ~p, got ~p / ~p~nat ~p~n",
-                              [ExpMNode, ExpSNodes, ActMNode, ActSNodes,
-                               get_stacktrace()]);
-                _  -> timer:sleep(100),
-                      assert_slaves0(RPCNode, QName, {ExpMNode, ExpSNodes},
-                                     PermittedIntermediate)
-            end;
-        true ->
-            put(previous_exp_m_node, ExpMNode),
-            put(previous_exp_s_nodes, ExpSNodes),
-            ok
-    end.
-
-equal_list('',    '')   -> true;
-equal_list('',    _Act) -> false;
-equal_list(_Exp,  '')   -> false;
-equal_list([],    [])   -> true;
-equal_list(_Exp,  [])   -> false;
-equal_list([],    _Act) -> false;
-equal_list([H|T], Act)  -> case lists:member(H, Act) of
-                               true  -> equal_list(T, Act -- [H]);
-                               false -> false
-                           end.
-
-find_queue(QName, RPCNode) ->
-    Qs = rpc:call(RPCNode, rabbit_amqqueue, info_all, [?VHOST], infinity),
-    case find_queue0(QName, Qs) of
-        did_not_find_queue -> timer:sleep(100),
-                              find_queue(QName, RPCNode);
-        Q -> Q
-    end.
-
-find_queue0(QName, Qs) ->
-    case [Q || Q <- Qs, proplists:get_value(name, Q) =:=
-                   rabbit_misc:r(?VHOST, queue, QName)] of
-        [R] -> R;
-        []  -> did_not_find_queue
-    end.
-
-get_stacktrace() ->
-    try
-        throw(e)
-    catch
-        _:e ->
-            erlang:get_stacktrace()
-    end.
diff --git a/rabbitmq-server/test/eager_sync_SUITE.erl b/rabbitmq-server/test/eager_sync_SUITE.erl
deleted file mode 100644 (file)
index 93b308b..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(eager_sync_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(QNAME, <<"ha.two.test">>).
--define(QNAME_AUTO, <<"ha.auto.test">>).
--define(MESSAGE_COUNT, 2000).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-          eager_sync,
-          eager_sync_cancel,
-          eager_sync_auto,
-          eager_sync_auto_on_policy_change,
-          eager_sync_requeue
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = 3,
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, ClusterSize},
-        {rmq_nodes_clustered, true},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++ [
-        fun rabbit_ct_broker_helpers:set_ha_policy_two_pos/1,
-        fun rabbit_ct_broker_helpers:set_ha_policy_two_pos_batch_sync/1
-      ]).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-eager_sync(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    %% Queue is on AB but not C.
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    Ch = rabbit_ct_client_helpers:open_channel(Config, C),
-    amqp_channel:call(ACh, #'queue.declare'{queue   = ?QNAME,
-                                            durable = true}),
-
-    %% Don't sync, lose messages
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    restart(Config, A),
-    restart(Config, B),
-    rabbit_ct_client_helpers:consume(Ch, ?QNAME, 0),
-
-    %% Sync, keep messages
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    restart(Config, A),
-    ok = sync(C, ?QNAME),
-    restart(Config, B),
-    rabbit_ct_client_helpers:consume(Ch, ?QNAME, ?MESSAGE_COUNT),
-
-    %% Check the no-need-to-sync path
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    ok = sync(C, ?QNAME),
-    rabbit_ct_client_helpers:consume(Ch, ?QNAME, ?MESSAGE_COUNT),
-
-    %% keep unacknowledged messages
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    rabbit_ct_client_helpers:fetch(Ch, ?QNAME, 2),
-    restart(Config, A),
-    rabbit_ct_client_helpers:fetch(Ch, ?QNAME, 3),
-    sync(C, ?QNAME),
-    restart(Config, B),
-    rabbit_ct_client_helpers:consume(Ch, ?QNAME, ?MESSAGE_COUNT),
-
-    ok.
-
-eager_sync_cancel(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    %% Queue is on AB but not C.
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    Ch = rabbit_ct_client_helpers:open_channel(Config, C),
-
-    set_app_sync_batch_size(A),
-    set_app_sync_batch_size(B),
-    set_app_sync_batch_size(C),
-
-    amqp_channel:call(ACh, #'queue.declare'{queue   = ?QNAME,
-                                            durable = true}),
-    {ok, not_syncing} = sync_cancel(C, ?QNAME), %% Idempotence
-    eager_sync_cancel_test2(Config, A, B, C, Ch).
-
-eager_sync_cancel_test2(Config, A, B, C, Ch) ->
-    %% Sync then cancel
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    restart(Config, A),
-    set_app_sync_batch_size(A),
-    spawn_link(fun() -> ok = sync_nowait(C, ?QNAME) end),
-    case wait_for_syncing(C, ?QNAME, 1) of
-        ok ->
-            case sync_cancel(C, ?QNAME) of
-                ok ->
-                    wait_for_running(C, ?QNAME),
-                    restart(Config, B),
-                    set_app_sync_batch_size(B),
-                    rabbit_ct_client_helpers:consume(Ch, ?QNAME, 0),
-
-                    {ok, not_syncing} = sync_cancel(C, ?QNAME), %% Idempotence
-                    ok;
-                {ok, not_syncing} ->
-                    %% Damn. Syncing finished between wait_for_syncing/3 and
-                    %% sync_cancel/2 above. Start again.
-                    amqp_channel:call(Ch, #'queue.purge'{queue = ?QNAME}),
-                    eager_sync_cancel_test2(Config, A, B, C, Ch)
-            end;
-        synced_already ->
-            %% Damn. Syncing finished before wait_for_syncing/3. Start again.
-            amqp_channel:call(Ch, #'queue.purge'{queue = ?QNAME}),
-            eager_sync_cancel_test2(Config, A, B, C, Ch)
-    end.
-
-eager_sync_auto(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    Ch = rabbit_ct_client_helpers:open_channel(Config, C),
-    amqp_channel:call(ACh, #'queue.declare'{queue   = ?QNAME_AUTO,
-                                            durable = true}),
-
-    %% Sync automatically, don't lose messages
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME_AUTO, ?MESSAGE_COUNT),
-    restart(Config, A),
-    wait_for_sync(C, ?QNAME_AUTO),
-    restart(Config, B),
-    wait_for_sync(C, ?QNAME_AUTO),
-    rabbit_ct_client_helpers:consume(Ch, ?QNAME_AUTO, ?MESSAGE_COUNT),
-
-    ok.
-
-eager_sync_auto_on_policy_change(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    %% Queue is on AB but not C.
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    Ch = rabbit_ct_client_helpers:open_channel(Config, C),
-    amqp_channel:call(ACh, #'queue.declare'{queue   = ?QNAME,
-                                            durable = true}),
-
-    %% Sync automatically once the policy is changed to tell us to.
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    restart(Config, A),
-    Params = [rabbit_misc:atom_to_binary(N) || N <- [A, B]],
-    rabbit_ct_broker_helpers:set_ha_policy(Config,
-      A, <<"^ha.two.">>, {<<"nodes">>, Params},
-      [{<<"ha-sync-mode">>, <<"automatic">>}]),
-    wait_for_sync(C, ?QNAME),
-
-    ok.
-
-eager_sync_requeue(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    %% Queue is on AB but not C.
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    Ch = rabbit_ct_client_helpers:open_channel(Config, C),
-    amqp_channel:call(ACh, #'queue.declare'{queue   = ?QNAME,
-                                            durable = true}),
-
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, 2),
-    {#'basic.get_ok'{delivery_tag = TagA}, _} =
-        amqp_channel:call(Ch, #'basic.get'{queue = ?QNAME}),
-    {#'basic.get_ok'{delivery_tag = TagB}, _} =
-        amqp_channel:call(Ch, #'basic.get'{queue = ?QNAME}),
-    amqp_channel:cast(Ch, #'basic.reject'{delivery_tag = TagA, requeue = true}),
-    restart(Config, B),
-    ok = sync(C, ?QNAME),
-    amqp_channel:cast(Ch, #'basic.reject'{delivery_tag = TagB, requeue = true}),
-    rabbit_ct_client_helpers:consume(Ch, ?QNAME, 2),
-
-    ok.
-
-restart(Config, Node) ->
-    rabbit_ct_broker_helpers:restart_broker(Config, Node).
-
-sync(Node, QName) ->
-    case sync_nowait(Node, QName) of
-        ok -> wait_for_sync(Node, QName),
-              ok;
-        R  -> R
-    end.
-
-sync_nowait(Node, QName) -> action(Node, sync_queue, QName).
-sync_cancel(Node, QName) -> action(Node, cancel_sync_queue, QName).
-
-wait_for_sync(Node, QName) ->
-    sync_detection_SUITE:wait_for_sync_status(true, Node, QName).
-
-action(Node, Action, QName) ->
-    rabbit_ct_broker_helpers:control_action(
-      Action, Node, [binary_to_list(QName)], [{"-p", "/"}]).
-
-queue(Node, QName) ->
-    QNameRes = rabbit_misc:r(<<"/">>, queue, QName),
-    {ok, Q} = rpc:call(Node, rabbit_amqqueue, lookup, [QNameRes]),
-    Q.
-
-wait_for_syncing(Node, QName, Target) ->
-    case state(Node, QName) of
-        {{syncing, _}, _} -> ok;
-        {running, Target} -> synced_already;
-        _                 -> timer:sleep(100),
-                             wait_for_syncing(Node, QName, Target)
-    end.
-
-wait_for_running(Node, QName) ->
-    case state(Node, QName) of
-        {running, _} -> ok;
-        _            -> timer:sleep(100),
-                        wait_for_running(Node, QName)
-    end.
-
-state(Node, QName) ->
-    [{state, State}, {synchronised_slave_pids, Pids}] =
-        rpc:call(Node, rabbit_amqqueue, info,
-                 [queue(Node, QName), [state, synchronised_slave_pids]]),
-    {State, length(Pids)}.
-
-%% eager_sync_cancel_test needs a batch size that's < ?MESSAGE_COUNT
-%% in order to pass, because a SyncBatchSize >= ?MESSAGE_COUNT will
-%% always finish before the test is able to cancel the sync.
-set_app_sync_batch_size(Node) ->
-    rabbit_ct_broker_helpers:control_action(
-      eval, Node,
-      ["application:set_env(rabbit, mirroring_sync_batch_size, 1)."]).
diff --git a/rabbitmq-server/test/gm_SUITE.erl b/rabbitmq-server/test/gm_SUITE.erl
deleted file mode 100644 (file)
index f5ccf75..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(gm_SUITE).
-
--behaviour(gm).
-
--include_lib("common_test/include/ct.hrl").
-
--include("gm_specs.hrl").
-
--compile(export_all).
-
--define(RECEIVE_OR_THROW(Body, Bool, Error),
-        receive Body ->
-                true = Bool,
-                passed
-        after 1000 ->
-                throw(Error)
-        end).
-
-all() ->
-    [
-      join_leave,
-      broadcast,
-      confirmed_broadcast,
-      member_death,
-      receive_in_order
-    ].
-
-init_per_suite(Config) ->
-    ok = application:set_env(mnesia, dir, ?config(priv_dir, Config)),
-    ok = application:start(mnesia),
-    {ok, FHC} = file_handle_cache:start_link(),
-    unlink(FHC),
-    {ok, WPS} = worker_pool_sup:start_link(),
-    unlink(WPS),
-    rabbit_ct_helpers:set_config(Config, [
-        {file_handle_cache_pid, FHC},
-        {worker_pool_sup_pid, WPS}
-      ]).
-
-end_per_suite(Config) ->
-    exit(?config(worker_pool_sup_pid, Config), shutdown),
-    exit(?config(file_handle_cache_pid, Config), shutdown),
-    ok = application:stop(mnesia),
-    Config.
-
-%% ---------------------------------------------------------------------------
-%% Functional tests
-%% ---------------------------------------------------------------------------
-
-join_leave(_Config) ->
-    passed = with_two_members(fun (_Pid, _Pid2) -> passed end).
-
-broadcast(_Config) ->
-    passed = do_broadcast(fun gm:broadcast/2).
-
-confirmed_broadcast(_Config) ->
-    passed = do_broadcast(fun gm:confirmed_broadcast/2).
-
-member_death(_Config) ->
-    passed = with_two_members(
-      fun (Pid, Pid2) ->
-              {ok, Pid3} = gm:start_link(
-                             ?MODULE, ?MODULE, self(),
-                             fun rabbit_misc:execute_mnesia_transaction/1),
-              passed = receive_joined(Pid3, [Pid, Pid2, Pid3],
-                                      timeout_joining_gm_group_3),
-              passed = receive_birth(Pid, Pid3, timeout_waiting_for_birth_3_1),
-              passed = receive_birth(Pid2, Pid3, timeout_waiting_for_birth_3_2),
-
-              unlink(Pid3),
-              exit(Pid3, kill),
-
-              %% Have to do some broadcasts to ensure that all members
-              %% find out about the death.
-              passed = (broadcast_fun(fun gm:confirmed_broadcast/2))(
-                         Pid, Pid2),
-
-              passed = receive_death(Pid, Pid3, timeout_waiting_for_death_3_1),
-              passed = receive_death(Pid2, Pid3, timeout_waiting_for_death_3_2),
-
-              passed
-      end).
-
-receive_in_order(_Config) ->
-    passed = with_two_members(
-      fun (Pid, Pid2) ->
-              Numbers = lists:seq(1,1000),
-              [begin ok = gm:broadcast(Pid, N), ok = gm:broadcast(Pid2, N) end
-               || N <- Numbers],
-              passed = receive_numbers(
-                         Pid, Pid, {timeout_for_msgs, Pid, Pid}, Numbers),
-              passed = receive_numbers(
-                         Pid, Pid2, {timeout_for_msgs, Pid, Pid2}, Numbers),
-              passed = receive_numbers(
-                         Pid2, Pid, {timeout_for_msgs, Pid2, Pid}, Numbers),
-              passed = receive_numbers(
-                         Pid2, Pid2, {timeout_for_msgs, Pid2, Pid2}, Numbers),
-              passed
-      end).
-
-do_broadcast(Fun) ->
-    with_two_members(broadcast_fun(Fun)).
-
-broadcast_fun(Fun) ->
-    fun (Pid, Pid2) ->
-            ok = Fun(Pid, magic_message),
-            passed = receive_or_throw({msg, Pid, Pid, magic_message},
-                                      timeout_waiting_for_msg),
-            passed = receive_or_throw({msg, Pid2, Pid, magic_message},
-                                      timeout_waiting_for_msg)
-    end.
-
-with_two_members(Fun) ->
-    ok = gm:create_tables(),
-
-    {ok, Pid} = gm:start_link(?MODULE, ?MODULE, self(),
-                              fun rabbit_misc:execute_mnesia_transaction/1),
-    passed = receive_joined(Pid, [Pid], timeout_joining_gm_group_1),
-
-    {ok, Pid2} = gm:start_link(?MODULE, ?MODULE, self(),
-                               fun rabbit_misc:execute_mnesia_transaction/1),
-    passed = receive_joined(Pid2, [Pid, Pid2], timeout_joining_gm_group_2),
-    passed = receive_birth(Pid, Pid2, timeout_waiting_for_birth_2),
-
-    passed = Fun(Pid, Pid2),
-
-    ok = gm:leave(Pid),
-    passed = receive_death(Pid2, Pid, timeout_waiting_for_death_1),
-    passed =
-        receive_termination(Pid, normal, timeout_waiting_for_termination_1),
-
-    ok = gm:leave(Pid2),
-    passed =
-        receive_termination(Pid2, normal, timeout_waiting_for_termination_2),
-
-    receive X -> throw({unexpected_message, X})
-    after 0 -> passed
-    end.
-
-receive_or_throw(Pattern, Error) ->
-    ?RECEIVE_OR_THROW(Pattern, true, Error).
-
-receive_birth(From, Born, Error) ->
-    ?RECEIVE_OR_THROW({members_changed, From, Birth, Death},
-                      ([Born] == Birth) andalso ([] == Death),
-                      Error).
-
-receive_death(From, Died, Error) ->
-    ?RECEIVE_OR_THROW({members_changed, From, Birth, Death},
-                      ([] == Birth) andalso ([Died] == Death),
-                      Error).
-
-receive_joined(From, Members, Error) ->
-    ?RECEIVE_OR_THROW({joined, From, Members1},
-                      lists:usort(Members) == lists:usort(Members1),
-                      Error).
-
-receive_termination(From, Reason, Error) ->
-    ?RECEIVE_OR_THROW({termination, From, Reason1},
-                      Reason == Reason1,
-                      Error).
-
-receive_numbers(_Pid, _Sender, _Error, []) ->
-    passed;
-receive_numbers(Pid, Sender, Error, [N | Numbers]) ->
-    ?RECEIVE_OR_THROW({msg, Pid, Sender, M},
-                      M == N,
-                      Error),
-    receive_numbers(Pid, Sender, Error, Numbers).
-
-%% -------------------------------------------------------------------
-%% gm behavior callbacks.
-%% -------------------------------------------------------------------
-
-joined(Pid, Members) ->
-    Pid ! {joined, self(), Members},
-    ok.
-
-members_changed(Pid, Births, Deaths) ->
-    Pid ! {members_changed, self(), Births, Deaths},
-    ok.
-
-handle_msg(Pid, From, Msg) ->
-    Pid ! {msg, self(), From, Msg},
-    ok.
-
-handle_terminate(Pid, Reason) ->
-    Pid ! {termination, self(), Reason},
-    ok.
diff --git a/rabbitmq-server/test/health_check_SUITE.erl b/rabbitmq-server/test/health_check_SUITE.erl
deleted file mode 100644 (file)
index 4d8f56e..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2016 Pivotal Software, Inc.  All rights reserved.
-%%
--module(health_check_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--export([all/0
-        ,groups/0
-        ,init_per_suite/1
-        ,end_per_suite/1
-        ,init_per_testcase/2
-        ,end_per_testcase/2
-        ]).
-
--export([ignores_remote_dead_channel/1
-        ,detects_local_dead_channel/1
-        ,ignores_remote_dead_queue/1
-        ,detects_local_dead_queue/1
-        ,ignores_remote_alarms/1
-        ,detects_local_alarm/1
-        ,honors_timeout_argument/1
-        ]).
-
-all() ->
-    [{group, all_cases}].
-
-groups() ->
-    [{all_cases, [],
-      [ignores_remote_dead_queue
-      ,detects_local_dead_queue
-      ,ignores_remote_dead_channel
-      ,detects_local_dead_channel
-      ,ignores_remote_alarms
-      ,detects_local_alarm
-      ,honors_timeout_argument
-      ]}].
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_testcase(Testcase, Config0) ->
-    rabbit_ct_helpers:testcase_started(Config0, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(
-                Config0, [{rmq_nodes_count, 2},
-                          {rmq_nodes_clustered, true}]),
-    rabbit_ct_helpers:run_steps(Config1,
-                                rabbit_ct_broker_helpers:setup_steps() ++
-                                rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config0) ->
-    Config1 = case rabbit_ct_helpers:get_config(Config0, save_config) of
-        undefined -> Config0;
-        C         -> C
-    end,
-    Config2 = rabbit_ct_helpers:run_steps(Config1,
-                                          rabbit_ct_client_helpers:teardown_steps() ++
-                                          rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config2, Testcase).
-
-%%----------------------------------------------------------------------------
-%% Test cases
-%%----------------------------------------------------------------------------
-ignores_remote_dead_channel(Config) ->
-    [A, B] = open_channel_and_declare_queue_everywhere(Config),
-    CPid = suspend_single_channel(Config, B),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-    resume_sys_process(Config, B, CPid),
-    ok.
-
-detects_local_dead_channel(Config) ->
-    [A|_] = open_channel_and_declare_queue_everywhere(Config),
-    CPid = suspend_single_channel(Config, A),
-    {error, 75, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-    {match, _} = re:run(Str, "operation node_health_check.*timed out"),
-    resume_sys_process(Config, A, CPid),
-    ok.
-
-ignores_remote_dead_queue(Config) ->
-    [A, B] = open_channel_and_declare_queue_everywhere(Config),
-    QPid = suspend_single_queue(Config, B),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-    resume_sys_process(Config, B, QPid),
-    ok.
-
-detects_local_dead_queue(Config) ->
-    [A|_] = open_channel_and_declare_queue_everywhere(Config),
-    QPid = suspend_single_queue(Config, A),
-    {error, 75, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-    {match, _} = re:run(Str, "operation node_health_check.*timed out"),
-    resume_sys_process(Config, A, QPid),
-    ok.
-
-ignores_remote_alarms(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, B,
-                                         ["set_vm_memory_high_watermark", "0.000000001"]),
-    {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-    ok.
-
-detects_local_alarm(Config) ->
-    [A|_] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, A,
-                                         ["set_vm_memory_high_watermark", "0.000000001"]),
-    {error, 70, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]),
-    {match, _} = re:run(Str, "resource alarm.*in effect"),
-    ok.
-
-honors_timeout_argument(Config) ->
-    [A|_] = open_channel_and_declare_queue_everywhere(Config),
-    QPid = suspend_single_queue(Config, A),
-
-    case timer:tc(rabbit_ct_broker_helpers, rabbitmqctl, [Config, A, ["-t", "5", "node_health_check"]]) of
-        {TimeSpent, {error, 75, _}} ->
-            if TimeSpent < 5000000 -> exit({too_fast, TimeSpent});
-               TimeSpent > 7000000 -> exit({too_slow, TimeSpent}); %% +2 seconds for rabbitmqctl overhead
-               true -> ok
-            end;
-        {_, Unexpected} ->
-            exit({unexpected, Unexpected})
-    end,
-    resume_sys_process(Config, A, QPid),
-    ok.
-
-%%----------------------------------------------------------------------------
-%% Helpers
-%%----------------------------------------------------------------------------
-open_channel_and_declare_queue_everywhere(Config) ->
-    Nodes = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    lists:foreach(fun(Node) ->
-                      Ch = rabbit_ct_client_helpers:open_channel(Config, Node),
-                      #'queue.declare_ok'{} = amqp_channel:call(Ch, #'queue.declare'{})
-                  end,
-                  Nodes),
-    Nodes.
-
-suspend_single_queue(Config, Node) ->
-    [QPid|_] = [rabbit_amqqueue:pid_of(Q) || Q <- rabbit_ct_broker_helpers:rpc(Config, Node, rabbit_amqqueue, list, []),
-                                             Node == node(rabbit_amqqueue:pid_of(Q))],
-    rabbit_ct_broker_helpers:rpc(Config, Node, sys, suspend, [QPid]),
-    QPid.
-
-suspend_single_channel(Config, Node) ->
-    [CPid|_] = [Pid || Pid <- rabbit_ct_broker_helpers:rpc(Config, Node, rabbit_channel, list_local, []),
-                       Node == node(Pid)],
-    rabbit_ct_broker_helpers:rpc(Config, Node, sys, suspend, [CPid]),
-    CPid.
-
-resume_sys_process(Config, Node, Pid) ->
-    rabbit_ct_broker_helpers:rpc(Config, Node, sys, resume, [Pid]).
diff --git a/rabbitmq-server/test/inet_proxy_dist.erl b/rabbitmq-server/test/inet_proxy_dist.erl
deleted file mode 100644 (file)
index 32b7641..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
--module(inet_proxy_dist).
-
-%% A distribution plugin that uses the usual inet_tcp_dist but allows
-%% insertion of a proxy at the receiving end.
-
-%% inet_*_dist "behaviour"
--export([listen/1, accept/1, accept_connection/5,
-        setup/5, close/1, select/1, is_node_name/1]).
-
-%% For copypasta from inet_tcp_dist
--export([do_setup/6]).
--import(error_logger,[error_msg/2]).
-
--define(REAL, inet_tcp_dist).
-
-%%----------------------------------------------------------------------------
-
-listen(Name)       -> ?REAL:listen(Name).
-select(Node)       -> ?REAL:select(Node).
-accept(Listen)     -> ?REAL:accept(Listen).
-close(Socket)      -> ?REAL:close(Socket).
-is_node_name(Node) -> ?REAL:is_node_name(Node).
-
-accept_connection(AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
-    ?REAL:accept_connection(AcceptPid, Socket, MyNode, Allowed, SetupTime).
-
-%% This is copied from inet_tcp_dist, in order to change the
-%% output of erl_epmd:port_please/2.
-
--include_lib("kernel/include/net_address.hrl").
--include_lib("kernel/include/dist_util.hrl").
-
-setup(Node, Type, MyNode, LongOrShortNames,SetupTime) ->
-    spawn_opt(?MODULE, do_setup, 
-             [self(), Node, Type, MyNode, LongOrShortNames, SetupTime],
-             [link, {priority, max}]).
-
-do_setup(Kernel, Node, Type, MyNode, LongOrShortNames,SetupTime) ->
-    ?trace("~p~n",[{inet_tcp_dist,self(),setup,Node}]),
-    [Name, Address] = splitnode(Node, LongOrShortNames),
-    case inet:getaddr(Address, inet) of
-       {ok, Ip} ->
-           Timer = dist_util:start_timer(SetupTime),
-           case erl_epmd:port_please(Name, Ip) of
-               {port, TcpPort, Version} ->
-                   ?trace("port_please(~p) -> version ~p~n", 
-                          [Node,Version]),
-                   dist_util:reset_timer(Timer),
-                    %% Modification START
-                    Ret = application:get_env(kernel,
-                      dist_and_proxy_ports_map),
-                    PortsMap = case Ret of
-                        {ok, M}   -> M;
-                        undefined -> []
-                    end,
-                    ProxyPort = case inet_tcp_proxy:is_enabled() of
-                        true  -> proplists:get_value(TcpPort, PortsMap, TcpPort);
-                        false -> TcpPort
-                    end,
-                   case inet_tcp:connect(Ip, ProxyPort,
-                                         [{active, false},
-                                          {packet,2}]) of
-                       {ok, Socket} ->
-                            {ok, {_, SrcPort}} = inet:sockname(Socket),
-                            ok = inet_tcp_proxy_manager:register(
-                                   node(), Node, SrcPort, TcpPort, ProxyPort),
-                    %% Modification END
-                           HSData = #hs_data{
-                             kernel_pid = Kernel,
-                             other_node = Node,
-                             this_node = MyNode,
-                             socket = Socket,
-                             timer = Timer,
-                             this_flags = 0,
-                             other_version = Version,
-                             f_send = fun inet_tcp:send/2,
-                             f_recv = fun inet_tcp:recv/3,
-                             f_setopts_pre_nodeup = 
-                             fun(S) ->
-                                     inet:setopts
-                                       (S, 
-                                        [{active, false},
-                                         {packet, 4},
-                                         nodelay()])
-                             end,
-                             f_setopts_post_nodeup = 
-                             fun(S) ->
-                                     inet:setopts
-                                       (S, 
-                                        [{active, true},
-                                         {deliver, port},
-                                         {packet, 4},
-                                         nodelay()])
-                             end,
-                             f_getll = fun inet:getll/1,
-                             f_address = 
-                             fun(_,_) ->
-                                     #net_address{
-                                  address = {Ip,TcpPort},
-                                  host = Address,
-                                  protocol = tcp,
-                                  family = inet}
-                             end,
-                             mf_tick = fun tick/1,
-                             mf_getstat = fun inet_tcp_dist:getstat/1,
-                             request_type = Type
-                            },
-                           dist_util:handshake_we_started(HSData);
-                       R ->
-                            io:format("~p failed! ~p~n", [node(), R]),
-                           %% Other Node may have closed since 
-                           %% port_please !
-                           ?trace("other node (~p) "
-                                  "closed since port_please.~n", 
-                                  [Node]),
-                           ?shutdown(Node)
-                   end;
-               _ ->
-                   ?trace("port_please (~p) "
-                          "failed.~n", [Node]),
-                   ?shutdown(Node)
-           end;
-       _Other ->
-           ?trace("inet_getaddr(~p) "
-                  "failed (~p).~n", [Node,_Other]),
-           ?shutdown(Node)
-    end.
-
-%% If Node is illegal terminate the connection setup!!
-splitnode(Node, LongOrShortNames) ->
-    case split_node(atom_to_list(Node), $@, []) of
-       [Name|Tail] when Tail =/= [] ->
-           Host = lists:append(Tail),
-           case split_node(Host, $., []) of
-               [_] when LongOrShortNames =:= longnames ->
-                   error_msg("** System running to use "
-                             "fully qualified "
-                             "hostnames **~n"
-                             "** Hostname ~s is illegal **~n",
-                             [Host]),
-                   ?shutdown(Node);
-               L when length(L) > 1, LongOrShortNames =:= shortnames ->
-                   error_msg("** System NOT running to use fully qualified "
-                             "hostnames **~n"
-                             "** Hostname ~s is illegal **~n",
-                             [Host]),
-                   ?shutdown(Node);
-               _ ->
-                   [Name, Host]
-           end;
-       [_] ->
-           error_msg("** Nodename ~p illegal, no '@' character **~n",
-                     [Node]),
-           ?shutdown(Node);
-       _ ->
-           error_msg("** Nodename ~p illegal **~n", [Node]),
-           ?shutdown(Node)
-    end.
-
-split_node([Chr|T], Chr, Ack) -> [lists:reverse(Ack)|split_node(T, Chr, [])];
-split_node([H|T], Chr, Ack)   -> split_node(T, Chr, [H|Ack]);
-split_node([], _, Ack)        -> [lists:reverse(Ack)].
-
-%% we may not always want the nodelay behaviour
-%% for performance reasons
-
-nodelay() ->
-    case application:get_env(kernel, dist_nodelay) of
-       undefined ->
-           {nodelay, true};
-       {ok, true} ->
-           {nodelay, true};
-       {ok, false} ->
-           {nodelay, false};
-       _ ->
-           {nodelay, true}
-    end.
-
-tick(Socket) ->
-    case inet_tcp:send(Socket, [], [force]) of
-        {error, closed} ->
-            self() ! {tcp_closed, Socket},
-            {error, closed};
-        R ->
-            R
-    end.
diff --git a/rabbitmq-server/test/inet_tcp_proxy.erl b/rabbitmq-server/test/inet_tcp_proxy.erl
deleted file mode 100644 (file)
index 4498b8f..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
--module(inet_tcp_proxy).
-
-%% A TCP proxy for insertion into the Erlang distribution mechanism,
-%% which allows us to simulate network partitions.
-
--export([start/3, reconnect/1, is_enabled/0, allow/1, block/1]).
-
--define(TABLE, ?MODULE).
-
-%% This can't start_link because there's no supervision hierarchy we
-%% can easily fit it into (we need to survive all application
-%% restarts). So we have to do some horrible error handling.
-
-start(ManagerNode, DistPort, ProxyPort) ->
-    application:set_env(kernel, inet_tcp_proxy_manager_node, ManagerNode),
-    Parent = self(),
-    Pid = spawn(error_handler(fun() -> go(Parent, DistPort, ProxyPort) end)),
-    MRef = erlang:monitor(process, Pid),
-    receive
-        ready ->
-            erlang:demonitor(MRef),
-            ok;
-        {'DOWN', MRef, _, _, Reason} ->
-            {error, Reason}
-    end.
-
-reconnect(Nodes) ->
-    [erlang:disconnect_node(N) || N <- Nodes, N =/= node()],
-    ok.
-
-is_enabled() ->
-    lists:member(?TABLE, ets:all()).
-
-allow(Node) ->
-    rabbit_log:info("(~s) Allowing distribution between ~s and ~s~n",
-      [?MODULE, node(), Node]),
-    ets:delete(?TABLE, Node).
-block(Node) ->
-    rabbit_log:info("(~s) BLOCKING distribution between ~s and ~s~n",
-      [?MODULE, node(), Node]),
-    ets:insert(?TABLE, {Node, block}).
-
-%%----------------------------------------------------------------------------
-
-error_handler(Thunk) ->
-    fun () ->
-            try
-                Thunk()
-            catch _:{{nodedown, _}, _} ->
-                    %% The only other node we ever talk to is the test
-                    %% runner; if that's down then the test is nearly
-                    %% over; die quietly.
-                    ok;
-                  _:X ->
-                    io:format(user, "TCP proxy died with ~p~n At ~p~n",
-                              [X, erlang:get_stacktrace()]),
-                    erlang:halt(1)
-            end
-    end.
-
-go(Parent, Port, ProxyPort) ->
-    ets:new(?TABLE, [public, named_table]),
-    {ok, Sock} = gen_tcp:listen(ProxyPort, [inet,
-                                            {reuseaddr, true}]),
-    Parent ! ready,
-    accept_loop(Sock, Port).
-
-accept_loop(ListenSock, Port) ->
-    {ok, Sock} = gen_tcp:accept(ListenSock),
-    Proxy = spawn(error_handler(fun() -> run_it(Sock, Port) end)),
-    ok = gen_tcp:controlling_process(Sock, Proxy),
-    accept_loop(ListenSock, Port).
-
-run_it(SockIn, Port) ->
-    case {inet:peername(SockIn), inet:sockname(SockIn)} of
-        {{ok, {_Addr, SrcPort}}, {ok, {Addr, _OtherPort}}} ->
-            {ok, Remote, This} = inet_tcp_proxy_manager:lookup(SrcPort),
-            case node() of
-                This  -> ok;
-                _     -> exit({not_me, node(), This})
-            end,
-            {ok, SockOut} = gen_tcp:connect(Addr, Port, [inet]),
-            run_loop({SockIn, SockOut}, Remote, []);
-        _ ->
-            ok
-    end.
-
-run_loop(Sockets, RemoteNode, Buf0) ->
-    Block = [{RemoteNode, block}] =:= ets:lookup(?TABLE, RemoteNode),
-    receive
-        {tcp, Sock, Data} ->
-            Buf = [Data | Buf0],
-            case {Block, get(dist_was_blocked)} of
-                {true, false} ->
-                    put(dist_was_blocked, Block),
-                    rabbit_log:warning(
-                      "(~s) Distribution BLOCKED between ~s and ~s~n",
-                      [?MODULE, node(), RemoteNode]);
-                {false, S} when S =:= true orelse S =:= undefined ->
-                    put(dist_was_blocked, Block),
-                    rabbit_log:warning(
-                      "(~s) Distribution allowed between ~s and ~s~n",
-                      [?MODULE, node(), RemoteNode]);
-                _ ->
-                    ok
-            end,
-            case Block of
-                false -> gen_tcp:send(other(Sock, Sockets), lists:reverse(Buf)),
-                         run_loop(Sockets, RemoteNode, []);
-                true  -> run_loop(Sockets, RemoteNode, Buf)
-            end;
-        {tcp_closed, Sock} ->
-            gen_tcp:close(other(Sock, Sockets));
-        X ->
-            exit({weirdness, X})
-    end.
-
-other(A, {A, B}) -> B;
-other(B, {A, B}) -> A.
diff --git a/rabbitmq-server/test/inet_tcp_proxy_manager.erl b/rabbitmq-server/test/inet_tcp_proxy_manager.erl
deleted file mode 100644 (file)
index 18255b8..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
--module(inet_tcp_proxy_manager).
-
-%% The TCP proxies need to decide whether to block based on the node
-%% they're running on, and the node connecting to them. The trouble
-%% is, they don't have an easy way to determine the latter. Therefore
-%% when A connects to B we register the source port used by A here, so
-%% that B can later look it up and find out who A is without having to
-%% sniff the distribution protocol.
-%%
-%% That does unfortunately mean that we need a central control
-%% thing. We assume here it's running on the node called
-%% 'standalone_test' since that's where tests are orchestrated from.
-%%
-%% Yes, this leaks. For its intended lifecycle, that's fine.
-
--behaviour(gen_server).
-
--export([start/0, register/5, lookup/1]).
-
--export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
-         code_change/3]).
-
--define(NODE, ct).
-
--record(state, {ports, pending}).
-
-start() ->
-    gen_server:start({local, ?MODULE}, ?MODULE, [], []).
-
-register(_From, _To, _SrcPort, Port, Port) ->
-    %% No proxy, don't register
-    ok;
-register(From, To, SrcPort, _Port, _ProxyPort) ->
-    gen_server:call(name(), {register, From, To, SrcPort}, infinity).
-
-lookup(SrcPort) ->
-    gen_server:call(name(), {lookup, SrcPort}, infinity).
-
-controller_node() ->
-    {ok, ManagerNode} = application:get_env(kernel,
-      inet_tcp_proxy_manager_node),
-    ManagerNode.
-
-name() ->
-    {?MODULE, controller_node()}.
-
-%%----------------------------------------------------------------------------
-
-init([]) ->
-    net_kernel:monitor_nodes(true),
-    {ok, #state{ports   = dict:new(),
-                pending = []}}.
-
-handle_call({register, FromNode, ToNode, SrcPort}, _From,
-            State = #state{ports   = Ports,
-                           pending = Pending}) ->
-    {Notify, Pending2} =
-        lists:partition(fun ({P, _}) -> P =:= SrcPort end, Pending),
-    [gen_server:reply(From, {ok, FromNode, ToNode}) || {_, From} <- Notify],
-    {reply, ok,
-     State#state{ports   = dict:store(SrcPort, {FromNode, ToNode}, Ports),
-                 pending = Pending2}};
-
-handle_call({lookup, SrcPort}, From,
-            State = #state{ports = Ports, pending = Pending}) ->
-    case dict:find(SrcPort, Ports) of
-        {ok, {FromNode, ToNode}} ->
-            {reply, {ok, FromNode, ToNode}, State};
-        error ->
-            {noreply, State#state{pending = [{SrcPort, From} | Pending]}}
-    end;
-
-handle_call(_Req, _From, State) ->
-    {reply, unknown_request, State}.
-
-handle_cast(_C, State) ->
-    {noreply, State}.
-
-handle_info({nodedown, Node}, State = #state{ports = Ports}) ->
-    Ports1 = dict:filter(
-               fun (_, {From, To}) ->
-                       Node =/= From andalso Node =/= To
-               end, Ports),
-    {noreply, State#state{ports = Ports1}};
-
-handle_info(_I, State) ->
-    {noreply, State}.
-
-terminate(_Reason, _State) ->
-    ok.
-
-code_change(_, State, _) -> {ok, State}.
diff --git a/rabbitmq-server/test/lazy_queue_SUITE.erl b/rabbitmq-server/test/lazy_queue_SUITE.erl
deleted file mode 100644 (file)
index fe105cd..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(lazy_queue_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(QNAME, <<"queue.mode.test">>).
--define(MESSAGE_COUNT, 2000).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-      {non_parallel_tests, [], [
-          declare_args,
-          queue_mode_policy,
-          publish_consume
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(_, Config) ->
-    Config.
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = 2,
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, ClusterSize},
-        {rmq_nodes_clustered, true},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++ [
-        fun rabbit_ct_broker_helpers:set_ha_policy_all/1
-      ]).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-declare_args(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-
-    Ch = rabbit_ct_client_helpers:open_channel(Config, A),
-    LQ = <<"lazy-q">>,
-    declare(Ch, LQ, [{<<"x-queue-mode">>, longstr, <<"lazy">>}]),
-    assert_queue_mode(A, LQ, lazy),
-
-    DQ = <<"default-q">>,
-    declare(Ch, DQ, [{<<"x-queue-mode">>, longstr, <<"default">>}]),
-    assert_queue_mode(A, DQ, default),
-
-    DQ2 = <<"default-q2">>,
-    declare(Ch, DQ2),
-    assert_queue_mode(A, DQ2, default),
-
-    passed.
-
-queue_mode_policy(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-
-    set_ha_mode_policy(Config, A, <<"lazy">>),
-
-    Ch = rabbit_ct_client_helpers:open_channel(Config, A),
-
-    LQ = <<"lazy-q">>,
-    declare(Ch, LQ, [{<<"x-queue-mode">>, longstr, <<"lazy">>}]),
-    assert_queue_mode(A, LQ, lazy),
-
-    LQ2 = <<"lazy-q-2">>,
-    declare(Ch, LQ2),
-    assert_queue_mode(A, LQ2, lazy),
-
-    DQ = <<"default-q">>,
-    declare(Ch, DQ, [{<<"x-queue-mode">>, longstr, <<"default">>}]),
-    assert_queue_mode(A, DQ, default),
-
-    set_ha_mode_policy(Config, A, <<"default">>),
-
-    ok = wait_for_queue_mode(A, LQ,  lazy, 5000),
-    ok = wait_for_queue_mode(A, LQ2, default, 5000),
-    ok = wait_for_queue_mode(A, DQ,  default, 5000),
-
-    passed.
-
-publish_consume(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-
-    Ch = rabbit_ct_client_helpers:open_channel(Config, A),
-    declare(Ch, ?QNAME),
-
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    consume(Ch, ?QNAME, ack),
-    [assert_delivered(Ch, ack, P) || P <- lists:seq(1, ?MESSAGE_COUNT)],
-
-    set_ha_mode_policy(Config, A, <<"lazy">>),
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    [assert_delivered(Ch, ack, P) || P <- lists:seq(1, ?MESSAGE_COUNT)],
-
-    set_ha_mode_policy(Config, A, <<"default">>),
-    [assert_delivered(Ch, ack, P) || P <- lists:seq(1, ?MESSAGE_COUNT)],
-
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    set_ha_mode_policy(Config, A, <<"lazy">>),
-    rabbit_ct_client_helpers:publish(Ch, ?QNAME, ?MESSAGE_COUNT),
-    set_ha_mode_policy(Config, A, <<"default">>),
-    [assert_delivered(Ch, ack, P) || P <- lists:seq(1, ?MESSAGE_COUNT)],
-
-    set_ha_mode_policy(Config, A, <<"lazy">>),
-    [assert_delivered(Ch, ack, P) || P <- lists:seq(1, ?MESSAGE_COUNT)],
-
-    cancel(Ch),
-
-    passed.
-
-%%----------------------------------------------------------------------------
-
-declare(Ch, Q) ->
-    declare(Ch, Q, []).
-
-declare(Ch, Q, Args) ->
-    amqp_channel:call(Ch, #'queue.declare'{queue     = Q,
-                                           durable   = true,
-                                           arguments = Args}).
-
-consume(Ch, Q, Ack) ->
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue        = Q,
-                                                no_ack       = Ack =:= no_ack,
-                                                consumer_tag = <<"ctag">>},
-                           self()),
-    receive
-        #'basic.consume_ok'{consumer_tag = <<"ctag">>} ->
-             ok
-    end.
-
-cancel(Ch) ->
-    amqp_channel:call(Ch, #'basic.cancel'{consumer_tag = <<"ctag">>}).
-
-assert_delivered(Ch, Ack, Payload) ->
-    PBin = payload2bin(Payload),
-    receive
-        {#'basic.deliver'{delivery_tag = DTag}, #amqp_msg{payload = PBin2}} ->
-            PBin = PBin2,
-            maybe_ack(Ch, Ack, DTag)
-    end.
-
-maybe_ack(Ch, do_ack, DTag) ->
-    amqp_channel:cast(Ch, #'basic.ack'{delivery_tag = DTag}),
-    DTag;
-maybe_ack(_Ch, _, DTag) ->
-    DTag.
-
-payload2bin(Int) -> list_to_binary(integer_to_list(Int)).
-
-set_ha_mode_policy(Config, Node, Mode) ->
-    ok = rabbit_ct_broker_helpers:set_ha_policy(Config, Node, <<".*">>, <<"all">>,
-      [{<<"queue-mode">>, Mode}]).
-
-
-wait_for_queue_mode(_Node, _Q, _Mode, Max) when Max < 0 ->
-    fail;
-wait_for_queue_mode(Node, Q, Mode, Max) ->
-    case get_queue_mode(Node, Q) of
-        Mode  -> ok;
-        _     -> timer:sleep(100),
-                 wait_for_queue_mode(Node, Q, Mode, Max - 100)
-    end.
-
-assert_queue_mode(Node, Q, Expected) ->
-    Actual = get_queue_mode(Node, Q),
-    Expected = Actual.
-
-get_queue_mode(Node, Q) ->
-    QNameRes = rabbit_misc:r(<<"/">>, queue, Q),
-    {ok, AMQQueue} =
-        rpc:call(Node, rabbit_amqqueue, lookup, [QNameRes]),
-    [{backing_queue_status, Status}] =
-        rpc:call(Node, rabbit_amqqueue, info,
-                 [AMQQueue, [backing_queue_status]]),
-    proplists:get_value(mode, Status).
diff --git a/rabbitmq-server/test/many_node_ha_SUITE.erl b/rabbitmq-server/test/many_node_ha_SUITE.erl
deleted file mode 100644 (file)
index 22b39e7..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(many_node_ha_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, cluster_size_6}
-    ].
-
-groups() ->
-    [
-      {cluster_size_6, [], [
-          kill_intermediate
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_6, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 6}
-      ]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_clustered, true},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++ [
-        fun rabbit_ct_broker_helpers:set_ha_policy_all/1
-      ]).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-kill_intermediate(Config) ->
-    [A, B, C, D, E, F] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    Msgs            = rabbit_ct_helpers:cover_work_factor(Config, 20000),
-    MasterChannel   = rabbit_ct_client_helpers:open_channel(Config, A),
-    ConsumerChannel = rabbit_ct_client_helpers:open_channel(Config, E),
-    ProducerChannel = rabbit_ct_client_helpers:open_channel(Config, F),
-    Queue = <<"test">>,
-    amqp_channel:call(MasterChannel, #'queue.declare'{queue       = Queue,
-                                                      auto_delete = false}),
-
-    %% TODO: this seems *highly* timing dependant - the assumption being
-    %% that the kill will work quickly enough that there will still be
-    %% some messages in-flight that we *must* receive despite the intervening
-    %% node deaths. It would be nice if we could find a means to do this
-    %% in a way that is not actually timing dependent.
-
-    %% Worse still, it assumes that killing the master will cause a
-    %% failover to Slave1, and so on. Nope.
-
-    ConsumerPid = rabbit_ha_test_consumer:create(ConsumerChannel,
-                                                 Queue, self(), false, Msgs),
-
-    ProducerPid = rabbit_ha_test_producer:create(ProducerChannel,
-                                                 Queue, self(), false, Msgs),
-
-    %% create a killer for the master and the first 3 slaves
-    [rabbit_ct_broker_helpers:kill_node_after(Config, Node, Time) ||
-        {Node, Time} <- [{A, 50},
-                         {B, 50},
-                         {C, 100},
-                         {D, 100}]],
-
-    %% verify that the consumer got all msgs, or die, or time out
-    rabbit_ha_test_producer:await_response(ProducerPid),
-    rabbit_ha_test_consumer:await_response(ConsumerPid),
-    ok.
-
diff --git a/rabbitmq-server/test/mirrored_supervisor_SUITE.erl b/rabbitmq-server/test/mirrored_supervisor_SUITE.erl
deleted file mode 100644 (file)
index 5ed17c9..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(mirrored_supervisor_SUITE).
-
--behaviour(mirrored_supervisor).
-
--include_lib("common_test/include/ct.hrl").
-
--compile(export_all).
-
--define(MS,     mirrored_supervisor).
--define(SERVER, mirrored_supervisor_SUITE_gs).
-
-all() ->
-    [
-      migrate,
-      migrate_twice,
-      already_there,
-      delete_restart,
-      which_children,
-      large_group,
-      childspecs_at_init,
-      anonymous_supervisors,
-      no_migration_on_shutdown,
-      start_idempotence,
-      unsupported,
-      ignore,
-      startup_failure
-    ].
-
-init_per_suite(Config) ->
-    ok = application:set_env(mnesia, dir, ?config(priv_dir, Config)),
-    ok = application:start(mnesia),
-    lists:foreach(
-      fun ({Tab, TabDef}) ->
-              TabDef1 = proplists:delete(match, TabDef),
-              case mnesia:create_table(Tab, TabDef1) of
-                  {atomic, ok} ->
-                      ok;
-                  {aborted, Reason} ->
-                      throw({error,
-                          {table_creation_failed, Tab, TabDef1, Reason}})
-              end
-      end, mirrored_supervisor:table_definitions()),
-    Config.
-
-end_per_suite(Config) ->
-    ok = application:stop(mnesia),
-    Config.
-
-%% ---------------------------------------------------------------------------
-%% Functional tests
-%% ---------------------------------------------------------------------------
-
-%% Simplest test
-migrate(_Config) ->
-    passed = with_sups(
-      fun([A, _]) ->
-              {ok, _} = ?MS:start_child(a, childspec(worker)),
-              Pid1 = pid_of(worker),
-              kill_registered(A, Pid1),
-              Pid2 = pid_of(worker),
-              false = (Pid1 =:= Pid2)
-      end, [a, b]).
-
-%% Is migration transitive?
-migrate_twice(_Config) ->
-    passed = with_sups(
-      fun([A, B]) ->
-              {ok, _} = ?MS:start_child(a, childspec(worker)),
-              Pid1 = pid_of(worker),
-              kill_registered(A, Pid1),
-              {ok, C} = start_sup(c),
-              Pid2 = pid_of(worker),
-              kill_registered(B, Pid2),
-              Pid3 = pid_of(worker),
-              false = (Pid1 =:= Pid3),
-              kill(C)
-      end, [a, b]).
-
-%% Can't start the same child twice
-already_there(_Config) ->
-    passed = with_sups(
-      fun([_, _]) ->
-              S = childspec(worker),
-              {ok, Pid}                       = ?MS:start_child(a, S),
-              {error, {already_started, Pid}} = ?MS:start_child(b, S)
-      end, [a, b]).
-
-%% Deleting and restarting should work as per a normal supervisor
-delete_restart(_Config) ->
-    passed = with_sups(
-      fun([_, _]) ->
-              S = childspec(worker),
-              {ok, Pid1} = ?MS:start_child(a, S),
-              {error, running} = ?MS:delete_child(a, worker),
-              ok = ?MS:terminate_child(a, worker),
-              ok = ?MS:delete_child(a, worker),
-              {ok, Pid2} = ?MS:start_child(b, S),
-              false = (Pid1 =:= Pid2),
-              ok = ?MS:terminate_child(b, worker),
-              {ok, Pid3} = ?MS:restart_child(b, worker),
-              Pid3 = pid_of(worker),
-              false = (Pid2 =:= Pid3),
-              %% Not the same supervisor as the worker is on
-              ok = ?MS:terminate_child(a, worker),
-              ok = ?MS:delete_child(a, worker),
-              {ok, Pid4} = ?MS:start_child(a, S),
-              false = (Pid3 =:= Pid4)
-      end, [a, b]).
-
-which_children(_Config) ->
-    passed = with_sups(
-      fun([A, B] = Both) ->
-              ?MS:start_child(A, childspec(worker)),
-              assert_wc(Both, fun ([C]) -> true = is_pid(wc_pid(C)) end),
-              ok = ?MS:terminate_child(a, worker),
-              assert_wc(Both, fun ([C]) -> undefined = wc_pid(C) end),
-              {ok, _} = ?MS:restart_child(a, worker),
-              assert_wc(Both, fun ([C]) -> true = is_pid(wc_pid(C)) end),
-              ?MS:start_child(B, childspec(worker2)),
-              assert_wc(Both, fun (C) -> 2 = length(C) end)
-      end, [a, b]).
-
-assert_wc(Sups, Fun) ->
-    [Fun(?MS:which_children(Sup)) || Sup <- Sups].
-
-wc_pid(Child) ->
-    {worker, Pid, worker, [?MODULE]} = Child,
-    Pid.
-
-%% Not all the members of the group should actually do the failover
-large_group(_Config) ->
-    passed = with_sups(
-      fun([A, _, _, _]) ->
-              {ok, _} = ?MS:start_child(a, childspec(worker)),
-              Pid1 = pid_of(worker),
-              kill_registered(A, Pid1),
-              Pid2 = pid_of(worker),
-              false = (Pid1 =:= Pid2)
-      end, [a, b, c, d]).
-
-%% Do childspecs work when returned from init?
-childspecs_at_init(_Config) ->
-    S = childspec(worker),
-    passed = with_sups(
-      fun([A, _]) ->
-              Pid1 = pid_of(worker),
-              kill_registered(A, Pid1),
-              Pid2 = pid_of(worker),
-              false = (Pid1 =:= Pid2)
-      end, [{a, [S]}, {b, [S]}]).
-
-anonymous_supervisors(_Config) ->
-    passed = with_sups(
-      fun([A, _B]) ->
-              {ok, _} = ?MS:start_child(A, childspec(worker)),
-              Pid1 = pid_of(worker),
-              kill_registered(A, Pid1),
-              Pid2 = pid_of(worker),
-              false = (Pid1 =:= Pid2)
-      end, [anon, anon]).
-
-%% When a mirrored_supervisor terminates, we should not migrate, but
-%% the whole supervisor group should shut down. To test this we set up
-%% a situation where the gen_server will only fail if it's running
-%% under the supervisor called 'evil'. It should not migrate to
-%% 'good' and survive, rather the whole group should go away.
-no_migration_on_shutdown(_Config) ->
-    passed = with_sups(
-      fun([Evil, _]) ->
-              {ok, _} = ?MS:start_child(Evil, childspec(worker)),
-              try
-                  call(worker, ping, 1000, 100),
-                  exit(worker_should_not_have_migrated)
-                  catch exit:{timeout_waiting_for_server, _, _} ->
-                      ok
-              end
-      end, [evil, good]).
-
-start_idempotence(_Config) ->
-    passed = with_sups(
-      fun([_]) ->
-              CS = childspec(worker),
-              {ok, Pid}                       = ?MS:start_child(a, CS),
-              {error, {already_started, Pid}} = ?MS:start_child(a, CS),
-              ?MS:terminate_child(a, worker),
-              {error, already_present}        = ?MS:start_child(a, CS)
-      end, [a]).
-
-unsupported(_Config) ->
-    try
-        ?MS:start_link({global, foo}, get_group(group), fun tx_fun/1, ?MODULE,
-                       {one_for_one, []}),
-        exit(no_global)
-    catch error:badarg ->
-        ok
-    end,
-    try
-        {ok, _} = ?MS:start_link({local, foo}, get_group(group),
-          fun tx_fun/1, ?MODULE, {simple_one_for_one, []}),
-        exit(no_sofo)
-    catch error:badarg ->
-        ok
-    end.
-
-%% Just test we don't blow up
-ignore(_Config) ->
-    ?MS:start_link({local, foo}, get_group(group), fun tx_fun/1, ?MODULE,
-                   {fake_strategy_for_ignore, []}).
-
-startup_failure(_Config) ->
-    [test_startup_failure(F) || F <- [want_error, want_exit]].
-
-test_startup_failure(Fail) ->
-    process_flag(trap_exit, true),
-    ?MS:start_link(get_group(group), fun tx_fun/1, ?MODULE,
-                   {one_for_one, [childspec(Fail)]}),
-    receive
-        {'EXIT', _, shutdown} ->
-            ok
-    after 1000 ->
-            exit({did_not_exit, Fail})
-    end,
-    process_flag(trap_exit, false).
-
-%% ---------------------------------------------------------------------------
-
-with_sups(Fun, Sups) ->
-    inc_group(),
-    Pids = [begin {ok, Pid} = start_sup(Sup), Pid end || Sup <- Sups],
-    Fun(Pids),
-    [kill(Pid) || Pid <- Pids, is_process_alive(Pid)],
-    timer:sleep(500),
-    passed.
-
-start_sup(Spec) ->
-    start_sup(Spec, group).
-
-start_sup({Name, ChildSpecs}, Group) ->
-    {ok, Pid} = start_sup0(Name, get_group(Group), ChildSpecs),
-    %% We are not a supervisor, when we kill the supervisor we do not
-    %% want to die!
-    unlink(Pid),
-    {ok, Pid};
-
-start_sup(Name, Group) ->
-    start_sup({Name, []}, Group).
-
-start_sup0(anon, Group, ChildSpecs) ->
-    ?MS:start_link(Group, fun tx_fun/1, ?MODULE,
-                   {one_for_one, ChildSpecs});
-
-start_sup0(Name, Group, ChildSpecs) ->
-    ?MS:start_link({local, Name}, Group, fun tx_fun/1, ?MODULE,
-                   {one_for_one, ChildSpecs}).
-
-childspec(Id) ->
-    {Id,{?SERVER, start_link, [Id]}, transient, 16#ffffffff, worker, [?MODULE]}.
-
-pid_of(Id) ->
-    {received, Pid, ping} = call(Id, ping),
-    Pid.
-
-tx_fun(Fun) ->
-    case mnesia:sync_transaction(Fun) of
-        {atomic,  Result}         -> Result;
-        {aborted, Reason}         -> throw({error, Reason})
-    end.
-
-inc_group() ->
-    Count = case get(counter) of
-                undefined -> 0;
-                C         -> C
-            end + 1,
-    put(counter, Count).
-
-get_group(Group) ->
-    {Group, get(counter)}.
-
-call(Id, Msg) -> call(Id, Msg, 10*1000, 100).
-
-call(Id, Msg, 0, _Decr) ->
-    exit({timeout_waiting_for_server, {Id, Msg}, erlang:get_stacktrace()});
-
-call(Id, Msg, MaxDelay, Decr) ->
-    try
-        gen_server:call(Id, Msg, infinity)
-    catch exit:_ -> timer:sleep(Decr),
-                    call(Id, Msg, MaxDelay - Decr, Decr)
-    end.
-
-kill(Pid) -> kill(Pid, []).
-kill(Pid, Wait) when is_pid(Wait) -> kill(Pid, [Wait]);
-kill(Pid, Waits) ->
-    erlang:monitor(process, Pid),
-    [erlang:monitor(process, P) || P <- Waits],
-    exit(Pid, bang),
-    kill_wait(Pid),
-    [kill_wait(P) || P <- Waits].
-
-kill_registered(Pid, Child) ->
-    {registered_name, Name} = erlang:process_info(Child, registered_name),
-    kill(Pid, Child),
-    false = (Child =:= whereis(Name)),
-    ok.
-
-kill_wait(Pid) ->
-    receive
-        {'DOWN', _Ref, process, Pid, _Reason} ->
-            ok
-    end.
-
-%% ---------------------------------------------------------------------------
-
-init({fake_strategy_for_ignore, _ChildSpecs}) ->
-    ignore;
-
-init({Strategy, ChildSpecs}) ->
-    {ok, {{Strategy, 0, 1}, ChildSpecs}}.
-
diff --git a/rabbitmq-server/test/mirrored_supervisor_SUITE_gs.erl b/rabbitmq-server/test/mirrored_supervisor_SUITE_gs.erl
deleted file mode 100644 (file)
index 867754b..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(mirrored_supervisor_SUITE_gs).
-
-%% Dumb gen_server we can supervise
-
--export([start_link/1]).
-
--export([init/1, handle_call/3, handle_info/2, terminate/2, code_change/3,
-         handle_cast/2]).
-
--behaviour(gen_server).
-
--define(MS,  mirrored_supervisor).
-
-start_link(want_error) ->
-    {error, foo};
-
-start_link(want_exit) ->
-    exit(foo);
-
-start_link(Id) ->
-    gen_server:start_link({local, Id}, ?MODULE, [], []).
-
-%% ---------------------------------------------------------------------------
-
-init([]) ->
-    {ok, state}.
-
-handle_call(Msg, _From, State) ->
-    die_if_my_supervisor_is_evil(),
-    {reply, {received, self(), Msg}, State}.
-
-handle_cast(_Msg, State) ->
-    {noreply, State}.
-
-handle_info(_Info, State) ->
-    {noreply, State}.
-
-terminate(_Reason, _State) ->
-    ok.
-
-code_change(_OldVsn, State, _Extra) ->
-    {ok, State}.
-
-die_if_my_supervisor_is_evil() ->
-    try lists:keysearch(self(), 2, ?MS:which_children(evil)) of
-        false -> ok;
-        _     -> exit(doooom)
-    catch
-        exit:{noproc, _} -> ok
-    end.
diff --git a/rabbitmq-server/test/msg_store_SUITE.erl b/rabbitmq-server/test/msg_store_SUITE.erl
deleted file mode 100644 (file)
index f63f6cb..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(msg_store_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("rabbit_common/include/rabbit.hrl").
-
--compile(export_all).
-
--define(T(Fun, Args), (catch apply(rabbit, Fun, Args))).
-
-all() ->
-    [
-      parameter_validation
-    ].
-
-parameter_validation(_Config) ->
-    %% make sure it works with default values
-    ok = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-            [?CREDIT_DISC_BOUND, ?IO_BATCH_SIZE]),
-
-    %% IO_BATCH_SIZE must be greater than CREDIT_DISC_BOUND initial credit
-    ok = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-            [{2000, 500}, 3000]),
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{2000, 500}, 1500]),
-
-    %% All values must be integers
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{2000, 500}, "1500"]),
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{"2000", 500}, abc]),
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{2000, "500"}, 2048]),
-
-    %% CREDIT_DISC_BOUND must be a tuple
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [[2000, 500], 1500]),
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [2000, 1500]),
-
-    %% config values can't be smaller than default values
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{1999, 500}, 2048]),
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{2000, 499}, 2048]),
-    {error, _} = ?T(validate_msg_store_io_batch_size_and_credit_disc_bound,
-                    [{2000, 500}, 2047]).
diff --git a/rabbitmq-server/test/partitions_SUITE.erl b/rabbitmq-server/test/partitions_SUITE.erl
deleted file mode 100644 (file)
index 1b901b5..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(partitions_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--import(rabbit_ct_broker_helpers, [enable_dist_proxy_manager/1,
-                                   enable_dist_proxy/1,
-                                   enable_dist_proxy_on_node/3]).
-
-%% We set ticktime to 1s and setuptime is 7s so to make sure it
-%% passes...
--define(DELAY, 8000).
-
-all() ->
-    [
-      {group, net_ticktime_1},
-      {group, net_ticktime_10}
-    ].
-
-groups() ->
-    [
-      {net_ticktime_1, [], [
-          {cluster_size_2, [], [
-              ctl_ticktime_sync,
-              prompt_disconnect_detection
-            ]},
-          {cluster_size_3, [], [
-              autoheal,
-              autoheal_after_pause_if_all_down,
-              ignore,
-              pause_if_all_down_on_blocked,
-              pause_if_all_down_on_down,
-              pause_minority_on_blocked,
-              pause_minority_on_down,
-              partial_false_positive,
-              partial_to_full,
-              partial_pause_minority,
-              partial_pause_if_all_down
-            ]}
-        ]},
-      {net_ticktime_10, [], [
-          {cluster_size_2, [], [
-              pause_if_all_down_false_promises_mirrored,
-              pause_if_all_down_false_promises_unmirrored,
-              pause_minority_false_promises_mirrored,
-              pause_minority_false_promises_unmirrored
-            ]}
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config, [
-        fun rabbit_ct_broker_helpers:enable_dist_proxy_manager/1
-      ]).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(net_ticktime_1, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{net_ticktime, 1}]);
-init_per_group(net_ticktime_10, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{net_ticktime, 10}]);
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 2}]);
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 3}]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_clustered, false},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++ [
-        fun rabbit_ct_broker_helpers:enable_dist_proxy/1,
-        fun rabbit_ct_broker_helpers:cluster_nodes/1
-      ]).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-ignore(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    block_unblock([{A, B}, {A, C}]),
-    timer:sleep(?DELAY),
-    [B, C] = partitions(A),
-    [A] = partitions(B),
-    [A] = partitions(C),
-    ok.
-
-pause_minority_on_down(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, pause_minority),
-
-    true = is_running(A),
-
-    rabbit_ct_broker_helpers:kill_node(Config, B),
-    timer:sleep(?DELAY),
-    true = is_running(A),
-
-    rabbit_ct_broker_helpers:kill_node(Config, C),
-    await_running(A, false),
-    ok.
-
-pause_minority_on_blocked(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, pause_minority),
-    pause_on_blocked(A, B, C).
-
-pause_if_all_down_on_down(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, {pause_if_all_down, [C], ignore}),
-    [(true = is_running(N)) || N <- [A, B, C]],
-
-    rabbit_ct_broker_helpers:kill_node(Config, B),
-    timer:sleep(?DELAY),
-    [(true = is_running(N)) || N <- [A, C]],
-
-    rabbit_ct_broker_helpers:kill_node(Config, C),
-    timer:sleep(?DELAY),
-    await_running(A, false),
-    ok.
-
-pause_if_all_down_on_blocked(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, {pause_if_all_down, [C], ignore}),
-    pause_on_blocked(A, B, C).
-
-pause_on_blocked(A, B, C) ->
-    [(true = is_running(N)) || N <- [A, B, C]],
-    block([{A, B}, {A, C}]),
-    await_running(A, false),
-    [await_running(N, true) || N <- [B, C]],
-    unblock([{A, B}, {A, C}]),
-    [await_running(N, true) || N <- [A, B, C]],
-    Status = rpc:call(B, rabbit_mnesia, status, []),
-    [] = rabbit_misc:pget(partitions, Status),
-    ok.
-
-%%% Make sure we do not confirm any messages after a partition has
-%%% happened but before we pause, since any such confirmations would be
-%%% lies.
-%%%
-%%% This test has to use an AB cluster (not ABC) since GM ends up
-%%% taking longer to detect down slaves when there are more nodes and
-%%% we close the window by mistake.
-%%%
-%%% In general there are quite a few ways to accidentally cause this
-%%% test to pass since there are a lot of things in the broker that can
-%%% suddenly take several seconds to time out when TCP connections
-%%% won't establish.
-
-pause_minority_false_promises_mirrored(Config) ->
-    rabbit_ct_broker_helpers:set_ha_policy(Config, 0, <<".*">>, <<"all">>),
-    pause_false_promises(Config, pause_minority).
-
-pause_minority_false_promises_unmirrored(Config) ->
-    pause_false_promises(Config, pause_minority).
-
-pause_if_all_down_false_promises_mirrored(Config) ->
-    rabbit_ct_broker_helpers:set_ha_policy(Config, 0, <<".*">>, <<"all">>),
-    B = rabbit_ct_broker_helpers:get_node_config(Config, 1, nodename),
-    pause_false_promises(Config, {pause_if_all_down, [B], ignore}).
-
-pause_if_all_down_false_promises_unmirrored(Config) ->
-    B = rabbit_ct_broker_helpers:get_node_config(Config, 1, nodename),
-    pause_false_promises(Config, {pause_if_all_down, [B], ignore}).
-
-pause_false_promises(Config, ClusterPartitionHandling) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, [A], ClusterPartitionHandling),
-    ChA = rabbit_ct_client_helpers:open_channel(Config, A),
-    ChB = rabbit_ct_client_helpers:open_channel(Config, B),
-    amqp_channel:call(ChB, #'queue.declare'{queue   = <<"test">>,
-                                            durable = true}),
-    amqp_channel:call(ChA, #'confirm.select'{}),
-    amqp_channel:register_confirm_handler(ChA, self()),
-
-    %% Cause a partition after 1s
-    Self = self(),
-    spawn_link(fun () ->
-                       timer:sleep(1000),
-                       %%io:format(user, "~p BLOCK~n", [calendar:local_time()]),
-                       block([{A, B}]),
-                       unlink(Self)
-               end),
-
-    %% Publish large no of messages, see how many we get confirmed
-    [amqp_channel:cast(ChA, #'basic.publish'{routing_key = <<"test">>},
-                       #amqp_msg{props = #'P_basic'{delivery_mode = 1}}) ||
-        _ <- lists:seq(1, 100000)],
-    %%io:format(user, "~p finish publish~n", [calendar:local_time()]),
-
-    %% Time for the partition to be detected. We don't put this sleep
-    %% in receive_acks since otherwise we'd have another similar sleep
-    %% at the end.
-    timer:sleep(30000),
-    Confirmed = receive_acks(0),
-    %%io:format(user, "~p got acks~n", [calendar:local_time()]),
-    await_running(A, false),
-    %%io:format(user, "~p A stopped~n", [calendar:local_time()]),
-
-    unblock([{A, B}]),
-    await_running(A, true),
-
-    %% But how many made it onto the rest of the cluster?
-    #'queue.declare_ok'{message_count = Survived} =
-        amqp_channel:call(ChB, #'queue.declare'{queue   = <<"test">>,
-                                                durable = true}),
-    %%io:format(user, "~p queue declared~n", [calendar:local_time()]),
-    case Confirmed > Survived of
-        true  -> io:format("Confirmed=~p Survived=~p~n", [Confirmed, Survived]);
-        false -> ok
-    end,
-    true = (Confirmed =< Survived),
-
-    rabbit_ct_client_helpers:close_channel(ChB),
-    rabbit_ct_client_helpers:close_channel(ChA),
-    ok.
-
-receive_acks(Max) ->
-    receive
-        #'basic.ack'{delivery_tag = DTag} ->
-            receive_acks(DTag)
-    after ?DELAY ->
-            Max
-    end.
-
-prompt_disconnect_detection(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ChB = rabbit_ct_client_helpers:open_channel(Config, B),
-    [amqp_channel:call(ChB, #'queue.declare'{}) || _ <- lists:seq(1, 100)],
-    block([{A, B}]),
-    timer:sleep(?DELAY),
-    %% We want to make sure we do not end up waiting for setuptime *
-    %% no of queues. Unfortunately that means we need a timeout...
-    [] = rabbit_ct_broker_helpers:rpc(Config, A,
-      rabbit_amqqueue, info_all, [<<"/">>], ?DELAY),
-    rabbit_ct_client_helpers:close_channel(ChB),
-    ok.
-
-ctl_ticktime_sync(Config) ->
-    %% Server has 1s net_ticktime, make sure ctl doesn't get disconnected
-    Cmd = ["eval", "timer:sleep(5000)."],
-    {ok, "ok\n"} = rabbit_ct_broker_helpers:rabbitmqctl(Config, 0, Cmd).
-
-%% NB: we test full and partial partitions here.
-autoheal(Config) ->
-    set_mode(Config, autoheal),
-    do_autoheal(Config).
-
-autoheal_after_pause_if_all_down(Config) ->
-    [_, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, {pause_if_all_down, [B, C], autoheal}),
-    do_autoheal(Config).
-
-do_autoheal(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    Test = fun (Pairs) ->
-                   block_unblock(Pairs),
-                   %% Sleep to make sure all the partitions are noticed
-                   %% ?DELAY for the net_tick timeout
-                   timer:sleep(?DELAY),
-                   [await_listening(N, true) || N <- [A, B, C]],
-                   [await_partitions(N, []) || N <- [A, B, C]]
-           end,
-    Test([{B, C}]),
-    Test([{A, C}, {B, C}]),
-    Test([{A, B}, {A, C}, {B, C}]),
-    ok.
-
-partial_false_positive(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    block([{A, B}]),
-    timer:sleep(1000),
-    block([{A, C}]),
-    timer:sleep(?DELAY),
-    unblock([{A, B}, {A, C}]),
-    timer:sleep(?DELAY),
-    %% When B times out A's connection, it will check with C. C will
-    %% not have timed out A yet, but already it can't talk to it. We
-    %% need to not consider this a partial partition; B and C should
-    %% still talk to each other.
-    [B, C] = partitions(A),
-    [A] = partitions(B),
-    [A] = partitions(C),
-    ok.
-
-partial_to_full(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    block_unblock([{A, B}]),
-    timer:sleep(?DELAY),
-    %% There are several valid ways this could go, depending on how
-    %% the DOWN messages race: either A gets disconnected first and BC
-    %% stay together, or B gets disconnected first and AC stay
-    %% together, or both make it through and all three get
-    %% disconnected.
-    case {partitions(A), partitions(B), partitions(C)} of
-        {[B, C], [A],    [A]}    -> ok;
-        {[B],    [A, C], [B]}    -> ok;
-        {[B, C], [A, C], [A, B]} -> ok;
-        Partitions               -> exit({partitions, Partitions})
-    end.
-
-partial_pause_minority(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, pause_minority),
-    block([{A, B}]),
-    [await_running(N, false) || N <- [A, B]],
-    await_running(C, true),
-    unblock([{A, B}]),
-    [await_listening(N, true) || N <- [A, B, C]],
-    [await_partitions(N, []) || N <- [A, B, C]],
-    ok.
-
-partial_pause_if_all_down(Config) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    set_mode(Config, {pause_if_all_down, [B], ignore}),
-    block([{A, B}]),
-    await_running(A, false),
-    [await_running(N, true) || N <- [B, C]],
-    unblock([{A, B}]),
-    [await_listening(N, true) || N <- [A, B, C]],
-    [await_partitions(N, []) || N <- [A, B, C]],
-    ok.
-
-set_mode(Config, Mode) ->
-    rabbit_ct_broker_helpers:set_partition_handling_mode_globally(Config, Mode).
-
-set_mode(Config, Nodes, Mode) ->
-    rabbit_ct_broker_helpers:set_partition_handling_mode(Config, Nodes, Mode).
-
-block_unblock(Pairs) ->
-    block(Pairs),
-    timer:sleep(?DELAY),
-    unblock(Pairs).
-
-block(Pairs)   -> [block(X, Y) || {X, Y} <- Pairs].
-unblock(Pairs) -> [allow(X, Y) || {X, Y} <- Pairs].
-
-partitions(Node) ->
-    case rpc:call(Node, rabbit_node_monitor, partitions, []) of
-        {badrpc, {'EXIT', E}} = R -> case rabbit_misc:is_abnormal_exit(E) of
-                                         true  -> R;
-                                         false -> timer:sleep(1000),
-                                                  partitions(Node)
-                                     end;
-        Partitions                -> Partitions
-    end.
-
-block(X, Y) ->
-    rabbit_ct_broker_helpers:block_traffic_between(X, Y).
-
-allow(X, Y) ->
-    rabbit_ct_broker_helpers:allow_traffic_between(X, Y).
-
-await_running   (Node, Bool)  -> await(Node, Bool,  fun is_running/1).
-await_listening (Node, Bool)  -> await(Node, Bool,  fun is_listening/1).
-await_partitions(Node, Parts) -> await(Node, Parts, fun partitions/1).
-
-await(Node, Res, Fun) ->
-    case Fun(Node) of
-        Res -> ok;
-        _   -> timer:sleep(100),
-               await(Node, Res, Fun)
-    end.
-
-is_running(Node) -> rpc:call(Node, rabbit, is_running, []).
-
-is_listening(Node) ->
-    case rpc:call(Node, rabbit_networking, node_listeners, [Node]) of
-        []    -> false;
-        [_|_] -> true;
-        _     -> false
-    end.
diff --git a/rabbitmq-server/test/priority_queue_SUITE.erl b/rabbitmq-server/test/priority_queue_SUITE.erl
deleted file mode 100644 (file)
index 05853eb..0000000
+++ /dev/null
@@ -1,671 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(priority_queue_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, cluster_size_2},
-      {group, cluster_size_3}
-    ].
-
-groups() ->
-    [
-     {cluster_size_2, [], [
-                           ackfold,
-                           drop,
-                           dropwhile_fetchwhile,
-                           info_head_message_timestamp,
-                           matching,
-                           mirror_queue_sync,
-                           mirror_queue_sync_priority_above_max,
-                           mirror_queue_sync_priority_above_max_pending_ack,
-                           mirror_queue_sync_order,
-                           purge,
-                           requeue,
-                           resume,
-                           simple_order,
-                           straight_through,
-                           invoke
-                          ]},
-     {cluster_size_3, [], [
-                           mirror_queue_auto_ack,
-                           mirror_fast_reset_policy,
-                           mirror_reset_policy
-                          ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_2, Config) ->
-    Suffix = rabbit_ct_helpers:testcase_absname(Config, "", "-"),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-                                                    {rmq_nodes_count, 2},
-                                                    {rmq_nodename_suffix, Suffix}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps());
-init_per_group(cluster_size_3, Config) ->
-    Suffix = rabbit_ct_helpers:testcase_absname(Config, "", "-"),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-                                                    {rmq_nodes_count, 3},
-                                                    {rmq_nodename_suffix, Suffix}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_group(_Group, Config) ->
-    rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_client_helpers:setup_steps(),
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_client_helpers:teardown_steps(),
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-%% The BQ API is used in all sorts of places in all sorts of
-%% ways. Therefore we have to jump through a few different hoops
-%% in order to integration-test it.
-%%
-%% * start/1, stop/0, init/3, terminate/2, delete_and_terminate/2
-%%   - starting and stopping rabbit. durable queues / persistent msgs needed
-%%     to test recovery
-%%
-%% * publish/5, drain_confirmed/1, fetch/2, ack/2, is_duplicate/2, msg_rates/1,
-%%   needs_timeout/1, timeout/1, invoke/3, resume/1 [0]
-%%   - regular publishing and consuming, with confirms and acks and durability
-%%
-%% * publish_delivered/4    - publish with acks straight through
-%% * discard/3              - publish without acks straight through
-%% * dropwhile/2            - expire messages without DLX
-%% * fetchwhile/4           - expire messages with DLX
-%% * ackfold/4              - reject messages with DLX
-%% * requeue/2              - reject messages without DLX
-%% * drop/2                 - maxlen messages without DLX
-%% * purge/1                - issue AMQP queue.purge
-%% * purge_acks/1           - mirror queue explicit sync with unacked msgs
-%% * fold/3                 - mirror queue explicit sync
-%% * depth/1                - mirror queue implicit sync detection
-%% * len/1, is_empty/1      - info items
-%% * handle_pre_hibernate/1 - hibernation
-%%
-%% * set_ram_duration_target/2, ram_duration/1, status/1
-%%   - maybe need unit testing?
-%%
-%% [0] publish enough to get credit flow from msg store
-
-simple_order(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"simple_order-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [1, 2, 3, 1, 2, 3, 1, 2, 3]),
-    get_all(Ch, Q, do_ack, [3, 3, 3, 2, 2, 2, 1, 1, 1]),
-    publish(Ch, Q, [2, 3, 1, 2, 3, 1, 2, 3, 1]),
-    get_all(Ch, Q, no_ack, [3, 3, 3, 2, 2, 2, 1, 1, 1]),
-    publish(Ch, Q, [3, 1, 2, 3, 1, 2, 3, 1, 2]),
-    get_all(Ch, Q, do_ack, [3, 3, 3, 2, 2, 2, 1, 1, 1]),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-matching(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"matching-queue">>,
-    declare(Ch, Q, 5),
-    %% We round priority down, and 0 is the default
-    publish(Ch, Q, [undefined, 0, 5, 10, undefined]),
-    get_all(Ch, Q, do_ack, [5, 10, undefined, 0, undefined]),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-resume(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"resume-queue">>,
-    declare(Ch, Q, 5),
-    amqp_channel:call(Ch, #'confirm.select'{}),
-    publish_many(Ch, Q, 10000),
-    amqp_channel:wait_for_confirms(Ch),
-    amqp_channel:call(Ch, #'queue.purge'{queue = Q}), %% Assert it exists
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-straight_through(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"straight_through-queue">>,
-    declare(Ch, Q, 3),
-    [begin
-         consume(Ch, Q, Ack),
-         [begin
-              publish1(Ch, Q, P),
-              assert_delivered(Ch, Ack, P)
-          end || P <- [1, 2, 3]],
-         cancel(Ch)
-     end || Ack <- [do_ack, no_ack]],
-    get_empty(Ch, Q),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-invoke(Config) ->
-    %% Synthetic test to check the invoke callback, as the bug tested here
-    %% is only triggered with a race condition.
-    %% When mirroring is stopped, the backing queue of rabbit_amqqueue_process
-    %% changes from rabbit_mirror_queue_master to rabbit_priority_queue,
-    %% which shouldn't receive any invoke call. However, there might
-    %% be pending messages so the priority queue receives the
-    %% `run_backing_queue` cast message sent to the old master.
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, A),
-    Q = <<"invoke-queue">>,
-    declare(Ch, Q, 3),
-    Pid = queue_pid(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    rabbit_ct_broker_helpers:rpc(
-      Config, A, gen_server, cast,
-      [Pid,
-       {run_backing_queue, ?MODULE, fun(_, _) -> ok end}]),
-    Pid2 = queue_pid(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    Pid = Pid2,
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-dropwhile_fetchwhile(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"dropwhile_fetchwhile-queue">>,
-    [begin
-         declare(Ch, Q, Args ++ arguments(3)),
-         publish(Ch, Q, [1, 2, 3, 1, 2, 3, 1, 2, 3]),
-         timer:sleep(10),
-         get_empty(Ch, Q),
-         delete(Ch, Q)
-     end ||
-        Args <- [[{<<"x-message-ttl">>, long, 1}],
-                 [{<<"x-message-ttl">>,          long,    1},
-                  {<<"x-dead-letter-exchange">>, longstr, <<"amq.fanout">>}]
-                ]],
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-ackfold(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"ackfolq-queue1">>,
-    Q2 = <<"ackfold-queue2">>,
-    declare(Ch, Q,
-            [{<<"x-dead-letter-exchange">>, longstr, <<>>},
-             {<<"x-dead-letter-routing-key">>, longstr, Q2}
-             | arguments(3)]),
-    declare(Ch, Q2, none),
-    publish(Ch, Q, [1, 2, 3]),
-    [_, _, DTag] = get_all(Ch, Q, manual_ack, [3, 2, 1]),
-    amqp_channel:cast(Ch, #'basic.nack'{delivery_tag = DTag,
-                                        multiple     = true,
-                                        requeue      = false}),
-    timer:sleep(100),
-    get_all(Ch, Q2, do_ack, [3, 2, 1]),
-    delete(Ch, Q),
-    delete(Ch, Q2),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-requeue(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"requeue-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [1, 2, 3]),
-    [_, _, DTag] = get_all(Ch, Q, manual_ack, [3, 2, 1]),
-    amqp_channel:cast(Ch, #'basic.nack'{delivery_tag = DTag,
-                                        multiple     = true,
-                                        requeue      = true}),
-    get_all(Ch, Q, do_ack, [3, 2, 1]),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-drop(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"drop-queue">>,
-    declare(Ch, Q, [{<<"x-max-length">>, long, 4} | arguments(3)]),
-    publish(Ch, Q, [1, 2, 3, 1, 2, 3, 1, 2, 3]),
-    %% We drop from the head, so this is according to the "spec" even
-    %% if not likely to be what the user wants.
-    get_all(Ch, Q, do_ack, [2, 1, 1, 1]),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-purge(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"purge-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [1, 2, 3]),
-    amqp_channel:call(Ch, #'queue.purge'{queue = Q}),
-    get_empty(Ch, Q),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-info_head_message_timestamp(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, info_head_message_timestamp1, [Config]).
-
-info_head_message_timestamp1(_Config) ->
-    QName = rabbit_misc:r(<<"/">>, queue,
-      <<"info_head_message_timestamp-queue">>),
-    Q0 = rabbit_amqqueue:pseudo_queue(QName, self()),
-    Q = Q0#amqqueue{arguments = [{<<"x-max-priority">>, long, 2}]},
-    PQ = rabbit_priority_queue,
-    BQS1 = PQ:init(Q, new, fun(_, _) -> ok end),
-    %% The queue is empty: no timestamp.
-    true = PQ:is_empty(BQS1),
-    '' = PQ:info(head_message_timestamp, BQS1),
-    %% Publish one message with timestamp 1000.
-    Msg1 = #basic_message{
-      id = msg1,
-      content = #content{
-        properties = #'P_basic'{
-          priority = 1,
-          timestamp = 1000
-        }},
-      is_persistent = false
-    },
-    BQS2 = PQ:publish(Msg1, #message_properties{size = 0}, false, self(),
-      noflow, BQS1),
-    1000 = PQ:info(head_message_timestamp, BQS2),
-    %% Publish a higher priority message with no timestamp.
-    Msg2 = #basic_message{
-      id = msg2,
-      content = #content{
-        properties = #'P_basic'{
-          priority = 2
-        }},
-      is_persistent = false
-    },
-    BQS3 = PQ:publish(Msg2, #message_properties{size = 0}, false, self(),
-      noflow, BQS2),
-    '' = PQ:info(head_message_timestamp, BQS3),
-    %% Consume message with no timestamp.
-    {{Msg2, _, _}, BQS4} = PQ:fetch(false, BQS3),
-    1000 = PQ:info(head_message_timestamp, BQS4),
-    %% Consume message with timestamp 1000, but do not acknowledge it
-    %% yet. The goal is to verify that the unacknowledged message's
-    %% timestamp is returned.
-    {{Msg1, _, AckTag}, BQS5} = PQ:fetch(true, BQS4),
-    1000 = PQ:info(head_message_timestamp, BQS5),
-    %% Ack message. The queue is empty now.
-    {[msg1], BQS6} = PQ:ack([AckTag], BQS5),
-    true = PQ:is_empty(BQS6),
-    '' = PQ:info(head_message_timestamp, BQS6),
-    PQ:delete_and_terminate(a_whim, BQS6),
-    passed.
-
-ram_duration(_Config) ->
-    QName = rabbit_misc:r(<<"/">>, queue, <<"ram_duration-queue">>),
-    Q0 = rabbit_amqqueue:pseudo_queue(QName, self()),
-    Q = Q0#amqqueue{arguments = [{<<"x-max-priority">>, long, 5}]},
-    PQ = rabbit_priority_queue,
-    BQS1 = PQ:init(Q, new, fun(_, _) -> ok end),
-    {_Duration1, BQS2} = PQ:ram_duration(BQS1),
-    BQS3 = PQ:set_ram_duration_target(infinity, BQS2),
-    BQS4 = PQ:set_ram_duration_target(1, BQS3),
-    {_Duration2, BQS5} = PQ:ram_duration(BQS4),
-    PQ:delete_and_terminate(a_whim, BQS5),
-    passed.
-
-mirror_queue_sync(Config) ->
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, 0),
-    Q = <<"mirror_queue_sync-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [1, 2, 3]),
-    ok = rabbit_ct_broker_helpers:set_ha_policy(Config, 0,
-      <<"^mirror_queue_sync-queue$">>, <<"all">>),
-    publish(Ch, Q, [1, 2, 3, 1, 2, 3]),
-    %% master now has 9, slave 6.
-    get_partial(Ch, Q, manual_ack, [3, 3, 3, 2, 2, 2]),
-    %% So some but not all are unacked at the slave
-    Nodename0 = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    rabbit_ct_broker_helpers:control_action(sync_queue, Nodename0,
-      [binary_to_list(Q)], [{"-p", "/"}]),
-    wait_for_sync(Config, Nodename0, rabbit_misc:r(<<"/">>, queue, Q)),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-mirror_queue_sync_priority_above_max(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    %% Tests synchronisation of slaves when priority is higher than max priority.
-    %% This causes an infinity loop (and test timeout) before rabbitmq-server-795
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, A),
-    Q = <<"mirror_queue_sync_priority_above_max-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [5, 5, 5]),
-    ok = rabbit_ct_broker_helpers:set_ha_policy(Config, A,
-      <<".*">>, <<"all">>),
-    rabbit_ct_broker_helpers:control_action(sync_queue, A,
-      [binary_to_list(Q)], [{"-p", "/"}]),
-    wait_for_sync(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-mirror_queue_sync_priority_above_max_pending_ack(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    %% Tests synchronisation of slaves when priority is higher than max priority
-    %% and there are pending acks.
-    %% This causes an infinity loop (and test timeout) before rabbitmq-server-795
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, A),
-    Q = <<"mirror_queue_sync_priority_above_max_pending_ack-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [5, 5, 5]),
-    %% Consume but 'forget' to acknowledge
-    get_without_ack(Ch, Q),
-    get_without_ack(Ch, Q),
-    ok = rabbit_ct_broker_helpers:set_ha_policy(Config, A,
-      <<".*">>, <<"all">>),
-    rabbit_ct_broker_helpers:control_action(sync_queue, A,
-      [binary_to_list(Q)], [{"-p", "/"}]),
-    wait_for_sync(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    synced_msgs(Config, A, rabbit_misc:r(<<"/">>, queue, Q), 3),
-    synced_msgs(Config, B, rabbit_misc:r(<<"/">>, queue, Q), 3),
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-mirror_queue_auto_ack(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    %% Check correct use of AckRequired in the notifications to the slaves.
-    %% If slaves are notified with AckRequired == true when it is false,
-    %% the slaves will crash with the depth notification as they will not
-    %% match the master delta.
-    %% Bug rabbitmq-server 687
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, A),
-    Q = <<"mirror_queue_auto_ack-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [1, 2, 3]),
-    ok = rabbit_ct_broker_helpers:set_ha_policy(Config, A,
-      <<".*">>, <<"all">>),
-    get_partial(Ch, Q, no_ack, [3, 2, 1]),
-
-    %% Retrieve slaves
-    SPids = slave_pids(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    [{SNode1, _SPid1}, {SNode2, SPid2}] = nodes_and_pids(SPids),
-
-    %% Restart one of the slaves so `request_depth` is triggered
-    rabbit_ct_broker_helpers:restart_node(Config, SNode1),
-
-    %% The alive slave must have the same pid after its neighbour is restarted
-    timer:sleep(3000), %% ugly but we can't know when the `depth` instruction arrives
-    Slaves = nodes_and_pids(slave_pids(Config, A, rabbit_misc:r(<<"/">>, queue, Q))),
-    SPid2 = proplists:get_value(SNode2, Slaves),
-
-    delete(Ch, Q),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-mirror_queue_sync_order(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    B = rabbit_ct_broker_helpers:get_node_config(Config, 1, nodename),
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, A),
-    {Conn2, Ch2} = rabbit_ct_client_helpers:open_connection_and_channel(Config, B),
-    Q = <<"mirror_queue_sync_order-queue">>,
-    declare(Ch, Q, 3),
-    publish_payload(Ch, Q, [{1, <<"msg1">>}, {2, <<"msg2">>},
-                            {2, <<"msg3">>}, {2, <<"msg4">>},
-                            {3, <<"msg5">>}]),
-    rabbit_ct_client_helpers:close_channel(Ch),
-
-    %% Add and sync slave
-    ok = rabbit_ct_broker_helpers:set_ha_policy(
-           Config, A, <<"^mirror_queue_sync_order-queue$">>, <<"all">>),
-    rabbit_ct_broker_helpers:control_action(sync_queue, A,
-                                            [binary_to_list(Q)], [{"-p", "/"}]),
-    wait_for_sync(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-
-    %% Stop the master
-    rabbit_ct_broker_helpers:stop_node(Config, A),
-
-    get_payload(Ch2, Q, do_ack, [<<"msg5">>, <<"msg2">>, <<"msg3">>,
-                                 <<"msg4">>, <<"msg1">>]),
-
-    delete(Ch2, Q),
-    rabbit_ct_broker_helpers:start_node(Config, A),
-    rabbit_ct_client_helpers:close_connection(Conn),
-    rabbit_ct_client_helpers:close_connection(Conn2),
-    passed.
-
-mirror_reset_policy(Config) ->
-    %% Gives time to the master to go through all stages.
-    %% Might eventually trigger some race conditions from #802,
-    %% although for that I would expect a longer run and higher
-    %% number of messages in the system.
-    mirror_reset_policy(Config, 5000).
-
-mirror_fast_reset_policy(Config) ->
-    %% This test seems to trigger the bug tested in invoke/1, but it
-    %% cannot guarantee it will always happen. Thus, both tests
-    %% should stay in the test suite.
-    mirror_reset_policy(Config, 5).
-
-
-mirror_reset_policy(Config, Wait) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {Conn, Ch} = rabbit_ct_client_helpers:open_connection_and_channel(Config, A),
-    Q = <<"mirror_reset_policy-queue">>,
-    declare(Ch, Q, 5),
-    Pid = queue_pid(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    publish_many(Ch, Q, 20000),
-    [begin
-         rabbit_ct_broker_helpers:set_ha_policy(
-           Config, A, <<"^mirror_reset_policy-queue$">>, <<"all">>,
-           [{<<"ha-sync-mode">>, <<"automatic">>}]),
-         timer:sleep(Wait),
-         rabbit_ct_broker_helpers:clear_policy(
-           Config, A, <<"^mirror_reset_policy-queue$">>),
-         timer:sleep(Wait)
-     end || _ <- lists:seq(1, 10)],
-    timer:sleep(1000),
-    ok = rabbit_ct_broker_helpers:set_ha_policy(
-           Config, A, <<"^mirror_reset_policy-queue$">>, <<"all">>,
-           [{<<"ha-sync-mode">>, <<"automatic">>}]),
-    wait_for_sync(Config, A, rabbit_misc:r(<<"/">>, queue, Q), 2),
-    %% Verify master has not crashed
-    Pid = queue_pid(Config, A, rabbit_misc:r(<<"/">>, queue, Q)),
-    delete(Ch, Q),
-
-    rabbit_ct_client_helpers:close_connection(Conn),
-    passed.
-
-%%----------------------------------------------------------------------------
-
-declare(Ch, Q, Args) when is_list(Args) ->
-    amqp_channel:call(Ch, #'queue.declare'{queue     = Q,
-                                           durable   = true,
-                                           arguments = Args});
-declare(Ch, Q, Max) ->
-    declare(Ch, Q, arguments(Max)).
-
-delete(Ch, Q) ->
-    amqp_channel:call(Ch, #'queue.delete'{queue = Q}).
-
-publish(Ch, Q, Ps) ->
-    amqp_channel:call(Ch, #'confirm.select'{}),
-    [publish1(Ch, Q, P) || P <- Ps],
-    amqp_channel:wait_for_confirms(Ch).
-
-publish_payload(Ch, Q, PPds) ->
-    amqp_channel:call(Ch, #'confirm.select'{}),
-    [publish1(Ch, Q, P, Pd) || {P, Pd} <- PPds],
-    amqp_channel:wait_for_confirms(Ch).
-
-publish_many(_Ch, _Q, 0) -> ok;
-publish_many( Ch,  Q, N) -> publish1(Ch, Q, rand_compat:uniform(5)),
-                            publish_many(Ch, Q, N - 1).
-
-publish1(Ch, Q, P) ->
-    amqp_channel:cast(Ch, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props   = props(P),
-                                payload = priority2bin(P)}).
-
-publish1(Ch, Q, P, Pd) ->
-    amqp_channel:cast(Ch, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props   = props(P),
-                                payload = Pd}).
-
-props(undefined) -> #'P_basic'{delivery_mode = 2};
-props(P)         -> #'P_basic'{priority      = P,
-                               delivery_mode = 2}.
-
-consume(Ch, Q, Ack) ->
-    amqp_channel:subscribe(Ch, #'basic.consume'{queue        = Q,
-                                                no_ack       = Ack =:= no_ack,
-                                                consumer_tag = <<"ctag">>},
-                           self()),
-    receive
-        #'basic.consume_ok'{consumer_tag = <<"ctag">>} ->
-             ok
-    end.
-
-cancel(Ch) ->
-    amqp_channel:call(Ch, #'basic.cancel'{consumer_tag = <<"ctag">>}).
-
-assert_delivered(Ch, Ack, P) ->
-    PBin = priority2bin(P),
-    receive
-        {#'basic.deliver'{delivery_tag = DTag}, #amqp_msg{payload = PBin2}} ->
-            PBin = PBin2,
-            maybe_ack(Ch, Ack, DTag)
-    end.
-
-get_all(Ch, Q, Ack, Ps) ->
-    DTags = get_partial(Ch, Q, Ack, Ps),
-    get_empty(Ch, Q),
-    DTags.
-
-get_partial(Ch, Q, Ack, Ps) ->
-    [get_ok(Ch, Q, Ack, priority2bin(P)) || P <- Ps].
-
-get_empty(Ch, Q) ->
-    #'basic.get_empty'{} = amqp_channel:call(Ch, #'basic.get'{queue = Q}).
-
-get_ok(Ch, Q, Ack, PBin) ->
-    {#'basic.get_ok'{delivery_tag = DTag}, #amqp_msg{payload = PBin2}} =
-        amqp_channel:call(Ch, #'basic.get'{queue  = Q,
-                                           no_ack = Ack =:= no_ack}),
-    PBin = PBin2,
-    maybe_ack(Ch, Ack, DTag).
-
-get_payload(Ch, Q, Ack, Ps) ->
-    [get_ok(Ch, Q, Ack, P) || P <- Ps].
-
-get_without_ack(Ch, Q) ->
-    {#'basic.get_ok'{}, _} =
-        amqp_channel:call(Ch, #'basic.get'{queue  = Q, no_ack = false}).
-
-maybe_ack(Ch, do_ack, DTag) ->
-    amqp_channel:cast(Ch, #'basic.ack'{delivery_tag = DTag}),
-    DTag;
-maybe_ack(_Ch, _, DTag) ->
-    DTag.
-
-arguments(none) -> [];
-arguments(Max)  -> [{<<"x-max-priority">>, byte, Max}].
-
-priority2bin(undefined) -> <<"undefined">>;
-priority2bin(Int)       -> list_to_binary(integer_to_list(Int)).
-
-%%----------------------------------------------------------------------------
-
-wait_for_sync(Config, Nodename, Q) ->
-    wait_for_sync(Config, Nodename, Q, 1).
-
-wait_for_sync(Config, Nodename, Q, Nodes) ->
-    wait_for_sync(Config, Nodename, Q, Nodes, 600).
-
-wait_for_sync(_, _, _, _, 0) ->
-    throw(sync_timeout);
-wait_for_sync(Config, Nodename, Q, Nodes, N) ->
-    case synced(Config, Nodename, Q, Nodes) of
-        true  -> ok;
-        false -> timer:sleep(100),
-                 wait_for_sync(Config, Nodename, Q, Nodes, N-1)
-    end.
-
-synced(Config, Nodename, Q, Nodes) ->
-    Info = rabbit_ct_broker_helpers:rpc(Config, Nodename,
-      rabbit_amqqueue, info_all, [<<"/">>, [name, synchronised_slave_pids]]),
-    [SSPids] = [Pids || [{name, Q1}, {synchronised_slave_pids, Pids}] <- Info,
-                        Q =:= Q1],
-    length(SSPids) =:= Nodes.
-
-synced_msgs(Config, Nodename, Q, Expected) ->
-    Info = rabbit_ct_broker_helpers:rpc(Config, Nodename,
-      rabbit_amqqueue, info_all, [<<"/">>, [name, messages]]),
-    [M] = [M || [{name, Q1}, {messages, M}] <- Info, Q =:= Q1],
-    M =:= Expected.
-
-nodes_and_pids(SPids) ->
-    lists:zip([node(S) || S <- SPids], SPids).
-
-slave_pids(Config, Nodename, Q) ->
-    Info = rabbit_ct_broker_helpers:rpc(Config, Nodename,
-      rabbit_amqqueue, info_all, [<<"/">>, [name, slave_pids]]),
-    [SPids] = [SPids || [{name, Q1}, {slave_pids, SPids}] <- Info,
-                        Q =:= Q1],
-    SPids.
-
-queue_pid(Config, Nodename, Q) ->
-    Info = rabbit_ct_broker_helpers:rpc(
-             Config, Nodename,
-             rabbit_amqqueue, info_all, [<<"/">>, [name, pid]]),
-    [Pid] = [P || [{name, Q1}, {pid, P}] <- Info, Q =:= Q1],
-    Pid.
-
-%%----------------------------------------------------------------------------
diff --git a/rabbitmq-server/test/priority_queue_recovery_SUITE.erl b/rabbitmq-server/test/priority_queue_recovery_SUITE.erl
deleted file mode 100644 (file)
index 9e2ffbd..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(priority_queue_recovery_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, non_parallel_tests}
-    ].
-
-groups() ->
-    [
-     {non_parallel_tests, [], [
-                               recovery %% Restart RabbitMQ.
-                              ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(_, Config) ->
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 2}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_group(_, Config) ->
-    rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()).
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-recovery(Config) ->
-    {Conn, Ch} = open(Config),
-    Q = <<"recovery-queue">>,
-    declare(Ch, Q, 3),
-    publish(Ch, Q, [1, 2, 3, 1, 2, 3, 1, 2, 3]),
-    rabbit_ct_client_helpers:close_channel(Ch),
-    rabbit_ct_client_helpers:close_connection(Conn),
-
-    rabbit_ct_broker_helpers:restart_broker(Config, 0),
-
-    {Conn2, Ch2} = open(Config, 1),
-    get_all(Ch2, Q, do_ack, [3, 3, 3, 2, 2, 2, 1, 1, 1]),
-    delete(Ch2, Q),
-    rabbit_ct_client_helpers:close_channel(Ch2),
-    rabbit_ct_client_helpers:close_connection(Conn2),
-    passed.
-
-
-%%----------------------------------------------------------------------------
-
-open(Config) ->
-    open(Config, 0).
-
-open(Config, NodeIndex) ->
-    rabbit_ct_client_helpers:open_connection_and_channel(Config, NodeIndex).
-
-declare(Ch, Q, Args) when is_list(Args) ->
-    amqp_channel:call(Ch, #'queue.declare'{queue     = Q,
-                                           durable   = true,
-                                           arguments = Args});
-declare(Ch, Q, Max) ->
-    declare(Ch, Q, arguments(Max)).
-
-delete(Ch, Q) ->
-    amqp_channel:call(Ch, #'queue.delete'{queue = Q}).
-
-publish(Ch, Q, Ps) ->
-    amqp_channel:call(Ch, #'confirm.select'{}),
-    [publish1(Ch, Q, P) || P <- Ps],
-    amqp_channel:wait_for_confirms(Ch).
-
-publish1(Ch, Q, P) ->
-    amqp_channel:cast(Ch, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props   = props(P),
-                                payload = priority2bin(P)}).
-
-publish1(Ch, Q, P, Pd) ->
-    amqp_channel:cast(Ch, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props   = props(P),
-                                payload = Pd}).
-
-get_all(Ch, Q, Ack, Ps) ->
-    DTags = get_partial(Ch, Q, Ack, Ps),
-    get_empty(Ch, Q),
-    DTags.
-
-get_partial(Ch, Q, Ack, Ps) ->
-    [get_ok(Ch, Q, Ack, priority2bin(P)) || P <- Ps].
-
-get_empty(Ch, Q) ->
-    #'basic.get_empty'{} = amqp_channel:call(Ch, #'basic.get'{queue = Q}).
-
-get_ok(Ch, Q, Ack, PBin) ->
-    {#'basic.get_ok'{delivery_tag = DTag}, #amqp_msg{payload = PBin2}} =
-        amqp_channel:call(Ch, #'basic.get'{queue  = Q,
-                                           no_ack = Ack =:= no_ack}),
-    PBin = PBin2,
-    maybe_ack(Ch, Ack, DTag).
-
-maybe_ack(Ch, do_ack, DTag) ->
-    amqp_channel:cast(Ch, #'basic.ack'{delivery_tag = DTag}),
-    DTag;
-maybe_ack(_Ch, _, DTag) ->
-    DTag.
-
-arguments(none) -> [];
-arguments(Max)  -> [{<<"x-max-priority">>, byte, Max}].
-
-priority2bin(undefined) -> <<"undefined">>;
-priority2bin(Int)       -> list_to_binary(integer_to_list(Int)).
-
-props(undefined) -> #'P_basic'{delivery_mode = 2};
-props(P)         -> #'P_basic'{priority      = P,
-                               delivery_mode = 2}.
diff --git a/rabbitmq-server/test/queue_master_location_SUITE.erl b/rabbitmq-server/test/queue_master_location_SUITE.erl
deleted file mode 100644 (file)
index e77f27f..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(queue_master_location_SUITE).
-
-%% These tests use an ABC cluster with each node initialised with
-%% a different number of queues. When a queue is declared, different
-%% strategies can be applied to determine the queue's master node. Queue
-%% location strategies can be applied in the following ways;
-%%   1. As policy,
-%%   2. As config (in rabbitmq.config),
-%%   3. or as part of the queue's declare arguements.
-%%
-%% Currently supported strategies are;
-%%   min-masters : The queue master node is calculated as the one with the
-%%                 least bound queues in the cluster.
-%%   client-local: The queue master node is the local node from which
-%%                 the declaration is being carried out from
-%%   random      : The queue master node is randomly selected.
-%%
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(DEFAULT_VHOST_PATH, (<<"/">>)).
--define(POLICY, <<"^qm.location$">>).
-
-all() ->
-    [
-      {group, cluster_size_3}
-    ].
-
-groups() ->
-    [
-      {cluster_size_3, [], [
-          declare_args,
-          declare_policy,
-          declare_config,
-          calculate_min_master,
-          calculate_random,
-          calculate_client_local
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 3} %% Replaced with a list of node names later.
-      ]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    Nodenames = [
-      list_to_atom(rabbit_misc:format("~s-~b", [Testcase, I]))
-      || I <- lists:seq(1, ClusterSize)
-    ],
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, Nodenames},
-        {rmq_nodes_clustered, true},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps()).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-%%
-%% Queue 'declarations'
-%%
-
-declare_args(Config) ->
-    setup_test_environment(Config),
-    unset_location_config(Config),
-    QueueName = rabbit_misc:r(<<"/">>, queue, Q= <<"qm.test">>),
-    Args = [{<<"x-queue-master-locator">>, <<"min-masters">>}],
-    declare(Config, QueueName, false, false, Args, none),
-    verify_min_master(Config, Q).
-
-declare_policy(Config) ->
-    setup_test_environment(Config),
-    unset_location_config(Config),
-    set_location_policy(Config, ?POLICY, <<"min-masters">>),
-    QueueName = rabbit_misc:r(<<"/">>, queue, Q= <<"qm.test">>),
-    declare(Config, QueueName, false, false, _Args=[], none),
-    verify_min_master(Config, Q).
-
-declare_config(Config) ->
-    setup_test_environment(Config),
-    set_location_config(Config, <<"min-masters">>),
-    QueueName = rabbit_misc:r(<<"/">>, queue, Q= <<"qm.test">>),
-    declare(Config, QueueName, false, false, _Args=[], none),
-    verify_min_master(Config, Q),
-    unset_location_config(Config),
-    ok.
-
-%%
-%% Test 'calculations'
-%%
-
-calculate_min_master(Config) ->
-    setup_test_environment(Config),
-    QueueName = rabbit_misc:r(<<"/">>, queue, Q= <<"qm.test">>),
-    Args = [{<<"x-queue-master-locator">>, <<"min-masters">>}],
-    declare(Config, QueueName, false, false, Args, none),
-    verify_min_master(Config, Q),
-    ok.
-
-calculate_random(Config) ->
-    setup_test_environment(Config),
-    QueueName = rabbit_misc:r(<<"/">>, queue, Q= <<"qm.test">>),
-    Args = [{<<"x-queue-master-locator">>, <<"random">>}],
-    declare(Config, QueueName, false, false, Args, none),
-    verify_random(Config, Q),
-    ok.
-
-calculate_client_local(Config) ->
-    setup_test_environment(Config),
-    QueueName = rabbit_misc:r(<<"/">>, queue, Q= <<"qm.test">>),
-    Args = [{<<"x-queue-master-locator">>, <<"client-local">>}],
-    declare(Config, QueueName, false, false, Args, none),
-    verify_client_local(Config, Q),
-    ok.
-
-%%
-%% Setup environment
-%%
-
-setup_test_environment(Config)  ->
-    Nodes = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    [distribute_queues(Config, Node) || Node <- Nodes],
-    ok.
-
-distribute_queues(Config, Node) ->
-    ok  = rpc:call(Node, application, unset_env, [rabbit, queue_master_location]),
-    Count = case rabbit_ct_broker_helpers:nodename_to_index(Config, Node) of
-        0 -> 15;
-        1 -> 8;
-        2 -> 1
-    end,
-
-    Channel = rabbit_ct_client_helpers:open_channel(Config, Node),
-    ok = declare_queues(Channel, declare_fun(), Count),
-    ok = create_e2e_binding(Channel, [<< "ex_1" >>, << "ex_2" >>]),
-    {ok, Channel}.
-
-%%
-%% Internal queue handling
-%%
-
-declare_queues(Channel, DeclareFun, 1) -> DeclareFun(Channel);
-declare_queues(Channel, DeclareFun, N) ->
-    DeclareFun(Channel),
-    declare_queues(Channel, DeclareFun, N-1).
-
-declare_exchange(Channel, Ex) ->
-    #'exchange.declare_ok'{} =
-        amqp_channel:call(Channel, #'exchange.declare'{exchange = Ex}),
-    {ok, Ex}.
-
-declare_binding(Channel, Binding) ->
-    #'exchange.bind_ok'{} = amqp_channel:call(Channel, Binding),
-    ok.
-
-declare_fun() ->
-    fun(Channel) ->
-            #'queue.declare_ok'{} = amqp_channel:call(Channel, get_random_queue_declare()),
-            ok
-    end.
-
-create_e2e_binding(Channel, ExNamesBin) ->
-    [{ok, Ex1}, {ok, Ex2}] = [declare_exchange(Channel, Ex) || Ex <- ExNamesBin],
-    Binding = #'exchange.bind'{source = Ex1, destination = Ex2},
-    ok = declare_binding(Channel, Binding).
-
-get_random_queue_declare() ->
-    #'queue.declare'{passive     = false,
-                     durable     = false,
-                     exclusive   = true,
-                     auto_delete = false,
-                     nowait      = false,
-                     arguments   = []}.
-
-%%
-%% Internal helper functions
-%%
-
-get_cluster() -> [node()|nodes()].
-
-min_master_node(Config) ->
-    hd(lists:reverse(
-        rabbit_ct_broker_helpers:get_node_configs(Config, nodename))).
-
-set_location_config(Config, Strategy) ->
-    Nodes = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    [ok = rpc:call(Node, application, set_env,
-                   [rabbit, queue_master_locator, Strategy]) || Node <- Nodes],
-    ok.
-
-unset_location_config(Config) ->
-    Nodes = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    [ok = rpc:call(Node, application, unset_env,
-                   [rabbit, queue_master_locator]) || Node <- Nodes],
-    ok.
-
-declare(Config, QueueName, Durable, AutoDelete, Args, Owner) ->
-    Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {new, Queue} = rpc:call(Node, rabbit_amqqueue, declare,
-                            [QueueName, Durable, AutoDelete, Args, Owner]),
-    Queue.
-
-verify_min_master(Config, Q) ->
-    Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    MinMaster = min_master_node(Config),
-    {ok, MinMaster} = rpc:call(Node, rabbit_queue_master_location_misc,
-                               lookup_master, [Q, ?DEFAULT_VHOST_PATH]).
-
-verify_random(Config, Q) ->
-    [Node | _] = Nodes = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    {ok, Master} = rpc:call(Node, rabbit_queue_master_location_misc,
-                            lookup_master, [Q, ?DEFAULT_VHOST_PATH]),
-    true = lists:member(Master, Nodes).
-
-verify_client_local(Config, Q) ->
-    Node = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    {ok, Node} = rpc:call(Node, rabbit_queue_master_location_misc,
-                          lookup_master, [Q, ?DEFAULT_VHOST_PATH]).
-
-set_location_policy(Config, Name, Strategy) ->
-    ok = rabbit_ct_broker_helpers:set_policy(Config, 0,
-      Name, <<".*">>, <<"queues">>, [{<<"queue-master-locator">>, Strategy}]).
diff --git a/rabbitmq-server/test/rabbit_ha_test_consumer.erl b/rabbitmq-server/test/rabbit_ha_test_consumer.erl
deleted file mode 100644 (file)
index f374863..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
--module(rabbit_ha_test_consumer).
-
--include_lib("amqp_client/include/amqp_client.hrl").
-
--export([await_response/1, create/5, start/6]).
-
-await_response(ConsumerPid) ->
-    case receive {ConsumerPid, Response} -> Response end of
-        {error, Reason}  -> erlang:error(Reason);
-        ok               -> ok
-    end.
-
-create(Channel, Queue, TestPid, CancelOnFailover, ExpectingMsgs) ->
-    ConsumerPid = spawn_link(?MODULE, start,
-                             [TestPid, Channel, Queue, CancelOnFailover,
-                              ExpectingMsgs + 1, ExpectingMsgs]),
-    amqp_channel:subscribe(
-      Channel, consume_method(Queue, CancelOnFailover), ConsumerPid),
-    ConsumerPid.
-
-start(TestPid, Channel, Queue, CancelOnFailover, LowestSeen, MsgsToConsume) ->
-    error_logger:info_msg("consumer ~p on ~p awaiting ~w messages "
-                          "(lowest seen = ~w, cancel-on-failover = ~w)~n",
-                          [self(), Channel, MsgsToConsume, LowestSeen,
-                           CancelOnFailover]),
-    run(TestPid, Channel, Queue, CancelOnFailover, LowestSeen, MsgsToConsume).
-
-run(TestPid, _Channel, _Queue, _CancelOnFailover, _LowestSeen, 0) ->
-    consumer_reply(TestPid, ok);
-run(TestPid, Channel, Queue, CancelOnFailover, LowestSeen, MsgsToConsume) ->
-    receive
-        #'basic.consume_ok'{} ->
-            run(TestPid, Channel, Queue,
-                CancelOnFailover, LowestSeen, MsgsToConsume);
-        {Delivery = #'basic.deliver'{ redelivered = Redelivered },
-         #amqp_msg{payload = Payload}} ->
-            MsgNum = list_to_integer(binary_to_list(Payload)),
-
-            ack(Delivery, Channel),
-
-            %% we can receive any message we've already seen and,
-            %% because of the possibility of multiple requeuings, we
-            %% might see these messages in any order. If we are seeing
-            %% a message again, we don't decrement the MsgsToConsume
-            %% counter.
-            if
-                MsgNum + 1 == LowestSeen ->
-                    run(TestPid, Channel, Queue,
-                        CancelOnFailover, MsgNum, MsgsToConsume - 1);
-                MsgNum >= LowestSeen ->
-                    error_logger:info_msg(
-                      "consumer ~p on ~p ignoring redeliverd msg ~p~n",
-                      [self(), Channel, MsgNum]),
-                    true = Redelivered, %% ASSERTION
-                    run(TestPid, Channel, Queue,
-                        CancelOnFailover, LowestSeen, MsgsToConsume);
-                true ->
-                    %% We received a message we haven't seen before,
-                    %% but it is not the next message in the expected
-                    %% sequence.
-                    consumer_reply(TestPid,
-                                   {error, {unexpected_message, MsgNum}})
-            end;
-        #'basic.cancel'{} when CancelOnFailover ->
-            error_logger:info_msg("consumer ~p on ~p received basic.cancel: "
-                                  "resubscribing to ~p on ~p~n",
-                                  [self(), Channel, Queue, Channel]),
-            resubscribe(TestPid, Channel, Queue, CancelOnFailover,
-                        LowestSeen, MsgsToConsume);
-        #'basic.cancel'{} ->
-            exit(cancel_received_without_cancel_on_failover)
-    end.
-
-%%
-%% Private API
-%%
-
-resubscribe(TestPid, Channel, Queue, CancelOnFailover, LowestSeen,
-            MsgsToConsume) ->
-    amqp_channel:subscribe(
-      Channel, consume_method(Queue, CancelOnFailover), self()),
-    ok = receive #'basic.consume_ok'{} -> ok
-         end,
-    error_logger:info_msg("re-subscripting consumer ~p on ~p complete "
-                          "(received basic.consume_ok)",
-                          [self(), Channel]),
-    start(TestPid, Channel, Queue, CancelOnFailover, LowestSeen, MsgsToConsume).
-
-consume_method(Queue, CancelOnFailover) ->
-    Args = [{<<"x-cancel-on-ha-failover">>, bool, CancelOnFailover}],
-    #'basic.consume'{queue     = Queue,
-                     arguments = Args}.
-
-ack(#'basic.deliver'{delivery_tag = DeliveryTag}, Channel) ->
-    amqp_channel:call(Channel, #'basic.ack'{delivery_tag = DeliveryTag}),
-    ok.
-
-consumer_reply(TestPid, Reply) ->
-    TestPid ! {self(), Reply}.
diff --git a/rabbitmq-server/test/rabbit_ha_test_producer.erl b/rabbitmq-server/test/rabbit_ha_test_producer.erl
deleted file mode 100644 (file)
index 66dee3f..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
--module(rabbit_ha_test_producer).
-
--export([await_response/1, start/5, create/5]).
-
--include_lib("amqp_client/include/amqp_client.hrl").
-
-await_response(ProducerPid) ->
-    error_logger:info_msg("waiting for producer pid ~p~n", [ProducerPid]),
-    case receive {ProducerPid, Response} -> Response end of
-        ok                -> ok;
-        {error, _} = Else -> exit(Else);
-        Else              -> exit({weird_response, Else})
-    end.
-
-create(Channel, Queue, TestPid, Confirm, MsgsToSend) ->
-    ProducerPid = spawn_link(?MODULE, start, [Channel, Queue, TestPid,
-                                              Confirm, MsgsToSend]),
-    receive
-        {ProducerPid, started} -> ProducerPid
-    end.
-
-start(Channel, Queue, TestPid, Confirm, MsgsToSend) ->
-    ConfirmState =
-        case Confirm of
-            true  -> amqp_channel:register_confirm_handler(Channel, self()),
-                     #'confirm.select_ok'{} =
-                         amqp_channel:call(Channel, #'confirm.select'{}),
-                     gb_trees:empty();
-            false -> none
-        end,
-    TestPid ! {self(), started},
-    error_logger:info_msg("publishing ~w msgs on ~p~n", [MsgsToSend, Channel]),
-    producer(Channel, Queue, TestPid, ConfirmState, MsgsToSend).
-
-%%
-%% Private API
-%%
-
-producer(_Channel, _Queue, TestPid, none, 0) ->
-    TestPid ! {self(), ok};
-producer(Channel, _Queue, TestPid, ConfirmState, 0) ->
-    error_logger:info_msg("awaiting confirms on channel ~p~n", [Channel]),
-    Msg = case drain_confirms(no_nacks, ConfirmState) of
-              no_nacks    -> ok;
-              nacks       -> {error, received_nacks};
-              {Nacks, CS} -> {error, {missing_confirms, Nacks,
-                                      lists:sort(gb_trees:keys(CS))}}
-          end,
-    TestPid ! {self(), Msg};
-
-producer(Channel, Queue, TestPid, ConfirmState, MsgsToSend) ->
-    Method = #'basic.publish'{exchange    = <<"">>,
-                              routing_key = Queue,
-                              mandatory   = false,
-                              immediate   = false},
-
-    ConfirmState1 = maybe_record_confirm(ConfirmState, Channel, MsgsToSend),
-
-    amqp_channel:call(Channel, Method,
-                      #amqp_msg{props = #'P_basic'{delivery_mode = 2},
-                                payload = list_to_binary(
-                                            integer_to_list(MsgsToSend))}),
-
-    producer(Channel, Queue, TestPid, ConfirmState1, MsgsToSend - 1).
-
-maybe_record_confirm(none, _, _) ->
-    none;
-maybe_record_confirm(ConfirmState, Channel, MsgsToSend) ->
-    SeqNo = amqp_channel:next_publish_seqno(Channel),
-    gb_trees:insert(SeqNo, MsgsToSend, ConfirmState).
-
-drain_confirms(Nacks, ConfirmState) ->
-    case gb_trees:is_empty(ConfirmState) of
-        true  -> Nacks;
-        false -> receive
-                     #'basic.ack'{delivery_tag = DeliveryTag,
-                                  multiple     = IsMulti} ->
-                         drain_confirms(Nacks,
-                                        delete_confirms(DeliveryTag, IsMulti,
-                                                        ConfirmState));
-                     #'basic.nack'{delivery_tag = DeliveryTag,
-                                   multiple     = IsMulti} ->
-                         drain_confirms(nacks,
-                                        delete_confirms(DeliveryTag, IsMulti,
-                                                        ConfirmState))
-                 after
-                     60000 -> {Nacks, ConfirmState}
-                 end
-    end.
-
-delete_confirms(DeliveryTag, false, ConfirmState) ->
-    gb_trees:delete(DeliveryTag, ConfirmState);
-delete_confirms(DeliveryTag, true, ConfirmState) ->
-    multi_confirm(DeliveryTag, ConfirmState).
-
-multi_confirm(DeliveryTag, ConfirmState) ->
-    case gb_trees:is_empty(ConfirmState) of
-        true  -> ConfirmState;
-        false -> {Key, _, ConfirmState1} = gb_trees:take_smallest(ConfirmState),
-                 case Key =< DeliveryTag of
-                     true  -> multi_confirm(DeliveryTag, ConfirmState1);
-                     false -> ConfirmState
-                 end
-    end.
diff --git a/rabbitmq-server/test/simple_ha_SUITE.erl b/rabbitmq-server/test/simple_ha_SUITE.erl
deleted file mode 100644 (file)
index af85ad6..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(simple_ha_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, cluster_size_2},
-      {group, cluster_size_3}
-    ].
-
-groups() ->
-    [
-      {cluster_size_2, [], [
-          rapid_redeclare,
-          declare_synchrony
-        ]},
-      {cluster_size_3, [], [
-          consume_survives_stop,
-          consume_survives_sigkill,
-          consume_survives_policy,
-          auto_resume,
-          auto_resume_no_ccn_client,
-          confirms_survive_stop,
-          confirms_survive_sigkill,
-          confirms_survive_policy
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 2}
-      ]);
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, 3}
-      ]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_clustered, true},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++ [
-        fun rabbit_ct_broker_helpers:set_ha_policy_all/1
-      ]).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-rapid_redeclare(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    Ch = rabbit_ct_client_helpers:open_channel(Config, A),
-    Queue = <<"test">>,
-    [begin
-         amqp_channel:call(Ch, #'queue.declare'{queue   = Queue,
-                                                durable = true}),
-         amqp_channel:call(Ch, #'queue.delete'{queue  = Queue})
-     end || _I <- lists:seq(1, 20)],
-    ok.
-
-%% Check that by the time we get a declare-ok back, the slaves are up
-%% and in Mnesia.
-declare_synchrony(Config) ->
-    [Rabbit, Hare] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    RabbitCh = rabbit_ct_client_helpers:open_channel(Config, Rabbit),
-    HareCh = rabbit_ct_client_helpers:open_channel(Config, Hare),
-    Q = <<"mirrored-queue">>,
-    declare(RabbitCh, Q),
-    amqp_channel:call(RabbitCh, #'confirm.select'{}),
-    amqp_channel:cast(RabbitCh, #'basic.publish'{routing_key = Q},
-                      #amqp_msg{props = #'P_basic'{delivery_mode = 2}}),
-    amqp_channel:wait_for_confirms(RabbitCh),
-    rabbit_ct_broker_helpers:kill_node(Config, Rabbit),
-
-    #'queue.declare_ok'{message_count = 1} = declare(HareCh, Q),
-    ok.
-
-declare(Ch, Name) ->
-    amqp_channel:call(Ch, #'queue.declare'{durable = true, queue = Name}).
-
-consume_survives_stop(Cf)     -> consume_survives(Cf, fun stop/2,    true).
-consume_survives_sigkill(Cf)  -> consume_survives(Cf, fun sigkill/2, true).
-consume_survives_policy(Cf)   -> consume_survives(Cf, fun policy/2,  true).
-auto_resume(Cf)               -> consume_survives(Cf, fun sigkill/2, false).
-auto_resume_no_ccn_client(Cf) -> consume_survives(Cf, fun sigkill/2, false,
-                                                  false).
-
-confirms_survive_stop(Cf)    -> confirms_survive(Cf, fun stop/2).
-confirms_survive_sigkill(Cf) -> confirms_survive(Cf, fun sigkill/2).
-confirms_survive_policy(Cf)  -> confirms_survive(Cf, fun policy/2).
-
-%%----------------------------------------------------------------------------
-
-consume_survives(Config, DeathFun, CancelOnFailover) ->
-    consume_survives(Config, DeathFun, CancelOnFailover, true).
-
-consume_survives(Config,
-                 DeathFun, CancelOnFailover, CCNSupported) ->
-    [A, B, C] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    Msgs = rabbit_ct_helpers:cover_work_factor(Config, 20000),
-    Channel1 = rabbit_ct_client_helpers:open_channel(Config, A),
-    Channel2 = rabbit_ct_client_helpers:open_channel(Config, B),
-    Channel3 = rabbit_ct_client_helpers:open_channel(Config, C),
-
-    %% declare the queue on the master, mirrored to the two slaves
-    Queue = <<"test">>,
-    amqp_channel:call(Channel1, #'queue.declare'{queue       = Queue,
-                                                 auto_delete = false}),
-
-    %% start up a consumer
-    ConsCh = case CCNSupported of
-                 true  -> Channel2;
-                 false -> Port = rabbit_ct_broker_helpers:get_node_config(
-                            Config, B, tcp_port_amqp),
-                          open_incapable_channel(Port)
-             end,
-    ConsumerPid = rabbit_ha_test_consumer:create(
-                    ConsCh, Queue, self(), CancelOnFailover, Msgs),
-
-    %% send a bunch of messages from the producer
-    ProducerPid = rabbit_ha_test_producer:create(Channel3, Queue,
-                                                 self(), false, Msgs),
-    DeathFun(Config, A),
-    %% verify that the consumer got all msgs, or die - the await_response
-    %% calls throw an exception if anything goes wrong....
-    rabbit_ha_test_consumer:await_response(ConsumerPid),
-    rabbit_ha_test_producer:await_response(ProducerPid),
-    ok.
-
-confirms_survive(Config, DeathFun) ->
-    [A, B, _] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    Msgs = rabbit_ct_helpers:cover_work_factor(Config, 20000),
-    Node1Channel = rabbit_ct_client_helpers:open_channel(Config, A),
-    Node2Channel = rabbit_ct_client_helpers:open_channel(Config, B),
-
-    %% declare the queue on the master, mirrored to the two slaves
-    Queue = <<"test">>,
-    amqp_channel:call(Node1Channel,#'queue.declare'{queue       = Queue,
-                                                    auto_delete = false,
-                                                    durable     = true}),
-
-    %% send a bunch of messages from the producer
-    ProducerPid = rabbit_ha_test_producer:create(Node2Channel, Queue,
-                                                 self(), true, Msgs),
-    DeathFun(Config, A),
-    rabbit_ha_test_producer:await_response(ProducerPid),
-    ok.
-
-stop(Config, Node) ->
-    rabbit_ct_broker_helpers:stop_node_after(Config, Node, 50).
-
-sigkill(Config, Node) ->
-    rabbit_ct_broker_helpers:kill_node_after(Config, Node, 50).
-
-policy(Config, Node)->
-    Nodes = [
-      rabbit_misc:atom_to_binary(N)
-      || N <- rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-         N =/= Node],
-    rabbit_ct_broker_helpers:set_ha_policy(Config, Node, <<".*">>,
-      {<<"nodes">>, Nodes}).
-
-open_incapable_channel(NodePort) ->
-    Props = [{<<"capabilities">>, table, []}],
-    {ok, ConsConn} =
-        amqp_connection:start(#amqp_params_network{port              = NodePort,
-                                                   client_properties = Props}),
-    {ok, Ch} = amqp_connection:open_channel(ConsConn),
-    Ch.
diff --git a/rabbitmq-server/test/sup_delayed_restart_SUITE.erl b/rabbitmq-server/test/sup_delayed_restart_SUITE.erl
deleted file mode 100644 (file)
index e495f57..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2015 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(sup_delayed_restart_SUITE).
-
--behaviour(supervisor2).
-
--include_lib("common_test/include/ct.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      delayed_restart
-    ].
-
-%%----------------------------------------------------------------------------
-%% Public API
-%%----------------------------------------------------------------------------
-
-delayed_restart(_Config) ->
-    passed = with_sup(simple_one_for_one,
-                      fun (SupPid) ->
-                              {ok, _ChildPid} =
-                                  supervisor2:start_child(SupPid, []),
-                              test_supervisor_delayed_restart(SupPid)
-                      end),
-    passed = with_sup(one_for_one, fun test_supervisor_delayed_restart/1).
-
-test_supervisor_delayed_restart(SupPid) ->
-    ok = ping_child(SupPid),
-    ok = exit_child(SupPid),
-    timer:sleep(100),
-    ok = ping_child(SupPid),
-    ok = exit_child(SupPid),
-    timer:sleep(100),
-    timeout = ping_child(SupPid),
-    timer:sleep(1010),
-    ok = ping_child(SupPid),
-    passed.
-
-with_sup(RestartStrategy, Fun) ->
-    {ok, SupPid} = supervisor2:start_link(?MODULE, [RestartStrategy]),
-    Res = Fun(SupPid),
-    unlink(SupPid),
-    exit(SupPid, shutdown),
-    Res.
-
-init([RestartStrategy]) ->
-    {ok, {{RestartStrategy, 1, 1},
-          [{test, {?MODULE, start_child, []}, {permanent, 1},
-            16#ffffffff, worker, [?MODULE]}]}}.
-
-start_child() ->
-    {ok, proc_lib:spawn_link(fun run_child/0)}.
-
-ping_child(SupPid) ->
-    Ref = make_ref(),
-    with_child_pid(SupPid, fun(ChildPid) -> ChildPid ! {ping, Ref, self()} end),
-    receive {pong, Ref} -> ok
-    after 1000          -> timeout
-    end.
-
-exit_child(SupPid) ->
-    with_child_pid(SupPid, fun(ChildPid) -> exit(ChildPid, abnormal) end),
-    ok.
-
-with_child_pid(SupPid, Fun) ->
-    case supervisor2:which_children(SupPid) of
-        [{_Id, undefined, worker, [?MODULE]}] -> ok;
-        [{_Id,  ChildPid, worker, [?MODULE]}] -> Fun(ChildPid);
-        []                                     -> ok
-    end.
-
-run_child() ->
-    receive {ping, Ref, Pid} -> Pid ! {pong, Ref},
-                                run_child()
-    end.
diff --git a/rabbitmq-server/test/sync_detection_SUITE.erl b/rabbitmq-server/test/sync_detection_SUITE.erl
deleted file mode 100644 (file)
index 1e0a66e..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and
-%% limitations under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(sync_detection_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(LOOP_RECURSION_DELAY, 100).
-
-all() ->
-    [
-      {group, cluster_size_2},
-      {group, cluster_size_3}
-    ].
-
-groups() ->
-    [
-      {cluster_size_2, [], [
-          slave_synchronization
-        ]},
-      {cluster_size_3, [], [
-          slave_synchronization_ttl
-        ]}
-    ].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(cluster_size_2, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 2}]);
-init_per_group(cluster_size_3, Config) ->
-    rabbit_ct_helpers:set_config(Config, [{rmq_nodes_count, 3}]).
-
-end_per_group(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase),
-    ClusterSize = ?config(rmq_nodes_count, Config),
-    TestNumber = rabbit_ct_helpers:testcase_number(Config, ?MODULE, Testcase),
-    Config1 = rabbit_ct_helpers:set_config(Config, [
-        {rmq_nodes_count, ClusterSize},
-        {rmq_nodes_clustered, true},
-        {rmq_nodename_suffix, Testcase},
-        {tcp_ports_base, {skip_n_nodes, TestNumber * ClusterSize}}
-      ]),
-    rabbit_ct_helpers:run_steps(Config1,
-      rabbit_ct_broker_helpers:setup_steps() ++
-      rabbit_ct_client_helpers:setup_steps() ++ [
-        fun rabbit_ct_broker_helpers:set_ha_policy_two_pos/1,
-        fun rabbit_ct_broker_helpers:set_ha_policy_two_pos_batch_sync/1
-      ]).
-
-end_per_testcase(Testcase, Config) ->
-    Config1 = rabbit_ct_helpers:run_steps(Config,
-      rabbit_ct_client_helpers:teardown_steps() ++
-      rabbit_ct_broker_helpers:teardown_steps()),
-    rabbit_ct_helpers:testcase_finished(Config1, Testcase).
-
-%% -------------------------------------------------------------------
-%% Testcases.
-%% -------------------------------------------------------------------
-
-slave_synchronization(Config) ->
-    [Master, Slave] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    Channel = rabbit_ct_client_helpers:open_channel(Config, Master),
-    Queue = <<"ha.two.test">>,
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = Queue,
-                                                    auto_delete = false}),
-
-    %% The comments on the right are the queue length and the pending acks on
-    %% the master.
-    rabbit_ct_broker_helpers:stop_broker(Config, Slave),
-
-    %% We get and ack one message when the slave is down, and check that when we
-    %% start the slave it's not marked as synced until ack the message.  We also
-    %% publish another message when the slave is up.
-    send_dummy_message(Channel, Queue),                                 % 1 - 0
-    {#'basic.get_ok'{delivery_tag = Tag1}, _} =
-        amqp_channel:call(Channel, #'basic.get'{queue = Queue}),        % 0 - 1
-
-    rabbit_ct_broker_helpers:start_broker(Config, Slave),
-
-    slave_unsynced(Master, Queue),
-    send_dummy_message(Channel, Queue),                                 % 1 - 1
-    slave_unsynced(Master, Queue),
-
-    amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag1}),      % 1 - 0
-
-    slave_synced(Master, Queue),
-
-    %% We restart the slave and we send a message, so that the slave will only
-    %% have one of the messages.
-    rabbit_ct_broker_helpers:stop_broker(Config, Slave),
-    rabbit_ct_broker_helpers:start_broker(Config, Slave),
-
-    send_dummy_message(Channel, Queue),                                 % 2 - 0
-
-    slave_unsynced(Master, Queue),
-
-    %% We reject the message that the slave doesn't have, and verify that it's
-    %% still unsynced
-    {#'basic.get_ok'{delivery_tag = Tag2}, _} =
-        amqp_channel:call(Channel, #'basic.get'{queue = Queue}),        % 1 - 1
-    slave_unsynced(Master, Queue),
-    amqp_channel:cast(Channel, #'basic.reject'{ delivery_tag = Tag2,
-                                                requeue      = true }), % 2 - 0
-    slave_unsynced(Master, Queue),
-    {#'basic.get_ok'{delivery_tag = Tag3}, _} =
-        amqp_channel:call(Channel, #'basic.get'{queue = Queue}),        % 1 - 1
-    amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag3}),      % 1 - 0
-    slave_synced(Master, Queue),
-    {#'basic.get_ok'{delivery_tag = Tag4}, _} =
-        amqp_channel:call(Channel, #'basic.get'{queue = Queue}),        % 0 - 1
-    amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = Tag4}),      % 0 - 0
-    slave_synced(Master, Queue).
-
-slave_synchronization_ttl(Config) ->
-    [Master, Slave, DLX] = rabbit_ct_broker_helpers:get_node_configs(Config,
-      nodename),
-    Channel = rabbit_ct_client_helpers:open_channel(Config, Master),
-    DLXChannel = rabbit_ct_client_helpers:open_channel(Config, DLX),
-
-    %% We declare a DLX queue to wait for messages to be TTL'ed
-    DLXQueue = <<"dlx-queue">>,
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = DLXQueue,
-                                                    auto_delete = false}),
-
-    TestMsgTTL = 5000,
-    Queue = <<"ha.two.test">>,
-    %% Sadly we need fairly high numbers for the TTL because starting/stopping
-    %% nodes takes a fair amount of time.
-    Args = [{<<"x-message-ttl">>, long, TestMsgTTL},
-            {<<"x-dead-letter-exchange">>, longstr, <<>>},
-            {<<"x-dead-letter-routing-key">>, longstr, DLXQueue}],
-    #'queue.declare_ok'{} =
-        amqp_channel:call(Channel, #'queue.declare'{queue       = Queue,
-                                                    auto_delete = false,
-                                                    arguments   = Args}),
-
-    slave_synced(Master, Queue),
-
-    %% All unknown
-    rabbit_ct_broker_helpers:stop_broker(Config, Slave),
-    send_dummy_message(Channel, Queue),
-    send_dummy_message(Channel, Queue),
-    rabbit_ct_broker_helpers:start_broker(Config, Slave),
-    slave_unsynced(Master, Queue),
-    wait_for_messages(DLXQueue, DLXChannel, 2),
-    slave_synced(Master, Queue),
-
-    %% 1 unknown, 1 known
-    rabbit_ct_broker_helpers:stop_broker(Config, Slave),
-    send_dummy_message(Channel, Queue),
-    rabbit_ct_broker_helpers:start_broker(Config, Slave),
-    slave_unsynced(Master, Queue),
-    send_dummy_message(Channel, Queue),
-    slave_unsynced(Master, Queue),
-    wait_for_messages(DLXQueue, DLXChannel, 2),
-    slave_synced(Master, Queue),
-
-    %% %% both known
-    send_dummy_message(Channel, Queue),
-    send_dummy_message(Channel, Queue),
-    slave_synced(Master, Queue),
-    wait_for_messages(DLXQueue, DLXChannel, 2),
-    slave_synced(Master, Queue),
-
-    ok.
-
-send_dummy_message(Channel, Queue) ->
-    Payload = <<"foo">>,
-    Publish = #'basic.publish'{exchange = <<>>, routing_key = Queue},
-    amqp_channel:cast(Channel, Publish, #amqp_msg{payload = Payload}).
-
-slave_pids(Node, Queue) ->
-    {ok, Q} = rpc:call(Node, rabbit_amqqueue, lookup,
-                       [rabbit_misc:r(<<"/">>, queue, Queue)]),
-    SSP = synchronised_slave_pids,
-    [{SSP, Pids}] = rpc:call(Node, rabbit_amqqueue, info, [Q, [SSP]]),
-    case Pids of
-        '' -> [];
-        _  -> Pids
-    end.
-
-%% The mnesia syncronization takes a while, but we don't want to wait for the
-%% test to fail, since the timetrap is quite high.
-wait_for_sync_status(Status, Node, Queue) ->
-    Max = 10000 / ?LOOP_RECURSION_DELAY,
-    wait_for_sync_status(0, Max, Status, Node, Queue).
-
-wait_for_sync_status(N, Max, Status, Node, Queue) when N >= Max ->
-    erlang:error({sync_status_max_tries_failed,
-                  [{queue, Queue},
-                   {node, Node},
-                   {expected_status, Status},
-                   {max_tried, Max}]});
-wait_for_sync_status(N, Max, Status, Node, Queue) ->
-    Synced = length(slave_pids(Node, Queue)) =:= 1,
-    case Synced =:= Status of
-        true  -> ok;
-        false -> timer:sleep(?LOOP_RECURSION_DELAY),
-                 wait_for_sync_status(N + 1, Max, Status, Node, Queue)
-    end.
-
-slave_synced(Node, Queue) ->
-    wait_for_sync_status(true, Node, Queue).
-
-slave_unsynced(Node, Queue) ->
-    wait_for_sync_status(false, Node, Queue).
-
-wait_for_messages(Queue, Channel, N) ->
-    Sub = #'basic.consume'{queue = Queue},
-    #'basic.consume_ok'{consumer_tag = CTag} = amqp_channel:call(Channel, Sub),
-    receive
-        #'basic.consume_ok'{} -> ok
-    end,
-    lists:foreach(
-      fun (_) -> receive
-                     {#'basic.deliver'{delivery_tag = Tag}, _Content} ->
-                         amqp_channel:cast(Channel,
-                                           #'basic.ack'{delivery_tag = Tag})
-                 end
-      end, lists:seq(1, N)),
-    amqp_channel:call(Channel, #'basic.cancel'{consumer_tag = CTag}).
diff --git a/rabbitmq-server/test/temp/head_message_timestamp_tests.py b/rabbitmq-server/test/temp/head_message_timestamp_tests.py
deleted file mode 100755 (executable)
index 6698b88..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/python
-#
-# Tests for the SLA patch which adds the head_message_timestamp queue stat.
-# Uses both the management interface via rabbitmqadmin and the AMQP interface via Pika.
-# There's no particular reason to have used rabbitmqadmin other than saving some bulk.
-# Similarly, the separate declaration of exchanges and queues is just a preference
-# following a typical enterprise policy where admin users create these resources.
-
-from datetime import datetime
-import json
-import pika
-import os
-import sys
-from time import clock, mktime, sleep
-import unittest
-
-# Uses the rabbitmqadmin script.
-# To be imported this must be given a .py suffix and placed on the Python path
-from rabbitmqadmin import *
-
-TEXCH = 'head-message-timestamp-test'
-TQUEUE = 'head-message-timestamp-test-queue'
-
-TIMEOUT_SECS = 10
-
-TIMESTAMP1 = mktime(datetime(2010,1,1,12,00,01).timetuple())
-TIMESTAMP2 = mktime(datetime(2010,1,1,12,00,02).timetuple())
-
-AMQP_PORT = 99
-
-DELIVERY_MODE = 2
-DURABLE = False
-
-def log(msg):
-    print("\nINFO: " + msg)
-
-class RabbitTestCase(unittest.TestCase):
-    def setUp(self):
-        parser.set_conflict_handler('resolve')
-        (options, args) = make_configuration() 
-        AMQP_PORT =  int(options.port) - 10000
-
-        self.mgmt = Management(options, args)
-        self.mgmt.put('/exchanges/%2f/' + TEXCH, '{"type" : "fanout", "durable":' + str(DURABLE).lower() + '}')
-        self.mgmt.put('/queues/%2f/' + TQUEUE, '{"auto_delete":false,"durable":' + str(DURABLE).lower() + ',"arguments":[]}') 
-        self.mgmt.post('/bindings/%2f/e/' + TEXCH + '/q/' + TQUEUE, '{"routing_key": ".*", "arguments":[]}')
-        self.credentials = pika.PlainCredentials(options.username, options.password)
-        parameters =  pika.ConnectionParameters(options.hostname, port=AMQP_PORT, credentials=self.credentials)
-        self.connection = pika.BlockingConnection(parameters)
-        self.channel = self.connection.channel()
-
-    def tearDown(self):
-        parser.set_conflict_handler('resolve')
-        (options, args) = make_configuration()
-        self.mgmt = Management(options, args)
-        self.mgmt.delete('/queues/%2f/' + TQUEUE)
-        self.mgmt.delete('/exchanges/%2f/' + TEXCH)
-
-class RabbitSlaTestCase(RabbitTestCase):
-    def get_queue_stats(self, queue_name):
-        stats_str = self.mgmt.get('/queues/%2f/' + queue_name)
-        return json.loads(stats_str)
-
-    def get_head_message_timestamp(self, queue_name):
-        return self.get_queue_stats(queue_name)["head_message_timestamp"]
-
-    def send(self, message, timestamp=None):
-        self.channel.basic_publish(TEXCH, '', message,
-                                   pika.BasicProperties(content_type='text/plain',
-                                                        delivery_mode=DELIVERY_MODE,
-                                                        timestamp=timestamp))
-        log("Sent message with body: " + str(message))
-
-    def receive(self, queue):
-        method_frame, header_frame, body = self.channel.basic_get(queue = queue)
-        log("Received message with body: " + str(body))
-        return method_frame.delivery_tag, body
-
-    def ack(self, delivery_tag):
-        self.channel.basic_ack(delivery_tag)        
-
-    def nack(self, delivery_tag):
-        self.channel.basic_nack(delivery_tag)        
-
-    def wait_for_new_timestamp(self, queue, old_timestamp):
-        stats_wait_start = clock()
-        while ((clock() - stats_wait_start) < TIMEOUT_SECS and
-               self.get_head_message_timestamp(queue) == old_timestamp):
-            sleep(0.1)
-        log('Queue stats updated in ' + str(clock() - stats_wait_start) + ' secs.')
-        return self.get_head_message_timestamp(queue)
-
-    # TESTS
-
-    def test_no_timestamp_when_queue_is_empty(self):
-        assert self.get_head_message_timestamp(TQUEUE) == ''
-
-    def test_has_timestamp_when_first_msg_is_added(self):
-        self.send('Msg1', TIMESTAMP1)
-        stats_timestamp = self.wait_for_new_timestamp(TQUEUE, '')
-        assert stats_timestamp == TIMESTAMP1
-        
-    def test_no_timestamp_when_last_msg_is_removed(self):
-        self.send('Msg1', TIMESTAMP1)
-        stats_timestamp = self.wait_for_new_timestamp(TQUEUE, '')
-        tag, body = self.receive(TQUEUE)
-        self.ack(tag)
-        stats_timestamp = self.wait_for_new_timestamp(TQUEUE, TIMESTAMP1)
-        assert stats_timestamp == ''
-
-    def test_timestamp_updated_when_msg_is_removed(self):
-        self.send('Msg1', TIMESTAMP1)
-        stats_timestamp = self.wait_for_new_timestamp(TQUEUE, '')
-        self.send('Msg2', TIMESTAMP2)
-        tag, body = self.receive(TQUEUE)
-        self.ack(tag)
-        stats_timestamp = self.wait_for_new_timestamp(TQUEUE, TIMESTAMP1)
-        assert stats_timestamp == TIMESTAMP2
-
-    def test_timestamp_not_updated_before_msg_is_acked(self):
-        self.send('Msg1', TIMESTAMP1)
-        stats_timestamp = self.wait_for_new_timestamp(TQUEUE, '')
-        tag, body = self.receive(TQUEUE)
-        sleep(1) # Allow time for update to appear if it was going to (it shouldn't)
-        assert self.get_head_message_timestamp(TQUEUE) == TIMESTAMP1
-        self.ack(tag) 
-
-if __name__ == '__main__':
-    unittest.main(verbosity = 2)
-    
-
diff --git a/rabbitmq-server/test/temp/rabbitmqadmin.py b/rabbitmq-server/test/temp/rabbitmqadmin.py
deleted file mode 100755 (executable)
index 1e7552b..0000000
+++ /dev/null
@@ -1,944 +0,0 @@
-#!/usr/bin/env python
-
-#   The contents of this file are subject to the Mozilla Public License
-#   Version 1.1 (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.mozilla.org/MPL/
-#
-#   Software distributed under the License is distributed on an "AS IS"
-#   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-#   License for the specific language governing rights and limitations
-#   under the License.
-#
-#   The Original Code is RabbitMQ Management Plugin.
-#
-#   The Initial Developer of the Original Code is GoPivotal, Inc.
-#   Copyright (c) 2010-2015 Pivotal Software, Inc.  All rights reserved.
-
-import sys
-if sys.version_info[0] < 2 or sys.version_info[1] < 6:
-    print "Sorry, rabbitmqadmin requires at least Python 2.6."
-    sys.exit(1)
-
-from ConfigParser import ConfigParser, NoSectionError
-from optparse import OptionParser, TitledHelpFormatter
-import httplib
-import urllib
-import urlparse
-import base64
-import json
-import os
-import socket
-
-VERSION = '0.0.0'
-
-LISTABLE = {'connections': {'vhost': False},
-            'channels':    {'vhost': False},
-            'consumers':   {'vhost': True},
-            'exchanges':   {'vhost': True},
-            'queues':      {'vhost': True},
-            'bindings':    {'vhost': True},
-            'users':       {'vhost': False},
-            'vhosts':      {'vhost': False},
-            'permissions': {'vhost': False},
-            'nodes':       {'vhost': False},
-            'parameters':  {'vhost': False,
-                            'json':  ['value']},
-            'policies':    {'vhost': False,
-                            'json':  ['definition']}}
-
-SHOWABLE = {'overview': {'vhost': False}}
-
-PROMOTE_COLUMNS = ['vhost', 'name', 'type',
-                   'source', 'destination', 'destination_type', 'routing_key']
-
-URIS = {
-    'exchange':   '/exchanges/{vhost}/{name}',
-    'queue':      '/queues/{vhost}/{name}',
-    'binding':    '/bindings/{vhost}/e/{source}/{destination_char}/{destination}',
-    'binding_del':'/bindings/{vhost}/e/{source}/{destination_char}/{destination}/{properties_key}',
-    'vhost':      '/vhosts/{name}',
-    'user':       '/users/{name}',
-    'permission': '/permissions/{vhost}/{user}',
-    'parameter':  '/parameters/{component}/{vhost}/{name}',
-    'policy':     '/policies/{vhost}/{name}'
-    }
-
-DECLARABLE = {
-    'exchange':   {'mandatory': ['name', 'type'],
-                   'json':      ['arguments'],
-                   'optional':  {'auto_delete': 'false', 'durable': 'true',
-                                 'internal': 'false', 'arguments': {}}},
-    'queue':      {'mandatory': ['name'],
-                   'json':      ['arguments'],
-                   'optional':  {'auto_delete': 'false', 'durable': 'true',
-                                 'arguments': {}, 'node': None}},
-    'binding':    {'mandatory': ['source', 'destination'],
-                   'json':      ['arguments'],
-                   'optional':  {'destination_type': 'queue',
-                                 'routing_key': '', 'arguments': {}}},
-    'vhost':      {'mandatory': ['name'],
-                   'optional':  {'tracing': None}},
-    'user':       {'mandatory': ['name', 'password', 'tags'],
-                   'optional':  {}},
-    'permission': {'mandatory': ['vhost', 'user', 'configure', 'write', 'read'],
-                   'optional':  {}},
-    'parameter':  {'mandatory': ['component', 'name', 'value'],
-                   'json':      ['value'],
-                   'optional':  {}},
-    # Priority is 'json' to convert to int
-    'policy':     {'mandatory': ['name', 'pattern', 'definition'],
-                   'json':      ['definition', 'priority'],
-                   'optional':  {'priority' : 0, 'apply-to': None}}
-    }
-
-DELETABLE = {
-    'exchange':   {'mandatory': ['name']},
-    'queue':      {'mandatory': ['name']},
-    'binding':    {'mandatory': ['source', 'destination_type', 'destination',
-                                 'properties_key']},
-    'vhost':      {'mandatory': ['name']},
-    'user':       {'mandatory': ['name']},
-    'permission': {'mandatory': ['vhost', 'user']},
-    'parameter':  {'mandatory': ['component', 'name']},
-    'policy':     {'mandatory': ['name']}
-    }
-
-CLOSABLE = {
-    'connection': {'mandatory': ['name'],
-                   'optional':  {},
-                   'uri':       '/connections/{name}'}
-    }
-
-PURGABLE = {
-    'queue': {'mandatory': ['name'],
-              'optional':  {},
-              'uri':       '/queues/{vhost}/{name}/contents'}
-    }
-
-EXTRA_VERBS = {
-    'publish': {'mandatory': ['routing_key'],
-                'optional':  {'payload': None,
-                              'exchange': 'amq.default',
-                              'payload_encoding': 'string'},
-                'uri':       '/exchanges/{vhost}/{exchange}/publish'},
-    'get':     {'mandatory': ['queue'],
-                'optional':  {'count': '1', 'requeue': 'true',
-                              'payload_file': None, 'encoding': 'auto'},
-                'uri':       '/queues/{vhost}/{queue}/get'}
-}
-
-for k in DECLARABLE:
-    DECLARABLE[k]['uri'] = URIS[k]
-
-for k in DELETABLE:
-    DELETABLE[k]['uri'] = URIS[k]
-    DELETABLE[k]['optional'] = {}
-DELETABLE['binding']['uri'] = URIS['binding_del']
-
-def short_usage():
-    return "rabbitmqadmin [options] subcommand"
-
-def title(name):
-    return "\n%s\n%s\n\n" % (name, '=' * len(name))
-
-def subcommands_usage():
-    usage = """Usage
-=====
-  """ + short_usage() + """
-
-  where subcommand is one of:
-""" + title("Display")
-
-    for l in LISTABLE:
-        usage += "  list {0} [<column>...]\n".format(l)
-    for s in SHOWABLE:
-        usage += "  show {0} [<column>...]\n".format(s)
-    usage += title("Object Manipulation")
-    usage += fmt_usage_stanza(DECLARABLE,  'declare')
-    usage += fmt_usage_stanza(DELETABLE,   'delete')
-    usage += fmt_usage_stanza(CLOSABLE,    'close')
-    usage += fmt_usage_stanza(PURGABLE,    'purge')
-    usage += title("Broker Definitions")
-    usage += """  export <file>
-  import <file>
-"""
-    usage += title("Publishing and Consuming")
-    usage += fmt_usage_stanza(EXTRA_VERBS, '')
-    usage += """
-  * If payload is not specified on publish, standard input is used
-
-  * If payload_file is not specified on get, the payload will be shown on
-    standard output along with the message metadata
-
-  * If payload_file is specified on get, count must not be set
-"""
-    return usage
-
-def config_usage():
-    usage = "Usage\n=====\n" + short_usage()
-    usage += "\n" + title("Configuration File")
-    usage += """  It is possible to specify a configuration file from the command line.
-  Hosts can be configured easily in a configuration file and called
-  from the command line.
-"""
-    usage += title("Example")
-    usage += """  # rabbitmqadmin.conf.example START
-
-  [host_normal]
-  hostname = localhost
-  port = 15672
-  username = guest
-  password = guest
-  declare_vhost = / # Used as default for declare / delete only
-  vhost = /         # Used as default for declare / delete / list
-
-  [host_ssl]
-  hostname = otherhost
-  port = 15672
-  username = guest
-  password = guest
-  ssl = True
-  ssl_key_file = /path/to/key.pem
-  ssl_cert_file = /path/to/cert.pem
-
-  # rabbitmqadmin.conf.example END
-"""
-    usage += title("Use")
-    usage += """  rabbitmqadmin -c rabbitmqadmin.conf.example -N host_normal ..."""
-    return usage
-
-def more_help():
-    return """
-More Help
-=========
-
-For more help use the help subcommand:
-
-  rabbitmqadmin help subcommands  # For a list of available subcommands
-  rabbitmqadmin help config       # For help with the configuration file
-"""
-
-def fmt_usage_stanza(root, verb):
-    def fmt_args(args):
-        res = " ".join(["{0}=...".format(a) for a in args['mandatory']])
-        opts = " ".join("{0}=...".format(o) for o in args['optional'].keys())
-        if opts != "":
-            res += " [{0}]".format(opts)
-        return res
-
-    text = ""
-    if verb != "":
-        verb = " " + verb
-    for k in root.keys():
-        text += " {0} {1} {2}\n".format(verb, k, fmt_args(root[k]))
-    return text
-
-default_options = { "hostname"        : "localhost",
-                    "port"            : "15672",
-                    "declare_vhost"   : "/",
-                    "username"        : "guest",
-                    "password"        : "guest",
-                    "ssl"             : False,
-                    "verbose"         : True,
-                    "format"          : "table",
-                    "depth"           : 1,
-                    "bash_completion" : False }
-
-
-class MyFormatter(TitledHelpFormatter):
-    def format_epilog(self, epilog):
-        return epilog
-
-parser = OptionParser(usage=short_usage(),
-                      formatter=MyFormatter(),
-                      epilog=more_help())
-
-def make_parser():
-    def add(*args, **kwargs):
-        key = kwargs['dest']
-        if key in default_options:
-            default = " [default: %s]" % default_options[key]
-            kwargs['help'] = kwargs['help'] + default
-        parser.add_option(*args, **kwargs)
-
-    add("-c", "--config", dest="config",
-        help="configuration file [default: ~/.rabbitmqadmin.conf]",
-        metavar="CONFIG")
-    add("-N", "--node", dest="node",
-        help="node described in the configuration file [default: 'default'" + \
-             " only if configuration file is specified]",
-        metavar="NODE")
-    add("-H", "--host", dest="hostname",
-        help="connect to host HOST" ,
-        metavar="HOST")
-    add("-P", "--port", dest="port",
-        help="connect to port PORT",
-        metavar="PORT")
-    add("-V", "--vhost", dest="vhost",
-        help="connect to vhost VHOST [default: all vhosts for list, '/' for declare]",
-        metavar="VHOST")
-    add("-u", "--username", dest="username",
-        help="connect using username USERNAME",
-        metavar="USERNAME")
-    add("-p", "--password", dest="password",
-        help="connect using password PASSWORD",
-        metavar="PASSWORD")
-    add("-q", "--quiet", action="store_false", dest="verbose",
-        help="suppress status messages")
-    add("-s", "--ssl", action="store_true", dest="ssl",
-        help="connect with ssl")
-    add("--ssl-key-file", dest="ssl_key_file",
-        help="PEM format key file for SSL")
-    add("--ssl-cert-file", dest="ssl_cert_file",
-        help="PEM format certificate file for SSL")
-    add("-f", "--format", dest="format",
-        help="format for listing commands - one of [" + ", ".join(FORMATS.keys())  + "]")
-    add("-S", "--sort", dest="sort", help="sort key for listing queries")
-    add("-R", "--sort-reverse", action="store_true", dest="sort_reverse",
-        help="reverse the sort order")
-    add("-d", "--depth", dest="depth",
-        help="maximum depth to recurse for listing tables")
-    add("--bash-completion", action="store_true",
-        dest="bash_completion",
-        help="Print bash completion script")
-    add("--version", action="store_true",
-        dest="version",
-        help="Display version and exit")
-
-def default_config():
-    home = os.getenv('USERPROFILE') or os.getenv('HOME')
-    if home is not None:
-        config_file = home + os.sep + ".rabbitmqadmin.conf"
-        if os.path.isfile(config_file):
-            return config_file
-    return None
-
-def make_configuration():
-    make_parser()
-    (options, args) = parser.parse_args()
-    setattr(options, "declare_vhost", None)
-    if options.version:
-        print_version()
-    if options.config is None:
-        config_file = default_config()
-        if config_file is not None:
-            setattr(options, "config", config_file)
-    else:
-        if not os.path.isfile(options.config):
-            assert_usage(False,
-                "Could not read config file '%s'" % options.config)
-
-    if options.node is None and options.config:
-        options.node = "default"
-    else:
-        options.node = options.node
-    for (key, val) in default_options.items():
-        if getattr(options, key) is None:
-            setattr(options, key, val)
-
-    if options.config is not None:
-        config = ConfigParser()
-        try:
-            config.read(options.config)
-            new_conf = dict(config.items(options.node))
-        except NoSectionError, error:
-            if options.node == "default":
-                pass
-            else:
-                assert_usage(False, ("Could not read section '%s' in config file"  +
-                             " '%s':\n   %s") %
-                             (options.node, options.config, error))
-        else:
-            for key, val in new_conf.items():
-                setattr(options, key, val)
-
-    return (options, args)
-
-def assert_usage(expr, error):
-    if not expr:
-        output("\nERROR: {0}\n".format(error))
-        output("{0} --help for help\n".format(os.path.basename(sys.argv[0])))
-        sys.exit(1)
-
-def print_version():
-    output("rabbitmqadmin {0}".format(VERSION))
-    sys.exit(0)
-
-def column_sort_key(col):
-    if col in PROMOTE_COLUMNS:
-        return (1, PROMOTE_COLUMNS.index(col))
-    else:
-        return (2, col)
-
-def main():
-    (options, args) = make_configuration()
-    if options.bash_completion:
-        print_bash_completion()
-        exit(0)
-    assert_usage(len(args) > 0, 'Action not specified')
-    mgmt = Management(options, args[1:])
-    mode = "invoke_" + args[0]
-    assert_usage(hasattr(mgmt, mode),
-                 'Action {0} not understood'.format(args[0]))
-    method = getattr(mgmt, "invoke_%s" % args[0])
-    method()
-
-def output(s):
-    print maybe_utf8(s, sys.stdout)
-
-def die(s):
-    sys.stderr.write(maybe_utf8("*** {0}\n".format(s), sys.stderr))
-    exit(1)
-
-def maybe_utf8(s, stream):
-    if stream.isatty():
-        # It will have an encoding, which Python will respect
-        return s
-    else:
-        # It won't have an encoding, and Python will pick ASCII by default
-        return s.encode('utf-8')
-
-class Management:
-    def __init__(self, options, args):
-        self.options = options
-        self.args = args
-
-    def get(self, path):
-        return self.http("GET", "/api%s" % path, "")
-
-    def put(self, path, body):
-        return self.http("PUT", "/api%s" % path, body)
-
-    def post(self, path, body):
-        return self.http("POST", "/api%s" % path, body)
-
-    def delete(self, path):
-        return self.http("DELETE", "/api%s" % path, "")
-
-    def http(self, method, path, body):
-        if self.options.ssl:
-            conn = httplib.HTTPSConnection(self.options.hostname,
-                                           self.options.port,
-                                           self.options.ssl_key_file,
-                                           self.options.ssl_cert_file)
-        else:
-            conn = httplib.HTTPConnection(self.options.hostname,
-                                          self.options.port)
-        headers = {"Authorization":
-                       "Basic " + base64.b64encode(self.options.username + ":" +
-                                                   self.options.password)}
-        if body != "":
-            headers["Content-Type"] = "application/json"
-        try:
-            conn.request(method, path, body, headers)
-        except socket.error, e:
-            die("Could not connect: {0}".format(e))
-        resp = conn.getresponse()
-        if resp.status == 400:
-            die(json.loads(resp.read())['reason'])
-        if resp.status == 401:
-            die("Access refused: {0}".format(path))
-        if resp.status == 404:
-            die("Not found: {0}".format(path))
-        if resp.status == 301:
-            url = urlparse.urlparse(resp.getheader('location'))
-            [host, port] = url.netloc.split(':')
-            self.options.hostname = host
-            self.options.port = int(port)
-            return self.http(method, url.path + '?' + url.query, body)
-        if resp.status < 200 or resp.status > 400:
-            raise Exception("Received %d %s for path %s\n%s"
-                            % (resp.status, resp.reason, path, resp.read()))
-        return resp.read()
-
-    def verbose(self, string):
-        if self.options.verbose:
-            output(string)
-
-    def get_arg(self):
-        assert_usage(len(self.args) == 1, 'Exactly one argument required')
-        return self.args[0]
-
-    def invoke_help(self):
-        if len(self.args) == 0:
-            parser.print_help()
-        else:
-            help_cmd = self.get_arg()
-            if help_cmd == 'subcommands':
-                usage = subcommands_usage()
-            elif help_cmd == 'config':
-                usage = config_usage()
-            else:
-                assert_usage(False, """help topic must be one of:
-  subcommands
-  config""")
-            print usage
-        exit(0)
-
-    def invoke_publish(self):
-        (uri, upload) = self.parse_args(self.args, EXTRA_VERBS['publish'])
-        upload['properties'] = {} # TODO do we care here?
-        if not 'payload' in upload:
-            data = sys.stdin.read()
-            upload['payload'] = base64.b64encode(data)
-            upload['payload_encoding'] = 'base64'
-        resp = json.loads(self.post(uri, json.dumps(upload)))
-        if resp['routed']:
-            self.verbose("Message published")
-        else:
-            self.verbose("Message published but NOT routed")
-
-    def invoke_get(self):
-        (uri, upload) = self.parse_args(self.args, EXTRA_VERBS['get'])
-        payload_file = 'payload_file' in upload and upload['payload_file'] or None
-        assert_usage(not payload_file or upload['count'] == '1',
-                     'Cannot get multiple messages using payload_file')
-        result = self.post(uri, json.dumps(upload))
-        if payload_file:
-            write_payload_file(payload_file, result)
-            columns = ['routing_key', 'exchange', 'message_count',
-                       'payload_bytes', 'redelivered']
-            format_list(result, columns, {}, self.options)
-        else:
-            format_list(result, [], {}, self.options)
-
-    def invoke_export(self):
-        path = self.get_arg()
-        definitions = self.get("/definitions")
-        f = open(path, 'w')
-        f.write(definitions)
-        f.close()
-        self.verbose("Exported definitions for %s to \"%s\""
-                     % (self.options.hostname, path))
-
-    def invoke_import(self):
-        path = self.get_arg()
-        f = open(path, 'r')
-        definitions = f.read()
-        f.close()
-        self.post("/definitions", definitions)
-        self.verbose("Imported definitions for %s from \"%s\""
-                     % (self.options.hostname, path))
-
-    def invoke_list(self):
-        cols = self.args[1:]
-        (uri, obj_info) = self.list_show_uri(LISTABLE, 'list', cols)
-        format_list(self.get(uri), cols, obj_info, self.options)
-
-    def invoke_show(self):
-        cols = self.args[1:]
-        (uri, obj_info) = self.list_show_uri(SHOWABLE, 'show', cols)
-        format_list('[{0}]'.format(self.get(uri)), cols, obj_info, self.options)
-
-    def list_show_uri(self, obj_types, verb, cols):
-        obj_type = self.args[0]
-        assert_usage(obj_type in obj_types,
-                     "Don't know how to {0} {1}".format(verb, obj_type))
-        obj_info = obj_types[obj_type]
-        uri = "/%s" % obj_type
-        query = []
-        if obj_info['vhost'] and self.options.vhost:
-            uri += "/%s" % urllib.quote_plus(self.options.vhost)
-        if cols != []:
-            query.append("columns=" + ",".join(cols))
-        sort = self.options.sort
-        if sort:
-            query.append("sort=" + sort)
-        if self.options.sort_reverse:
-            query.append("sort_reverse=true")
-        query = "&".join(query)
-        if query != "":
-            uri += "?" + query
-        return (uri, obj_info)
-
-    def invoke_declare(self):
-        (obj_type, uri, upload) = self.declare_delete_parse(DECLARABLE)
-        if obj_type == 'binding':
-            self.post(uri, json.dumps(upload))
-        else:
-            self.put(uri, json.dumps(upload))
-        self.verbose("{0} declared".format(obj_type))
-
-    def invoke_delete(self):
-        (obj_type, uri, upload) = self.declare_delete_parse(DELETABLE)
-        self.delete(uri)
-        self.verbose("{0} deleted".format(obj_type))
-
-    def invoke_close(self):
-        (obj_type, uri, upload) = self.declare_delete_parse(CLOSABLE)
-        self.delete(uri)
-        self.verbose("{0} closed".format(obj_type))
-
-    def invoke_purge(self):
-        (obj_type, uri, upload) = self.declare_delete_parse(PURGABLE)
-        self.delete(uri)
-        self.verbose("{0} purged".format(obj_type))
-
-    def declare_delete_parse(self, root):
-        assert_usage(len(self.args) > 0, 'Type not specified')
-        obj_type = self.args[0]
-        assert_usage(obj_type in root,
-                     'Type {0} not recognised'.format(obj_type))
-        obj = root[obj_type]
-        (uri, upload) = self.parse_args(self.args[1:], obj)
-        return (obj_type, uri, upload)
-
-    def parse_args(self, args, obj):
-        mandatory =  obj['mandatory']
-        optional = obj['optional']
-        uri_template = obj['uri']
-        upload = {}
-        for k in optional.keys():
-            if optional[k]:
-                upload[k] = optional[k]
-        for arg in args:
-            assert_usage("=" in arg,
-                         'Argument "{0}" not in format name=value'.format(arg))
-            (name, value) = arg.split("=", 1)
-            assert_usage(name in mandatory or name in optional.keys(),
-                         'Argument "{0}" not recognised'.format(name))
-            if 'json' in obj and name in obj['json']:
-                upload[name] = self.parse_json(value)
-            else:
-                upload[name] = value
-        for m in mandatory:
-            assert_usage(m in upload.keys(),
-                         'mandatory argument "{0}" required'.format(m))
-        if 'vhost' not in mandatory:
-            upload['vhost'] = self.options.vhost or self.options.declare_vhost
-        uri_args = {}
-        for k in upload:
-            v = upload[k]
-            if v and isinstance(v, basestring):
-                uri_args[k] = urllib.quote_plus(v)
-                if k == 'destination_type':
-                    uri_args['destination_char'] = v[0]
-        uri = uri_template.format(**uri_args)
-        return (uri, upload)
-
-    def parse_json(self, text):
-        try:
-            return json.loads(text)
-        except ValueError:
-            print "Could not parse JSON:\n  {0}".format(text)
-            sys.exit(1)
-
-def format_list(json_list, columns, args, options):
-    format = options.format
-    formatter = None
-    if format == "raw_json":
-        output(json_list)
-        return
-    elif format == "pretty_json":
-        enc = json.JSONEncoder(False, False, True, True, True, 2)
-        output(enc.encode(json.loads(json_list)))
-        return
-    else:
-        formatter = FORMATS[format]
-    assert_usage(formatter != None,
-                 "Format {0} not recognised".format(format))
-    formatter_instance = formatter(columns, args, options)
-    formatter_instance.display(json_list)
-
-class Lister:
-    def verbose(self, string):
-        if self.options.verbose:
-            output(string)
-
-    def display(self, json_list):
-        depth = sys.maxint
-        if len(self.columns) == 0:
-            depth = int(self.options.depth)
-        (columns, table) = self.list_to_table(json.loads(json_list), depth)
-        if len(table) > 0:
-            self.display_list(columns, table)
-        else:
-            self.verbose("No items")
-
-    def list_to_table(self, items, max_depth):
-        columns = {}
-        column_ix = {}
-        row = None
-        table = []
-
-        def add(prefix, depth, item, fun):
-            for key in item:
-                column = prefix == '' and key or (prefix + '.' + key)
-                subitem = item[key]
-                if type(subitem) == dict:
-                    if self.obj_info.has_key('json') and key in self.obj_info['json']:
-                        fun(column, json.dumps(subitem))
-                    else:
-                        if depth < max_depth:
-                            add(column, depth + 1, subitem, fun)
-                elif type(subitem) == list:
-                    # The first branch has slave nodes in queues in
-                    # mind (which come out looking decent); the second
-                    # one has applications in nodes (which look less
-                    # so, but what would look good?).
-                    if [x for x in subitem if type(x) != unicode] == []:
-                        serialised = " ".join(subitem)
-                    else:
-                        serialised = json.dumps(subitem)
-                    fun(column, serialised)
-                else:
-                    fun(column, subitem)
-
-        def add_to_columns(col, val):
-            columns[col] = True
-
-        def add_to_row(col, val):
-            if col in column_ix:
-                row[column_ix[col]] = unicode(val)
-
-        if len(self.columns) == 0:
-            for item in items:
-                add('', 1, item, add_to_columns)
-            columns = columns.keys()
-            columns.sort(key=column_sort_key)
-        else:
-            columns = self.columns
-
-        for i in xrange(0, len(columns)):
-            column_ix[columns[i]] = i
-        for item in items:
-            row = len(columns) * ['']
-            add('', 1, item, add_to_row)
-            table.append(row)
-
-        return (columns, table)
-
-class TSVList(Lister):
-    def __init__(self, columns, obj_info, options):
-        self.columns = columns
-        self.obj_info = obj_info
-        self.options = options
-
-    def display_list(self, columns, table):
-        head = "\t".join(columns)
-        self.verbose(head)
-
-        for row in table:
-            line = "\t".join(row)
-            output(line)
-
-class LongList(Lister):
-    def __init__(self, columns, obj_info, options):
-        self.columns = columns
-        self.obj_info = obj_info
-        self.options = options
-
-    def display_list(self, columns, table):
-        sep = "\n" + "-" * 80 + "\n"
-        max_width = 0
-        for col in columns:
-            max_width = max(max_width, len(col))
-        fmt = "{0:>" + unicode(max_width) + "}: {1}"
-        output(sep)
-        for i in xrange(0, len(table)):
-            for j in xrange(0, len(columns)):
-                output(fmt.format(columns[j], table[i][j]))
-            output(sep)
-
-class TableList(Lister):
-    def __init__(self, columns, obj_info, options):
-        self.columns = columns
-        self.obj_info = obj_info
-        self.options = options
-
-    def display_list(self, columns, table):
-        total = [columns]
-        total.extend(table)
-        self.ascii_table(total)
-
-    def ascii_table(self, rows):
-        table = ""
-        col_widths = [0] * len(rows[0])
-        for i in xrange(0, len(rows[0])):
-            for j in xrange(0, len(rows)):
-                col_widths[i] = max(col_widths[i], len(rows[j][i]))
-        self.ascii_bar(col_widths)
-        self.ascii_row(col_widths, rows[0], "^")
-        self.ascii_bar(col_widths)
-        for row in rows[1:]:
-            self.ascii_row(col_widths, row, "<")
-        self.ascii_bar(col_widths)
-
-    def ascii_row(self, col_widths, row, align):
-        txt = "|"
-        for i in xrange(0, len(col_widths)):
-            fmt = " {0:" + align + unicode(col_widths[i]) + "} "
-            txt += fmt.format(row[i]) + "|"
-        output(txt)
-
-    def ascii_bar(self, col_widths):
-        txt = "+"
-        for w in col_widths:
-            txt += ("-" * (w + 2)) + "+"
-        output(txt)
-
-class KeyValueList(Lister):
-    def __init__(self, columns, obj_info, options):
-        self.columns = columns
-        self.obj_info = obj_info
-        self.options = options
-
-    def display_list(self, columns, table):
-        for i in xrange(0, len(table)):
-            row = []
-            for j in xrange(0, len(columns)):
-                row.append("{0}=\"{1}\"".format(columns[j], table[i][j]))
-            output(" ".join(row))
-
-# TODO handle spaces etc in completable names
-class BashList(Lister):
-    def __init__(self, columns, obj_info, options):
-        self.columns = columns
-        self.obj_info = obj_info
-        self.options = options
-
-    def display_list(self, columns, table):
-        ix = None
-        for i in xrange(0, len(columns)):
-            if columns[i] == 'name':
-                ix = i
-        if ix is not None:
-            res = []
-            for row in table:
-                res.append(row[ix])
-            output(" ".join(res))
-
-FORMATS = {
-    'raw_json'    : None, # Special cased
-    'pretty_json' : None, # Ditto
-    'tsv'         : TSVList,
-    'long'        : LongList,
-    'table'       : TableList,
-    'kvp'         : KeyValueList,
-    'bash'        : BashList
-}
-
-def write_payload_file(payload_file, json_list):
-    result = json.loads(json_list)[0]
-    payload = result['payload']
-    payload_encoding = result['payload_encoding']
-    f = open(payload_file, 'w')
-    if payload_encoding == 'base64':
-        data = base64.b64decode(payload)
-    else:
-        data = payload
-    f.write(data)
-    f.close()
-
-def print_bash_completion():
-    script = """# This is a bash completion script for rabbitmqadmin.
-# Redirect it to a file, then source it or copy it to /etc/bash_completion.d
-# to get tab completion. rabbitmqadmin must be on your PATH for this to work.
-_rabbitmqadmin()
-{
-    local cur prev opts base
-    COMPREPLY=()
-    cur="${COMP_WORDS[COMP_CWORD]}"
-    prev="${COMP_WORDS[COMP_CWORD-1]}"
-
-    opts="list show declare delete close purge import export get publish help"
-    fargs="--help --host --port --vhost --username --password --format --depth --sort --sort-reverse"
-
-    case "${prev}" in
-       list)
-           COMPREPLY=( $(compgen -W '""" + " ".join(LISTABLE) + """' -- ${cur}) )
-            return 0
-            ;;
-       show)
-           COMPREPLY=( $(compgen -W '""" + " ".join(SHOWABLE) + """' -- ${cur}) )
-            return 0
-            ;;
-       declare)
-           COMPREPLY=( $(compgen -W '""" + " ".join(DECLARABLE.keys()) + """' -- ${cur}) )
-            return 0
-            ;;
-       delete)
-           COMPREPLY=( $(compgen -W '""" + " ".join(DELETABLE.keys()) + """' -- ${cur}) )
-            return 0
-            ;;
-       close)
-           COMPREPLY=( $(compgen -W '""" + " ".join(CLOSABLE.keys()) + """' -- ${cur}) )
-            return 0
-            ;;
-       purge)
-           COMPREPLY=( $(compgen -W '""" + " ".join(PURGABLE.keys()) + """' -- ${cur}) )
-            return 0
-            ;;
-       export)
-           COMPREPLY=( $(compgen -f ${cur}) )
-            return 0
-            ;;
-       import)
-           COMPREPLY=( $(compgen -f ${cur}) )
-            return 0
-            ;;
-       help)
-            opts="subcommands config"
-           COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) )
-            return 0
-            ;;
-       -H)
-           COMPREPLY=( $(compgen -A hostname ${cur}) )
-            return 0
-            ;;
-       --host)
-           COMPREPLY=( $(compgen -A hostname ${cur}) )
-            return 0
-            ;;
-       -V)
-            opts="$(rabbitmqadmin -q -f bash list vhosts)"
-           COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) )
-            return 0
-            ;;
-       --vhost)
-            opts="$(rabbitmqadmin -q -f bash list vhosts)"
-           COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) )
-            return 0
-            ;;
-       -u)
-            opts="$(rabbitmqadmin -q -f bash list users)"
-           COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) )
-            return 0
-            ;;
-       --username)
-            opts="$(rabbitmqadmin -q -f bash list users)"
-           COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) )
-            return 0
-            ;;
-       -f)
-           COMPREPLY=( $(compgen -W \"""" + " ".join(FORMATS.keys()) + """\"  -- ${cur}) )
-            return 0
-            ;;
-       --format)
-           COMPREPLY=( $(compgen -W \"""" + " ".join(FORMATS.keys()) + """\"  -- ${cur}) )
-            return 0
-            ;;
-
-"""
-    for l in LISTABLE:
-        key = l[0:len(l) - 1]
-        script += "        " + key + """)
-            opts="$(rabbitmqadmin -q -f bash list """ + l + """)"
-           COMPREPLY=( $(compgen -W "${opts}"  -- ${cur}) )
-            return 0
-            ;;
-"""
-    script += """        *)
-        ;;
-    esac
-
-   COMPREPLY=($(compgen -W "${opts} ${fargs}" -- ${cur}))
-   return 0
-}
-complete -F _rabbitmqadmin rabbitmqadmin
-"""
-    output(script)
-
-if __name__ == "__main__":
-    main()
diff --git a/rabbitmq-server/test/unit_SUITE.erl b/rabbitmq-server/test/unit_SUITE.erl
deleted file mode 100644 (file)
index ba0f43f..0000000
+++ /dev/null
@@ -1,735 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("rabbit_common/include/rabbit.hrl").
--include_lib("rabbit_common/include/rabbit_framing.hrl").
-
--compile(export_all).
-
-all() ->
-    [
-      {group, parallel_tests}
-    ].
-
-groups() ->
-    [
-      {parallel_tests, [parallel], [
-          arguments_parser,
-          filtering_flags_parsing,
-          {basic_header_handling, [parallel], [
-              write_table_with_invalid_existing_type,
-              invalid_existing_headers,
-              disparate_invalid_header_entries_accumulate_separately,
-              corrupt_or_invalid_headers_are_overwritten,
-              invalid_same_header_entry_accumulation
-            ]},
-          content_framing,
-          content_transcoding,
-          pg_local,
-          pmerge,
-          plmerge,
-          priority_queue,
-          {resource_monitor, [parallel], [
-              parse_information_unit
-            ]},
-          {supervisor2, [], [
-              check_shutdown_stop,
-              check_shutdown_ignored
-            ]},
-          table_codec,
-          {truncate, [parallel], [
-              short_examples_exactly,
-              term_limit,
-              large_examples_for_size
-            ]},
-          unfold,
-          version_equivalance,
-          {vm_memory_monitor, [parallel], [
-              parse_line_linux
-            ]}
-        ]}
-    ].
-
-init_per_group(_, Config) -> Config.
-end_per_group(_, Config) -> Config.
-
-%% -------------------------------------------------------------------
-%% Argument parsing.
-%% -------------------------------------------------------------------
-
-arguments_parser(_Config) ->
-    GlobalOpts1 = [{"-f1", flag}, {"-o1", {option, "foo"}}],
-    Commands1 = [command1, {command2, [{"-f2", flag}, {"-o2", {option, "bar"}}]}],
-
-    GetOptions =
-        fun (Args) ->
-                rabbit_cli:parse_arguments(Commands1, GlobalOpts1, "-n", Args)
-        end,
-
-    check_parse_arguments(no_command, GetOptions, []),
-    check_parse_arguments(no_command, GetOptions, ["foo", "bar"]),
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", false}, {"-o1", "foo"}], []}},
-      GetOptions, ["command1"]),
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", false}, {"-o1", "blah"}], []}},
-      GetOptions, ["command1", "-o1", "blah"]),
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", true}, {"-o1", "foo"}], []}},
-      GetOptions, ["command1", "-f1"]),
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", false}, {"-o1", "blah"}], []}},
-      GetOptions, ["-o1", "blah", "command1"]),
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", false}, {"-o1", "blah"}], ["quux"]}},
-      GetOptions, ["-o1", "blah", "command1", "quux"]),
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", true}, {"-o1", "blah"}], ["quux", "baz"]}},
-      GetOptions, ["command1", "quux", "-f1", "-o1", "blah", "baz"]),
-    %% For duplicate flags, the last one counts
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", false}, {"-o1", "second"}], []}},
-      GetOptions, ["-o1", "first", "command1", "-o1", "second"]),
-    %% If the flag "eats" the command, the command won't be recognised
-    check_parse_arguments(no_command, GetOptions,
-                          ["-o1", "command1", "quux"]),
-    %% If a flag eats another flag, the eaten flag won't be recognised
-    check_parse_arguments(
-      {ok, {command1, [{"-f1", false}, {"-o1", "-f1"}], []}},
-      GetOptions, ["command1", "-o1", "-f1"]),
-
-    %% Now for some command-specific flags...
-    check_parse_arguments(
-      {ok, {command2, [{"-f1", false}, {"-f2", false},
-                       {"-o1", "foo"}, {"-o2", "bar"}], []}},
-      GetOptions, ["command2"]),
-
-    check_parse_arguments(
-      {ok, {command2, [{"-f1", false}, {"-f2", true},
-                       {"-o1", "baz"}, {"-o2", "bar"}], ["quux", "foo"]}},
-      GetOptions, ["-f2", "command2", "quux", "-o1", "baz", "foo"]),
-
-    passed.
-
-check_parse_arguments(ExpRes, Fun, As) ->
-    SortRes =
-        fun (no_command)          -> no_command;
-            ({ok, {C, KVs, As1}}) -> {ok, {C, lists:sort(KVs), As1}}
-        end,
-
-    true = SortRes(ExpRes) =:= SortRes(Fun(As)).
-
-filtering_flags_parsing(_Config) ->
-    Cases = [{[], [], []}
-            ,{[{"--online", true}], ["--offline", "--online", "--third-option"], [false, true, false]}
-            ,{[{"--online", true}, {"--third-option", true}, {"--offline", true}], ["--offline", "--online", "--third-option"], [true, true, true]}
-            ,{[], ["--offline", "--online", "--third-option"], [true, true, true]}
-            ],
-    lists:foreach(fun({Vals, Opts, Expect}) ->
-                          case rabbit_cli:filter_opts(Vals, Opts) of
-                              Expect ->
-                                  ok;
-                              Got ->
-                                  exit({no_match, Got, Expect, {args, Vals, Opts}})
-                          end
-                  end,
-                  Cases).
-
-%% -------------------------------------------------------------------
-%% basic_header_handling.
-%% -------------------------------------------------------------------
-
--define(XDEATH_TABLE,
-        [{<<"reason">>,       longstr,   <<"blah">>},
-         {<<"queue">>,        longstr,   <<"foo.bar.baz">>},
-         {<<"exchange">>,     longstr,   <<"my-exchange">>},
-         {<<"routing-keys">>, array,     []}]).
-
--define(ROUTE_TABLE, [{<<"redelivered">>, bool, <<"true">>}]).
-
--define(BAD_HEADER(K), {<<K>>, longstr, <<"bad ", K>>}).
--define(BAD_HEADER2(K, Suf), {<<K>>, longstr, <<"bad ", K, Suf>>}).
--define(FOUND_BAD_HEADER(K), {<<K>>, array, [{longstr, <<"bad ", K>>}]}).
-
-write_table_with_invalid_existing_type(_Config) ->
-    prepend_check(<<"header1">>, ?XDEATH_TABLE, [?BAD_HEADER("header1")]).
-
-invalid_existing_headers(_Config) ->
-    Headers =
-        prepend_check(<<"header2">>, ?ROUTE_TABLE, [?BAD_HEADER("header2")]),
-    {array, [{table, ?ROUTE_TABLE}]} =
-        rabbit_misc:table_lookup(Headers, <<"header2">>),
-    passed.
-
-disparate_invalid_header_entries_accumulate_separately(_Config) ->
-    BadHeaders = [?BAD_HEADER("header2")],
-    Headers = prepend_check(<<"header2">>, ?ROUTE_TABLE, BadHeaders),
-    Headers2 = prepend_check(<<"header1">>, ?XDEATH_TABLE,
-                             [?BAD_HEADER("header1") | Headers]),
-    {table, [?FOUND_BAD_HEADER("header1"),
-             ?FOUND_BAD_HEADER("header2")]} =
-        rabbit_misc:table_lookup(Headers2, ?INVALID_HEADERS_KEY),
-    passed.
-
-corrupt_or_invalid_headers_are_overwritten(_Config) ->
-    Headers0 = [?BAD_HEADER("header1"),
-                ?BAD_HEADER("x-invalid-headers")],
-    Headers1 = prepend_check(<<"header1">>, ?XDEATH_TABLE, Headers0),
-    {table,[?FOUND_BAD_HEADER("header1"),
-            ?FOUND_BAD_HEADER("x-invalid-headers")]} =
-        rabbit_misc:table_lookup(Headers1, ?INVALID_HEADERS_KEY),
-    passed.
-
-invalid_same_header_entry_accumulation(_Config) ->
-    BadHeader1 = ?BAD_HEADER2("header1", "a"),
-    Headers = prepend_check(<<"header1">>, ?ROUTE_TABLE, [BadHeader1]),
-    Headers2 = prepend_check(<<"header1">>, ?ROUTE_TABLE,
-                             [?BAD_HEADER2("header1", "b") | Headers]),
-    {table, InvalidHeaders} =
-        rabbit_misc:table_lookup(Headers2, ?INVALID_HEADERS_KEY),
-    {array, [{longstr,<<"bad header1b">>},
-             {longstr,<<"bad header1a">>}]} =
-        rabbit_misc:table_lookup(InvalidHeaders, <<"header1">>),
-    passed.
-
-prepend_check(HeaderKey, HeaderTable, Headers) ->
-    Headers1 = rabbit_basic:prepend_table_header(
-                 HeaderKey, HeaderTable, Headers),
-    {table, Invalid} =
-        rabbit_misc:table_lookup(Headers1, ?INVALID_HEADERS_KEY),
-    {Type, Value} = rabbit_misc:table_lookup(Headers, HeaderKey),
-    {array, [{Type, Value} | _]} =
-        rabbit_misc:table_lookup(Invalid, HeaderKey),
-    Headers1.
-
-%% -------------------------------------------------------------------
-%% pg_local.
-%% -------------------------------------------------------------------
-
-pg_local(_Config) ->
-    [P, Q] = [spawn(fun () -> receive X -> X end end) || _ <- [x, x]],
-    check_pg_local(ok, [], []),
-    check_pg_local(pg_local:join(a, P), [P], []),
-    check_pg_local(pg_local:join(b, P), [P], [P]),
-    check_pg_local(pg_local:join(a, P), [P, P], [P]),
-    check_pg_local(pg_local:join(a, Q), [P, P, Q], [P]),
-    check_pg_local(pg_local:join(b, Q), [P, P, Q], [P, Q]),
-    check_pg_local(pg_local:join(b, Q), [P, P, Q], [P, Q, Q]),
-    check_pg_local(pg_local:leave(a, P), [P, Q], [P, Q, Q]),
-    check_pg_local(pg_local:leave(b, P), [P, Q], [Q, Q]),
-    check_pg_local(pg_local:leave(a, P), [Q], [Q, Q]),
-    check_pg_local(pg_local:leave(a, P), [Q], [Q, Q]),
-    [begin X ! done,
-           Ref = erlang:monitor(process, X),
-           receive {'DOWN', Ref, process, X, _Info} -> ok end
-     end  || X <- [P, Q]],
-    check_pg_local(ok, [], []),
-    passed.
-
-check_pg_local(ok, APids, BPids) ->
-    ok = pg_local:sync(),
-    [true, true] = [lists:sort(Pids) == lists:sort(pg_local:get_members(Key)) ||
-                       {Key, Pids} <- [{a, APids}, {b, BPids}]].
-
-%% -------------------------------------------------------------------
-%% priority_queue.
-%% -------------------------------------------------------------------
-
-priority_queue(_Config) ->
-
-    false = priority_queue:is_queue(not_a_queue),
-
-    %% empty Q
-    Q = priority_queue:new(),
-    {true, true, 0, [], []} = test_priority_queue(Q),
-
-    %% 1-4 element no-priority Q
-    true = lists:all(fun (X) -> X =:= passed end,
-                     lists:map(fun test_simple_n_element_queue/1,
-                               lists:seq(1, 4))),
-
-    %% 1-element priority Q
-    Q1 = priority_queue:in(foo, 1, priority_queue:new()),
-    {true, false, 1, [{1, foo}], [foo]} =
-        test_priority_queue(Q1),
-
-    %% 2-element same-priority Q
-    Q2 = priority_queue:in(bar, 1, Q1),
-    {true, false, 2, [{1, foo}, {1, bar}], [foo, bar]} =
-        test_priority_queue(Q2),
-
-    %% 2-element different-priority Q
-    Q3 = priority_queue:in(bar, 2, Q1),
-    {true, false, 2, [{2, bar}, {1, foo}], [bar, foo]} =
-        test_priority_queue(Q3),
-
-    %% 1-element negative priority Q
-    Q4 = priority_queue:in(foo, -1, priority_queue:new()),
-    {true, false, 1, [{-1, foo}], [foo]} = test_priority_queue(Q4),
-
-    %% merge 2 * 1-element no-priority Qs
-    Q5 = priority_queue:join(priority_queue:in(foo, Q),
-                             priority_queue:in(bar, Q)),
-    {true, false, 2, [{0, foo}, {0, bar}], [foo, bar]} =
-        test_priority_queue(Q5),
-
-    %% merge 1-element no-priority Q with 1-element priority Q
-    Q6 = priority_queue:join(priority_queue:in(foo, Q),
-                             priority_queue:in(bar, 1, Q)),
-    {true, false, 2, [{1, bar}, {0, foo}], [bar, foo]} =
-        test_priority_queue(Q6),
-
-    %% merge 1-element priority Q with 1-element no-priority Q
-    Q7 = priority_queue:join(priority_queue:in(foo, 1, Q),
-                             priority_queue:in(bar, Q)),
-    {true, false, 2, [{1, foo}, {0, bar}], [foo, bar]} =
-        test_priority_queue(Q7),
-
-    %% merge 2 * 1-element same-priority Qs
-    Q8 = priority_queue:join(priority_queue:in(foo, 1, Q),
-                             priority_queue:in(bar, 1, Q)),
-    {true, false, 2, [{1, foo}, {1, bar}], [foo, bar]} =
-        test_priority_queue(Q8),
-
-    %% merge 2 * 1-element different-priority Qs
-    Q9 = priority_queue:join(priority_queue:in(foo, 1, Q),
-                             priority_queue:in(bar, 2, Q)),
-    {true, false, 2, [{2, bar}, {1, foo}], [bar, foo]} =
-        test_priority_queue(Q9),
-
-    %% merge 2 * 1-element different-priority Qs (other way around)
-    Q10 = priority_queue:join(priority_queue:in(bar, 2, Q),
-                              priority_queue:in(foo, 1, Q)),
-    {true, false, 2, [{2, bar}, {1, foo}], [bar, foo]} =
-        test_priority_queue(Q10),
-
-    %% merge 2 * 2-element multi-different-priority Qs
-    Q11 = priority_queue:join(Q6, Q5),
-    {true, false, 4, [{1, bar}, {0, foo}, {0, foo}, {0, bar}],
-     [bar, foo, foo, bar]} = test_priority_queue(Q11),
-
-    %% and the other way around
-    Q12 = priority_queue:join(Q5, Q6),
-    {true, false, 4, [{1, bar}, {0, foo}, {0, bar}, {0, foo}],
-     [bar, foo, bar, foo]} = test_priority_queue(Q12),
-
-    %% merge with negative priorities
-    Q13 = priority_queue:join(Q4, Q5),
-    {true, false, 3, [{0, foo}, {0, bar}, {-1, foo}], [foo, bar, foo]} =
-        test_priority_queue(Q13),
-
-    %% and the other way around
-    Q14 = priority_queue:join(Q5, Q4),
-    {true, false, 3, [{0, foo}, {0, bar}, {-1, foo}], [foo, bar, foo]} =
-        test_priority_queue(Q14),
-
-    %% joins with empty queues:
-    Q1 = priority_queue:join(Q, Q1),
-    Q1 = priority_queue:join(Q1, Q),
-
-    %% insert with priority into non-empty zero-priority queue
-    Q15 = priority_queue:in(baz, 1, Q5),
-    {true, false, 3, [{1, baz}, {0, foo}, {0, bar}], [baz, foo, bar]} =
-        test_priority_queue(Q15),
-
-    %% 1-element infinity priority Q
-    Q16 = priority_queue:in(foo, infinity, Q),
-    {true, false, 1, [{infinity, foo}], [foo]} = test_priority_queue(Q16),
-
-    %% add infinity to 0-priority Q
-    Q17 = priority_queue:in(foo, infinity, priority_queue:in(bar, Q)),
-    {true, false, 2, [{infinity, foo}, {0, bar}], [foo, bar]} =
-        test_priority_queue(Q17),
-
-    %% and the other way around
-    Q18 = priority_queue:in(bar, priority_queue:in(foo, infinity, Q)),
-    {true, false, 2, [{infinity, foo}, {0, bar}], [foo, bar]} =
-        test_priority_queue(Q18),
-
-    %% add infinity to mixed-priority Q
-    Q19 = priority_queue:in(qux, infinity, Q3),
-    {true, false, 3, [{infinity, qux}, {2, bar}, {1, foo}], [qux, bar, foo]} =
-        test_priority_queue(Q19),
-
-    %% merge the above with a negative priority Q
-    Q20 = priority_queue:join(Q19, Q4),
-    {true, false, 4, [{infinity, qux}, {2, bar}, {1, foo}, {-1, foo}],
-     [qux, bar, foo, foo]} = test_priority_queue(Q20),
-
-    %% merge two infinity priority queues
-    Q21 = priority_queue:join(priority_queue:in(foo, infinity, Q),
-                              priority_queue:in(bar, infinity, Q)),
-    {true, false, 2, [{infinity, foo}, {infinity, bar}], [foo, bar]} =
-        test_priority_queue(Q21),
-
-    %% merge two mixed priority with infinity queues
-    Q22 = priority_queue:join(Q18, Q20),
-    {true, false, 6, [{infinity, foo}, {infinity, qux}, {2, bar}, {1, foo},
-                      {0, bar}, {-1, foo}], [foo, qux, bar, foo, bar, foo]} =
-        test_priority_queue(Q22),
-
-    passed.
-
-priority_queue_in_all(Q, L) ->
-    lists:foldl(fun (X, Acc) -> priority_queue:in(X, Acc) end, Q, L).
-
-priority_queue_out_all(Q) ->
-    case priority_queue:out(Q) of
-        {empty, _}       -> [];
-        {{value, V}, Q1} -> [V | priority_queue_out_all(Q1)]
-    end.
-
-test_priority_queue(Q) ->
-    {priority_queue:is_queue(Q),
-     priority_queue:is_empty(Q),
-     priority_queue:len(Q),
-     priority_queue:to_list(Q),
-     priority_queue_out_all(Q)}.
-
-test_simple_n_element_queue(N) ->
-    Items = lists:seq(1, N),
-    Q = priority_queue_in_all(priority_queue:new(), Items),
-    ToListRes = [{0, X} || X <- Items],
-    {true, false, N, ToListRes, Items} = test_priority_queue(Q),
-    passed.
-
-%% ---------------------------------------------------------------------------
-%% resource_monitor.
-%% ---------------------------------------------------------------------------
-
-parse_information_unit(_Config) ->
-    lists:foreach(fun ({S, V}) ->
-                          V = rabbit_resource_monitor_misc:parse_information_unit(S)
-                  end,
-                  [
-                   {"1000", {ok, 1000}},
-
-                   {"10kB", {ok, 10000}},
-                   {"10MB", {ok, 10000000}},
-                   {"10GB", {ok, 10000000000}},
-
-                   {"10kiB", {ok, 10240}},
-                   {"10MiB", {ok, 10485760}},
-                   {"10GiB", {ok, 10737418240}},
-
-                   {"10k", {ok, 10240}},
-                   {"10M", {ok, 10485760}},
-                   {"10G", {ok, 10737418240}},
-
-                   {"10KB", {ok, 10000}},
-                   {"10K",  {ok, 10240}},
-                   {"10m",  {ok, 10485760}},
-                   {"10Mb", {ok, 10000000}},
-
-                   {"0MB",  {ok, 0}},
-
-                   {"10 k", {error, parse_error}},
-                   {"MB", {error, parse_error}},
-                   {"", {error, parse_error}},
-                   {"0.5GB", {error, parse_error}},
-                   {"10TB", {error, parse_error}}
-                  ]),
-    passed.
-
-%% ---------------------------------------------------------------------------
-%% supervisor2.
-%% ---------------------------------------------------------------------------
-
-check_shutdown_stop(_Config) ->
-    ok = check_shutdown(stop,    200, 200, 2000).
-
-check_shutdown_ignored(_Config) ->
-    ok = check_shutdown(ignored,   1,   2, 2000).
-
-check_shutdown(SigStop, Iterations, ChildCount, SupTimeout) ->
-    {ok, Sup} = supervisor2:start_link(dummy_supervisor2, [SupTimeout]),
-    Res = lists:foldl(
-            fun (I, ok) ->
-                    TestSupPid = erlang:whereis(dummy_supervisor2),
-                    ChildPids =
-                        [begin
-                             {ok, ChildPid} =
-                                 supervisor2:start_child(TestSupPid, []),
-                             ChildPid
-                         end || _ <- lists:seq(1, ChildCount)],
-                    MRef = erlang:monitor(process, TestSupPid),
-                    [P ! SigStop || P <- ChildPids],
-                    ok = supervisor2:terminate_child(Sup, test_sup),
-                    {ok, _} = supervisor2:restart_child(Sup, test_sup),
-                    receive
-                        {'DOWN', MRef, process, TestSupPid, shutdown} ->
-                            ok;
-                        {'DOWN', MRef, process, TestSupPid, Reason} ->
-                            {error, {I, Reason}}
-                    end;
-                (_, R) ->
-                    R
-            end, ok, lists:seq(1, Iterations)),
-    unlink(Sup),
-    MSupRef = erlang:monitor(process, Sup),
-    exit(Sup, shutdown),
-    receive
-        {'DOWN', MSupRef, process, Sup, _Reason} ->
-            ok
-    end,
-    Res.
-
-%% ---------------------------------------------------------------------------
-%% truncate.
-%% ---------------------------------------------------------------------------
-
-short_examples_exactly(_Config) ->
-    F = fun (Term, Exp) ->
-                Exp = truncate:term(Term, {1, {10, 10, 5, 5}}),
-                Term = truncate:term(Term, {100000, {10, 10, 5, 5}})
-        end,
-    FSmall = fun (Term, Exp) ->
-                     Exp = truncate:term(Term, {1, {2, 2, 2, 2}}),
-                     Term = truncate:term(Term, {100000, {2, 2, 2, 2}})
-             end,
-    F([], []),
-    F("h", "h"),
-    F("hello world", "hello w..."),
-    F([[h,e,l,l,o,' ',w,o,r,l,d]], [[h,e,l,l,o,'...']]),
-    F([a|b], [a|b]),
-    F(<<"hello">>, <<"hello">>),
-    F([<<"hello world">>], [<<"he...">>]),
-    F(<<1:1>>, <<1:1>>),
-    F(<<1:81>>, <<0:56, "...">>),
-    F({{{{a}}},{b},c,d,e,f,g,h,i,j,k}, {{{'...'}},{b},c,d,e,f,g,h,i,j,'...'}),
-    FSmall({a,30,40,40,40,40}, {a,30,'...'}),
-    FSmall([a,30,40,40,40,40], [a,30,'...']),
-    P = spawn(fun() -> receive die -> ok end end),
-    F([0, 0.0, <<1:1>>, F, P], [0, 0.0, <<1:1>>, F, P]),
-    P ! die,
-    R = make_ref(),
-    F([R], [R]),
-    ok.
-
-term_limit(_Config) ->
-    W = erlang:system_info(wordsize),
-    S = <<"abc">>,
-    1 = truncate:term_size(S, 4, W),
-    limit_exceeded = truncate:term_size(S, 3, W),
-    case 100 - truncate:term_size([S, S], 100, W) of
-        22 -> ok; %% 32 bit
-        38 -> ok  %% 64 bit
-    end,
-    case 100 - truncate:term_size([S, [S]], 100, W) of
-        30 -> ok; %% ditto
-        54 -> ok
-    end,
-    limit_exceeded = truncate:term_size([S, S], 6, W),
-    ok.
-
-large_examples_for_size(_Config) ->
-    %% Real world values
-    Shrink = fun(Term) -> truncate:term(Term, {1, {1000, 100, 50, 5}}) end,
-    TestSize = fun(Term) ->
-                       true = 5000000 < size(term_to_binary(Term)),
-                       true = 500000 > size(term_to_binary(Shrink(Term)))
-               end,
-    TestSize(lists:seq(1, 5000000)),
-    TestSize(recursive_list(1000, 10)),
-    TestSize(recursive_list(5000, 20)),
-    TestSize(gb_sets:from_list([I || I <- lists:seq(1, 1000000)])),
-    TestSize(gb_trees:from_orddict([{I, I} || I <- lists:seq(1, 1000000)])),
-    ok.
-
-recursive_list(S, 0) -> lists:seq(1, S);
-recursive_list(S, N) -> [recursive_list(S div N, N-1) || _ <- lists:seq(1, S)].
-
-%% ---------------------------------------------------------------------------
-%% vm_memory_monitor.
-%% ---------------------------------------------------------------------------
-
-parse_line_linux(_Config) ->
-    lists:foreach(fun ({S, {K, V}}) ->
-                          {K, V} = vm_memory_monitor:parse_line_linux(S)
-                  end,
-                  [{"MemTotal:      0 kB",        {'MemTotal', 0}},
-                   {"MemTotal:      502968 kB  ", {'MemTotal', 515039232}},
-                   {"MemFree:         178232 kB", {'MemFree',  182509568}},
-                   {"MemTotal:         50296888", {'MemTotal', 50296888}},
-                   {"MemTotal         502968 kB", {'MemTotal', 515039232}},
-                   {"MemTotal     50296866   ",   {'MemTotal', 50296866}}]),
-    ok.
-
-%% ---------------------------------------------------------------------------
-%% Unordered tests (originally from rabbit_tests.erl).
-%% ---------------------------------------------------------------------------
-
-%% Test that content frames don't exceed frame-max
-content_framing(_Config) ->
-    %% no content
-    passed = test_content_framing(4096, <<>>),
-    %% easily fit in one frame
-    passed = test_content_framing(4096, <<"Easy">>),
-    %% exactly one frame (empty frame = 8 bytes)
-    passed = test_content_framing(11, <<"One">>),
-    %% more than one frame
-    passed = test_content_framing(11, <<"More than one frame">>),
-    passed.
-
-test_content_framing(FrameMax, BodyBin) ->
-    [Header | Frames] =
-        rabbit_binary_generator:build_simple_content_frames(
-          1,
-          rabbit_binary_generator:ensure_content_encoded(
-            rabbit_basic:build_content(#'P_basic'{}, BodyBin),
-            rabbit_framing_amqp_0_9_1),
-          FrameMax,
-          rabbit_framing_amqp_0_9_1),
-    %% header is formatted correctly and the size is the total of the
-    %% fragments
-    <<_FrameHeader:7/binary, _ClassAndWeight:4/binary,
-      BodySize:64/unsigned, _Rest/binary>> = list_to_binary(Header),
-    BodySize = size(BodyBin),
-    true = lists:all(
-             fun (ContentFrame) ->
-                     FrameBinary = list_to_binary(ContentFrame),
-                     %% assert
-                     <<_TypeAndChannel:3/binary,
-                       Size:32/unsigned, _Payload:Size/binary, 16#CE>> =
-                         FrameBinary,
-                     size(FrameBinary) =< FrameMax
-             end, Frames),
-    passed.
-
-content_transcoding(_Config) ->
-    %% there are no guarantees provided by 'clear' - it's just a hint
-    ClearDecoded = fun rabbit_binary_parser:clear_decoded_content/1,
-    ClearEncoded = fun rabbit_binary_generator:clear_encoded_content/1,
-    EnsureDecoded =
-        fun (C0) ->
-                C1 = rabbit_binary_parser:ensure_content_decoded(C0),
-                true = C1#content.properties =/= none,
-                C1
-        end,
-    EnsureEncoded =
-        fun (Protocol) ->
-                fun (C0) ->
-                        C1 = rabbit_binary_generator:ensure_content_encoded(
-                               C0, Protocol),
-                        true = C1#content.properties_bin =/= none,
-                        C1
-                end
-        end,
-    %% Beyond the assertions in Ensure*, the only testable guarantee
-    %% is that the operations should never fail.
-    %%
-    %% If we were using quickcheck we'd simply stuff all the above
-    %% into a generator for sequences of operations. In the absence of
-    %% quickcheck we pick particularly interesting sequences that:
-    %%
-    %% - execute every op twice since they are idempotent
-    %% - invoke clear_decoded, clear_encoded, decode and transcode
-    %%   with one or both of decoded and encoded content present
-    [begin
-         sequence_with_content([Op]),
-         sequence_with_content([ClearEncoded, Op]),
-         sequence_with_content([ClearDecoded, Op])
-     end || Op <- [ClearDecoded, ClearEncoded, EnsureDecoded,
-                   EnsureEncoded(rabbit_framing_amqp_0_9_1),
-                   EnsureEncoded(rabbit_framing_amqp_0_8)]],
-    passed.
-
-sequence_with_content(Sequence) ->
-    lists:foldl(fun (F, V) -> F(F(V)) end,
-                rabbit_binary_generator:ensure_content_encoded(
-                  rabbit_basic:build_content(#'P_basic'{}, <<>>),
-                  rabbit_framing_amqp_0_9_1),
-                Sequence).
-
-pmerge(_Config) ->
-    P = [{a, 1}, {b, 2}],
-    P = rabbit_misc:pmerge(a, 3, P),
-    [{c, 3} | P] = rabbit_misc:pmerge(c, 3, P),
-    passed.
-
-plmerge(_Config) ->
-    P1 = [{a, 1}, {b, 2}, {c, 3}],
-    P2 = [{a, 2}, {d, 4}],
-    [{a, 1}, {b, 2}, {c, 3}, {d, 4}] = rabbit_misc:plmerge(P1, P2),
-    passed.
-
-table_codec(_Config) ->
-    %% FIXME this does not test inexact numbers (double and float) yet,
-    %% because they won't pass the equality assertions
-    Table = [{<<"longstr">>,   longstr,   <<"Here is a long string">>},
-             {<<"signedint">>, signedint, 12345},
-             {<<"decimal">>,   decimal,   {3, 123456}},
-             {<<"timestamp">>, timestamp, 109876543209876},
-             {<<"table">>,     table,     [{<<"one">>, signedint, 54321},
-                                           {<<"two">>, longstr,
-                                            <<"A long string">>}]},
-             {<<"byte">>,      byte,      -128},
-             {<<"long">>,      long,      1234567890},
-             {<<"short">>,     short,     655},
-             {<<"bool">>,      bool,      true},
-             {<<"binary">>,    binary,    <<"a binary string">>},
-             {<<"unsignedbyte">>, unsignedbyte, 250},
-             {<<"unsignedshort">>, unsignedshort, 65530},
-             {<<"unsignedint">>, unsignedint, 4294967290},
-             {<<"void">>,      void,      undefined},
-             {<<"array">>,     array,     [{signedint, 54321},
-                                           {longstr, <<"A long string">>}]}
-            ],
-    Binary = <<
-               7,"longstr",   "S", 21:32, "Here is a long string",
-               9,"signedint", "I", 12345:32/signed,
-               7,"decimal",   "D", 3, 123456:32,
-               9,"timestamp", "T", 109876543209876:64,
-               5,"table",     "F", 31:32, % length of table
-               3,"one",       "I", 54321:32,
-               3,"two",       "S", 13:32, "A long string",
-               4,"byte",      "b", -128:8/signed,
-               4,"long",      "l", 1234567890:64,
-               5,"short",     "s", 655:16,
-               4,"bool",      "t", 1,
-               6,"binary",    "x", 15:32, "a binary string",
-               12,"unsignedbyte", "B", 250:8/unsigned,
-               13,"unsignedshort", "u", 65530:16/unsigned,
-               11,"unsignedint", "i", 4294967290:32/unsigned,
-               4,"void",      "V",
-               5,"array",     "A", 23:32,
-               "I", 54321:32,
-               "S", 13:32, "A long string"
-             >>,
-    Binary = rabbit_binary_generator:generate_table(Table),
-    Table  = rabbit_binary_parser:parse_table(Binary),
-    passed.
-
-unfold(_Config) ->
-    {[], test} = rabbit_misc:unfold(fun (_V) -> false end, test),
-    List = lists:seq(2,20,2),
-    {List, 0} = rabbit_misc:unfold(fun (0) -> false;
-                                       (N) -> {true, N*2, N-1}
-                                   end, 10),
-    passed.
-
-version_equivalance(_Config) ->
-    true = rabbit_misc:version_minor_equivalent("3.0.0", "3.0.0"),
-    true = rabbit_misc:version_minor_equivalent("3.0.0", "3.0.1"),
-    true = rabbit_misc:version_minor_equivalent("%%VSN%%", "%%VSN%%"),
-    false = rabbit_misc:version_minor_equivalent("3.0.0", "3.1.0"),
-    false = rabbit_misc:version_minor_equivalent("3.0.0", "3.0"),
-    false = rabbit_misc:version_minor_equivalent("3.0.0", "3.0.0.1"),
-    false = rabbit_misc:version_minor_equivalent("3.0.0", "3.0.foo"),
-    passed.
diff --git a/rabbitmq-server/test/unit_inbroker_SUITE.erl b/rabbitmq-server/test/unit_inbroker_SUITE.erl
deleted file mode 100644 (file)
index e9ecbf5..0000000
+++ /dev/null
@@ -1,3824 +0,0 @@
-%% The contents of this file are subject to the Mozilla Public License
-%% Version 1.1 (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.mozilla.org/MPL/
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-%% License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% The Original Code is RabbitMQ.
-%%
-%% The Initial Developer of the Original Code is GoPivotal, Inc.
-%% Copyright (c) 2011-2016 Pivotal Software, Inc.  All rights reserved.
-%%
-
--module(unit_inbroker_SUITE).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("kernel/include/file.hrl").
--include_lib("amqp_client/include/amqp_client.hrl").
-
--compile(export_all).
-
--define(PERSISTENT_MSG_STORE, msg_store_persistent).
--define(TRANSIENT_MSG_STORE,  msg_store_transient).
-
--define(TIMEOUT_LIST_OPS_PASS, 5000).
--define(TIMEOUT, 30000).
-
--define(CLEANUP_QUEUE_NAME, <<"cleanup-queue">>).
-
--define(VARIABLE_QUEUE_TESTCASES, [
-    variable_queue_dynamic_duration_change,
-    variable_queue_partial_segments_delta_thing,
-    variable_queue_all_the_bits_not_covered_elsewhere_A,
-    variable_queue_all_the_bits_not_covered_elsewhere_B,
-    variable_queue_drop,
-    variable_queue_fold_msg_on_disk,
-    variable_queue_dropfetchwhile,
-    variable_queue_dropwhile_varying_ram_duration,
-    variable_queue_fetchwhile_varying_ram_duration,
-    variable_queue_ack_limiting,
-    variable_queue_purge,
-    variable_queue_requeue,
-    variable_queue_requeue_ram_beta,
-    variable_queue_fold,
-    variable_queue_batch_publish,
-    variable_queue_batch_publish_delivered
-  ]).
-
--define(BACKING_QUEUE_TESTCASES, [
-    bq_queue_index,
-    bq_queue_index_props,
-    {variable_queue_default, [], ?VARIABLE_QUEUE_TESTCASES},
-    {variable_queue_lazy, [], ?VARIABLE_QUEUE_TESTCASES ++
-                              [variable_queue_mode_change]},
-    bq_variable_queue_delete_msg_store_files_callback,
-    bq_queue_recover
-  ]).
-
--define(CLUSTER_TESTCASES, [
-    delegates_async,
-    delegates_sync,
-    queue_cleanup,
-    declare_on_dead_queue,
-    refresh_events
-  ]).
-
-all() ->
-    [
-      {group, parallel_tests},
-      {group, non_parallel_tests},
-      {group, backing_queue_tests},
-      {group, cluster_tests},
-
-      {group, disconnect_detected_during_alarm},
-      {group, list_consumers_sanity_check},
-      {group, list_queues_online_and_offline}
-    ].
-
-groups() ->
-    [
-      {parallel_tests, [parallel], [
-          amqp_connection_refusal,
-          configurable_server_properties,
-          confirms,
-          credit_flow_settings,
-          dynamic_mirroring,
-          gen_server2_with_state,
-          list_operations_timeout_pass,
-          mcall,
-          {password_hashing, [], [
-              password_hashing,
-              change_password
-            ]},
-          {policy_validation, [parallel, {repeat, 20}], [
-              ha_policy_validation,
-              policy_validation,
-              policy_opts_validation,
-              queue_master_location_policy_validation,
-              queue_modes_policy_validation,
-              vhost_removed_while_updating_policy
-            ]},
-          runtime_parameters,
-          set_disk_free_limit_command,
-          topic_matching,
-          user_management
-        ]},
-      {non_parallel_tests, [], [
-          app_management, %% Restart RabbitMQ.
-          channel_statistics, %% Expect specific statistics.
-          disk_monitor, %% Replace rabbit_misc module.
-          file_handle_cache, %% Change FHC limit.
-          head_message_timestamp_statistics, %% Expect specific statistics.
-          log_management, %% Check log files.
-          log_management_during_startup, %% Check log files.
-          memory_high_watermark, %% Trigger alarm.
-          rotate_logs_without_suffix, %% Check log files.
-          server_status %% Trigger alarm.
-        ]},
-      {backing_queue_tests, [], [
-          msg_store,
-          {backing_queue_embed_limit_0, [], ?BACKING_QUEUE_TESTCASES},
-          {backing_queue_embed_limit_1024, [], ?BACKING_QUEUE_TESTCASES}
-        ]},
-      {cluster_tests, [], [
-          {from_cluster_node1, [], ?CLUSTER_TESTCASES},
-          {from_cluster_node2, [], ?CLUSTER_TESTCASES}
-        ]},
-
-      %% Test previously executed with the multi-node target.
-      {disconnect_detected_during_alarm, [], [
-          disconnect_detected_during_alarm %% Trigger alarm.
-        ]},
-      {list_consumers_sanity_check, [], [
-          list_consumers_sanity_check
-        ]},
-      {list_queues_online_and_offline, [], [
-          list_queues_online_and_offline %% Stop node B.
-        ]}
-    ].
-
-group(backing_queue_tests) ->
-    [
-      %% Several tests based on lazy queues may take more than 30 minutes.
-      {timetrap, {hours, 1}}
-    ];
-group(_) ->
-    [].
-
-%% -------------------------------------------------------------------
-%% Testsuite setup/teardown.
-%% -------------------------------------------------------------------
-
-init_per_suite(Config) ->
-    rabbit_ct_helpers:log_environment(),
-    rabbit_ct_helpers:run_setup_steps(Config).
-
-end_per_suite(Config) ->
-    rabbit_ct_helpers:run_teardown_steps(Config).
-
-init_per_group(Group, Config) ->
-    case lists:member({group, Group}, all()) of
-        true ->
-            ClusterSize = case Group of
-                disconnect_detected_during_alarm -> 1;
-                list_consumers_sanity_check      -> 1;
-                _                                -> 2
-            end,
-            Config1 = rabbit_ct_helpers:set_config(Config, [
-                {rmq_nodename_suffix, Group},
-                {rmq_nodes_count, ClusterSize}
-              ]),
-            rabbit_ct_helpers:run_steps(Config1,
-              rabbit_ct_broker_helpers:setup_steps() ++
-              rabbit_ct_client_helpers:setup_steps() ++ [
-                fun(C) -> init_per_group1(Group, C) end,
-                fun setup_file_handle_cache/1
-              ]);
-        false ->
-            rabbit_ct_helpers:run_steps(Config, [
-                fun(C) -> init_per_group1(Group, C) end
-              ])
-    end.
-
-init_per_group1(backing_queue_tests, Config) ->
-    Module = rabbit_ct_broker_helpers:rpc(Config, 0,
-      application, get_env, [rabbit, backing_queue_module]),
-    case Module of
-        {ok, rabbit_priority_queue} ->
-            rabbit_ct_broker_helpers:rpc(Config, 0,
-              ?MODULE, setup_backing_queue_test_group, [Config]);
-        _ ->
-            {skip, rabbit_misc:format(
-               "Backing queue module not supported by this test group: ~p~n",
-               [Module])}
-    end;
-init_per_group1(backing_queue_embed_limit_0, Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      application, set_env, [rabbit, queue_index_embed_msgs_below, 0]),
-    Config;
-init_per_group1(backing_queue_embed_limit_1024, Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      application, set_env, [rabbit, queue_index_embed_msgs_below, 1024]),
-    Config;
-init_per_group1(variable_queue_default, Config) ->
-    rabbit_ct_helpers:set_config(Config, {variable_queue_type, default});
-init_per_group1(variable_queue_lazy, Config) ->
-    rabbit_ct_helpers:set_config(Config, {variable_queue_type, lazy});
-init_per_group1(from_cluster_node1, Config) ->
-    rabbit_ct_helpers:set_config(Config, {test_direction, {0, 1}});
-init_per_group1(from_cluster_node2, Config) ->
-    rabbit_ct_helpers:set_config(Config, {test_direction, {1, 0}});
-init_per_group1(_, Config) ->
-    Config.
-
-setup_file_handle_cache(Config) ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, setup_file_handle_cache1, []),
-    Config.
-
-setup_file_handle_cache1() ->
-    %% FIXME: Why are we doing this?
-    application:set_env(rabbit, file_handles_high_watermark, 10),
-    ok = file_handle_cache:set_limit(10),
-    ok.
-
-end_per_group(Group, Config) ->
-    case lists:member({group, Group}, all()) of
-        true ->
-            rabbit_ct_helpers:run_steps(Config,
-              [fun(C) -> end_per_group1(Group, C) end] ++
-              rabbit_ct_client_helpers:teardown_steps() ++
-              rabbit_ct_broker_helpers:teardown_steps());
-        false ->
-            Config
-    end.
-
-end_per_group1(backing_queue_tests, Config) ->
-    rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, teardown_backing_queue_test_group, [Config]);
-end_per_group1(Group, Config)
-when   Group =:= backing_queue_embed_limit_0
-orelse Group =:= backing_queue_embed_limit_1024 ->
-    ok = rabbit_ct_broker_helpers:rpc(Config, 0,
-      application, set_env, [rabbit, queue_index_embed_msgs_below,
-        ?config(rmq_queue_index_embed_msgs_below, Config)]),
-    Config;
-end_per_group1(_, Config) ->
-    Config.
-
-init_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_started(Config, Testcase).
-
-end_per_testcase(Testcase, Config) ->
-    rabbit_ct_helpers:testcase_finished(Config, Testcase).
-
-%% -------------------------------------------------------------------
-%% Application management.
-%% -------------------------------------------------------------------
-
-app_management(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, app_management1, [Config]).
-
-app_management1(_Config) ->
-    control_action(wait, [os:getenv("RABBITMQ_PID_FILE")]),
-    %% Starting, stopping and diagnostics.  Note that we don't try
-    %% 'report' when the rabbit app is stopped and that we enable
-    %% tracing for the duration of this function.
-    ok = control_action(trace_on, []),
-    ok = control_action(stop_app, []),
-    ok = control_action(stop_app, []),
-    ok = control_action(status, []),
-    ok = control_action(cluster_status, []),
-    ok = control_action(environment, []),
-    ok = control_action(start_app, []),
-    ok = control_action(start_app, []),
-    ok = control_action(status, []),
-    ok = control_action(report, []),
-    ok = control_action(cluster_status, []),
-    ok = control_action(environment, []),
-    ok = control_action(trace_off, []),
-    passed.
-
-%% -------------------------------------------------------------------
-%% Message store.
-%% -------------------------------------------------------------------
-
-msg_store(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, msg_store1, [Config]).
-
-msg_store1(_Config) ->
-    restart_msg_store_empty(),
-    MsgIds = [msg_id_bin(M) || M <- lists:seq(1,100)],
-    {MsgIds1stHalf, MsgIds2ndHalf} = lists:split(length(MsgIds) div 2, MsgIds),
-    Ref = rabbit_guid:gen(),
-    {Cap, MSCState} = msg_store_client_init_capture(
-                        ?PERSISTENT_MSG_STORE, Ref),
-    Ref2 = rabbit_guid:gen(),
-    {Cap2, MSC2State} = msg_store_client_init_capture(
-                          ?PERSISTENT_MSG_STORE, Ref2),
-    %% check we don't contain any of the msgs we're about to publish
-    false = msg_store_contains(false, MsgIds, MSCState),
-    %% test confirm logic
-    passed = test_msg_store_confirms([hd(MsgIds)], Cap, MSCState),
-    %% check we don't contain any of the msgs we're about to publish
-    false = msg_store_contains(false, MsgIds, MSCState),
-    %% publish the first half
-    ok = msg_store_write(MsgIds1stHalf, MSCState),
-    %% sync on the first half
-    ok = on_disk_await(Cap, MsgIds1stHalf),
-    %% publish the second half
-    ok = msg_store_write(MsgIds2ndHalf, MSCState),
-    %% check they're all in there
-    true = msg_store_contains(true, MsgIds, MSCState),
-    %% publish the latter half twice so we hit the caching and ref
-    %% count code. We need to do this through a 2nd client since a
-    %% single client is not supposed to write the same message more
-    %% than once without first removing it.
-    ok = msg_store_write(MsgIds2ndHalf, MSC2State),
-    %% check they're still all in there
-    true = msg_store_contains(true, MsgIds, MSCState),
-    %% sync on the 2nd half
-    ok = on_disk_await(Cap2, MsgIds2ndHalf),
-    %% cleanup
-    ok = on_disk_stop(Cap2),
-    ok = rabbit_msg_store:client_delete_and_terminate(MSC2State),
-    ok = on_disk_stop(Cap),
-    %% read them all
-    MSCState1 = msg_store_read(MsgIds, MSCState),
-    %% read them all again - this will hit the cache, not disk
-    MSCState2 = msg_store_read(MsgIds, MSCState1),
-    %% remove them all
-    ok = msg_store_remove(MsgIds, MSCState2),
-    %% check first half doesn't exist
-    false = msg_store_contains(false, MsgIds1stHalf, MSCState2),
-    %% check second half does exist
-    true = msg_store_contains(true, MsgIds2ndHalf, MSCState2),
-    %% read the second half again
-    MSCState3 = msg_store_read(MsgIds2ndHalf, MSCState2),
-    %% read the second half again, just for fun (aka code coverage)
-    MSCState4 = msg_store_read(MsgIds2ndHalf, MSCState3),
-    ok = rabbit_msg_store:client_terminate(MSCState4),
-    %% stop and restart, preserving every other msg in 2nd half
-    ok = rabbit_variable_queue:stop_msg_store(),
-    ok = rabbit_variable_queue:start_msg_store(
-           [], {fun ([]) -> finished;
-                    ([MsgId|MsgIdsTail])
-                      when length(MsgIdsTail) rem 2 == 0 ->
-                        {MsgId, 1, MsgIdsTail};
-                    ([MsgId|MsgIdsTail]) ->
-                        {MsgId, 0, MsgIdsTail}
-                end, MsgIds2ndHalf}),
-    MSCState5 = msg_store_client_init(?PERSISTENT_MSG_STORE, Ref),
-    %% check we have the right msgs left
-    lists:foldl(
-      fun (MsgId, Bool) ->
-              not(Bool = rabbit_msg_store:contains(MsgId, MSCState5))
-      end, false, MsgIds2ndHalf),
-    ok = rabbit_msg_store:client_terminate(MSCState5),
-    %% restart empty
-    restart_msg_store_empty(),
-    MSCState6 = msg_store_client_init(?PERSISTENT_MSG_STORE, Ref),
-    %% check we don't contain any of the msgs
-    false = msg_store_contains(false, MsgIds, MSCState6),
-    %% publish the first half again
-    ok = msg_store_write(MsgIds1stHalf, MSCState6),
-    %% this should force some sort of sync internally otherwise misread
-    ok = rabbit_msg_store:client_terminate(
-           msg_store_read(MsgIds1stHalf, MSCState6)),
-    MSCState7 = msg_store_client_init(?PERSISTENT_MSG_STORE, Ref),
-    ok = msg_store_remove(MsgIds1stHalf, MSCState7),
-    ok = rabbit_msg_store:client_terminate(MSCState7),
-    %% restart empty
-    restart_msg_store_empty(), %% now safe to reuse msg_ids
-    %% push a lot of msgs in... at least 100 files worth
-    {ok, FileSize} = application:get_env(rabbit, msg_store_file_size_limit),
-    PayloadSizeBits = 65536,
-    BigCount = trunc(100 * FileSize / (PayloadSizeBits div 8)),
-    MsgIdsBig = [msg_id_bin(X) || X <- lists:seq(1, BigCount)],
-    Payload = << 0:PayloadSizeBits >>,
-    ok = with_msg_store_client(
-           ?PERSISTENT_MSG_STORE, Ref,
-           fun (MSCStateM) ->
-                   [ok = rabbit_msg_store:write(MsgId, Payload, MSCStateM) ||
-                       MsgId <- MsgIdsBig],
-                   MSCStateM
-           end),
-    %% now read them to ensure we hit the fast client-side reading
-    ok = foreach_with_msg_store_client(
-           ?PERSISTENT_MSG_STORE, Ref,
-           fun (MsgId, MSCStateM) ->
-                   {{ok, Payload}, MSCStateN} = rabbit_msg_store:read(
-                                                  MsgId, MSCStateM),
-                   MSCStateN
-           end, MsgIdsBig),
-    %% .., then 3s by 1...
-    ok = msg_store_remove(?PERSISTENT_MSG_STORE, Ref,
-                          [msg_id_bin(X) || X <- lists:seq(BigCount, 1, -3)]),
-    %% .., then remove 3s by 2, from the young end first. This hits
-    %% GC (under 50% good data left, but no empty files. Must GC).
-    ok = msg_store_remove(?PERSISTENT_MSG_STORE, Ref,
-                          [msg_id_bin(X) || X <- lists:seq(BigCount-1, 1, -3)]),
-    %% .., then remove 3s by 3, from the young end first. This hits
-    %% GC...
-    ok = msg_store_remove(?PERSISTENT_MSG_STORE, Ref,
-                          [msg_id_bin(X) || X <- lists:seq(BigCount-2, 1, -3)]),
-    %% ensure empty
-    ok = with_msg_store_client(
-           ?PERSISTENT_MSG_STORE, Ref,
-           fun (MSCStateM) ->
-                   false = msg_store_contains(false, MsgIdsBig, MSCStateM),
-                   MSCStateM
-           end),
-    %%
-    passed = test_msg_store_client_delete_and_terminate(),
-    %% restart empty
-    restart_msg_store_empty(),
-    passed.
-
-restart_msg_store_empty() ->
-    ok = rabbit_variable_queue:stop_msg_store(),
-    ok = rabbit_variable_queue:start_msg_store(
-           undefined, {fun (ok) -> finished end, ok}).
-
-msg_id_bin(X) ->
-    erlang:md5(term_to_binary(X)).
-
-on_disk_capture() ->
-    receive
-        {await, MsgIds, Pid} -> on_disk_capture([], MsgIds, Pid);
-        stop                 -> done
-    end.
-
-on_disk_capture([_|_], _Awaiting, Pid) ->
-    Pid ! {self(), surplus};
-on_disk_capture(OnDisk, Awaiting, Pid) ->
-    receive
-        {on_disk, MsgIdsS} ->
-            MsgIds = gb_sets:to_list(MsgIdsS),
-            on_disk_capture(OnDisk ++ (MsgIds -- Awaiting), Awaiting -- MsgIds,
-                            Pid);
-        stop ->
-            done
-    after (case Awaiting of [] -> 200; _ -> ?TIMEOUT end) ->
-            case Awaiting of
-                [] -> Pid ! {self(), arrived}, on_disk_capture();
-                _  -> Pid ! {self(), timeout}
-            end
-    end.
-
-on_disk_await(Pid, MsgIds) when is_list(MsgIds) ->
-    Pid ! {await, MsgIds, self()},
-    receive
-        {Pid, arrived} -> ok;
-        {Pid, Error}   -> Error
-    end.
-
-on_disk_stop(Pid) ->
-    MRef = erlang:monitor(process, Pid),
-    Pid ! stop,
-    receive {'DOWN', MRef, process, Pid, _Reason} ->
-            ok
-    end.
-
-msg_store_client_init_capture(MsgStore, Ref) ->
-    Pid = spawn(fun on_disk_capture/0),
-    {Pid, rabbit_msg_store:client_init(
-            MsgStore, Ref, fun (MsgIds, _ActionTaken) ->
-                                   Pid ! {on_disk, MsgIds}
-                           end, undefined)}.
-
-msg_store_contains(Atom, MsgIds, MSCState) ->
-    Atom = lists:foldl(
-             fun (MsgId, Atom1) when Atom1 =:= Atom ->
-                     rabbit_msg_store:contains(MsgId, MSCState) end,
-             Atom, MsgIds).
-
-msg_store_read(MsgIds, MSCState) ->
-    lists:foldl(fun (MsgId, MSCStateM) ->
-                        {{ok, MsgId}, MSCStateN} = rabbit_msg_store:read(
-                                                     MsgId, MSCStateM),
-                        MSCStateN
-                end, MSCState, MsgIds).
-
-msg_store_write(MsgIds, MSCState) ->
-    ok = lists:foldl(fun (MsgId, ok) ->
-                             rabbit_msg_store:write(MsgId, MsgId, MSCState)
-                     end, ok, MsgIds).
-
-msg_store_write_flow(MsgIds, MSCState) ->
-    ok = lists:foldl(fun (MsgId, ok) ->
-                             rabbit_msg_store:write_flow(MsgId, MsgId, MSCState)
-                     end, ok, MsgIds).
-
-msg_store_remove(MsgIds, MSCState) ->
-    rabbit_msg_store:remove(MsgIds, MSCState).
-
-msg_store_remove(MsgStore, Ref, MsgIds) ->
-    with_msg_store_client(MsgStore, Ref,
-                          fun (MSCStateM) ->
-                                  ok = msg_store_remove(MsgIds, MSCStateM),
-                                  MSCStateM
-                          end).
-
-with_msg_store_client(MsgStore, Ref, Fun) ->
-    rabbit_msg_store:client_terminate(
-      Fun(msg_store_client_init(MsgStore, Ref))).
-
-foreach_with_msg_store_client(MsgStore, Ref, Fun, L) ->
-    rabbit_msg_store:client_terminate(
-      lists:foldl(fun (MsgId, MSCState) -> Fun(MsgId, MSCState) end,
-                  msg_store_client_init(MsgStore, Ref), L)).
-
-test_msg_store_confirms(MsgIds, Cap, MSCState) ->
-    %% write -> confirmed
-    ok = msg_store_write(MsgIds, MSCState),
-    ok = on_disk_await(Cap, MsgIds),
-    %% remove -> _
-    ok = msg_store_remove(MsgIds, MSCState),
-    ok = on_disk_await(Cap, []),
-    %% write, remove -> confirmed
-    ok = msg_store_write(MsgIds, MSCState),
-    ok = msg_store_remove(MsgIds, MSCState),
-    ok = on_disk_await(Cap, MsgIds),
-    %% write, remove, write -> confirmed, confirmed
-    ok = msg_store_write(MsgIds, MSCState),
-    ok = msg_store_remove(MsgIds, MSCState),
-    ok = msg_store_write(MsgIds, MSCState),
-    ok = on_disk_await(Cap, MsgIds ++ MsgIds),
-    %% remove, write -> confirmed
-    ok = msg_store_remove(MsgIds, MSCState),
-    ok = msg_store_write(MsgIds, MSCState),
-    ok = on_disk_await(Cap, MsgIds),
-    %% remove, write, remove -> confirmed
-    ok = msg_store_remove(MsgIds, MSCState),
-    ok = msg_store_write(MsgIds, MSCState),
-    ok = msg_store_remove(MsgIds, MSCState),
-    ok = on_disk_await(Cap, MsgIds),
-    %% confirmation on timer-based sync
-    passed = test_msg_store_confirm_timer(),
-    passed.
-
-test_msg_store_confirm_timer() ->
-    Ref = rabbit_guid:gen(),
-    MsgId  = msg_id_bin(1),
-    Self = self(),
-    MSCState = rabbit_msg_store:client_init(
-                 ?PERSISTENT_MSG_STORE, Ref,
-                 fun (MsgIds, _ActionTaken) ->
-                         case gb_sets:is_member(MsgId, MsgIds) of
-                             true  -> Self ! on_disk;
-                             false -> ok
-                         end
-                 end, undefined),
-    ok = msg_store_write([MsgId], MSCState),
-    ok = msg_store_keep_busy_until_confirm([msg_id_bin(2)], MSCState, false),
-    ok = msg_store_remove([MsgId], MSCState),
-    ok = rabbit_msg_store:client_delete_and_terminate(MSCState),
-    passed.
-
-msg_store_keep_busy_until_confirm(MsgIds, MSCState, Blocked) ->
-    After = case Blocked of
-                false -> 0;
-                true  -> ?MAX_WAIT
-            end,
-    Recurse = fun () -> msg_store_keep_busy_until_confirm(
-                          MsgIds, MSCState, credit_flow:blocked()) end,
-    receive
-        on_disk            -> ok;
-        {bump_credit, Msg} -> credit_flow:handle_bump_msg(Msg),
-                              Recurse()
-    after After ->
-            ok = msg_store_write_flow(MsgIds, MSCState),
-            ok = msg_store_remove(MsgIds, MSCState),
-            Recurse()
-    end.
-
-test_msg_store_client_delete_and_terminate() ->
-    restart_msg_store_empty(),
-    MsgIds = [msg_id_bin(M) || M <- lists:seq(1, 10)],
-    Ref = rabbit_guid:gen(),
-    MSCState = msg_store_client_init(?PERSISTENT_MSG_STORE, Ref),
-    ok = msg_store_write(MsgIds, MSCState),
-    %% test the 'dying client' fast path for writes
-    ok = rabbit_msg_store:client_delete_and_terminate(MSCState),
-    passed.
-
-%% -------------------------------------------------------------------
-%% Backing queue.
-%% -------------------------------------------------------------------
-
-setup_backing_queue_test_group(Config) ->
-    {ok, FileSizeLimit} =
-        application:get_env(rabbit, msg_store_file_size_limit),
-    application:set_env(rabbit, msg_store_file_size_limit, 512),
-    {ok, MaxJournal} =
-        application:get_env(rabbit, queue_index_max_journal_entries),
-    application:set_env(rabbit, queue_index_max_journal_entries, 128),
-    application:set_env(rabbit, msg_store_file_size_limit,
-                        FileSizeLimit),
-    {ok, Bytes} =
-        application:get_env(rabbit, queue_index_embed_msgs_below),
-    rabbit_ct_helpers:set_config(Config, [
-        {rmq_queue_index_max_journal_entries, MaxJournal},
-        {rmq_queue_index_embed_msgs_below, Bytes}
-      ]).
-
-teardown_backing_queue_test_group(Config) ->
-    %% FIXME: Undo all the setup function did.
-    application:set_env(rabbit, queue_index_max_journal_entries,
-                        ?config(rmq_queue_index_max_journal_entries, Config)),
-    %% We will have restarted the message store, and thus changed
-    %% the order of the children of rabbit_sup. This will cause
-    %% problems if there are subsequent failures - see bug 24262.
-    ok = restart_app(),
-    Config.
-
-bq_queue_index(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, bq_queue_index1, [Config]).
-
-bq_queue_index1(_Config) ->
-    SegmentSize = rabbit_queue_index:next_segment_boundary(0),
-    TwoSegs = SegmentSize + SegmentSize,
-    MostOfASegment = trunc(SegmentSize*0.75),
-    SeqIdsA = lists:seq(0, MostOfASegment-1),
-    SeqIdsB = lists:seq(MostOfASegment, 2*MostOfASegment),
-    SeqIdsC = lists:seq(0, trunc(SegmentSize/2)),
-    SeqIdsD = lists:seq(0, SegmentSize*4),
-
-    with_empty_test_queue(
-      fun (Qi0) ->
-              {0, 0, Qi1} = rabbit_queue_index:bounds(Qi0),
-              {Qi2, SeqIdsMsgIdsA} = queue_index_publish(SeqIdsA, false, Qi1),
-              {0, SegmentSize, Qi3} = rabbit_queue_index:bounds(Qi2),
-              {ReadA, Qi4} = rabbit_queue_index:read(0, SegmentSize, Qi3),
-              ok = verify_read_with_published(false, false, ReadA,
-                                              lists:reverse(SeqIdsMsgIdsA)),
-              %% should get length back as 0, as all the msgs were transient
-              {0, 0, Qi6} = restart_test_queue(Qi4),
-              {0, 0, Qi7} = rabbit_queue_index:bounds(Qi6),
-              {Qi8, SeqIdsMsgIdsB} = queue_index_publish(SeqIdsB, true, Qi7),
-              {0, TwoSegs, Qi9} = rabbit_queue_index:bounds(Qi8),
-              {ReadB, Qi10} = rabbit_queue_index:read(0, SegmentSize, Qi9),
-              ok = verify_read_with_published(false, true, ReadB,
-                                              lists:reverse(SeqIdsMsgIdsB)),
-              %% should get length back as MostOfASegment
-              LenB = length(SeqIdsB),
-              BytesB = LenB * 10,
-              {LenB, BytesB, Qi12} = restart_test_queue(Qi10),
-              {0, TwoSegs, Qi13} = rabbit_queue_index:bounds(Qi12),
-              Qi14 = rabbit_queue_index:deliver(SeqIdsB, Qi13),
-              {ReadC, Qi15} = rabbit_queue_index:read(0, SegmentSize, Qi14),
-              ok = verify_read_with_published(true, true, ReadC,
-                                              lists:reverse(SeqIdsMsgIdsB)),
-              Qi16 = rabbit_queue_index:ack(SeqIdsB, Qi15),
-              Qi17 = rabbit_queue_index:flush(Qi16),
-              %% Everything will have gone now because #pubs == #acks
-              {0, 0, Qi18} = rabbit_queue_index:bounds(Qi17),
-              %% should get length back as 0 because all persistent
-              %% msgs have been acked
-              {0, 0, Qi19} = restart_test_queue(Qi18),
-              Qi19
-      end),
-
-    %% These next bits are just to hit the auto deletion of segment files.
-    %% First, partials:
-    %% a) partial pub+del+ack, then move to new segment
-    with_empty_test_queue(
-      fun (Qi0) ->
-              {Qi1, _SeqIdsMsgIdsC} = queue_index_publish(SeqIdsC,
-                                                          false, Qi0),
-              Qi2 = rabbit_queue_index:deliver(SeqIdsC, Qi1),
-              Qi3 = rabbit_queue_index:ack(SeqIdsC, Qi2),
-              Qi4 = rabbit_queue_index:flush(Qi3),
-              {Qi5, _SeqIdsMsgIdsC1} = queue_index_publish([SegmentSize],
-                                                           false, Qi4),
-              Qi5
-      end),
-
-    %% b) partial pub+del, then move to new segment, then ack all in old segment
-    with_empty_test_queue(
-      fun (Qi0) ->
-              {Qi1, _SeqIdsMsgIdsC2} = queue_index_publish(SeqIdsC,
-                                                           false, Qi0),
-              Qi2 = rabbit_queue_index:deliver(SeqIdsC, Qi1),
-              {Qi3, _SeqIdsMsgIdsC3} = queue_index_publish([SegmentSize],
-                                                           false, Qi2),
-              Qi4 = rabbit_queue_index:ack(SeqIdsC, Qi3),
-              rabbit_queue_index:flush(Qi4)
-      end),
-
-    %% c) just fill up several segments of all pubs, then +dels, then +acks
-    with_empty_test_queue(
-      fun (Qi0) ->
-              {Qi1, _SeqIdsMsgIdsD} = queue_index_publish(SeqIdsD,
-                                                          false, Qi0),
-              Qi2 = rabbit_queue_index:deliver(SeqIdsD, Qi1),
-              Qi3 = rabbit_queue_index:ack(SeqIdsD, Qi2),
-              rabbit_queue_index:flush(Qi3)
-      end),
-
-    %% d) get messages in all states to a segment, then flush, then do
-    %% the same again, don't flush and read. This will hit all
-    %% possibilities in combining the segment with the journal.
-    with_empty_test_queue(
-      fun (Qi0) ->
-              {Qi1, [Seven,Five,Four|_]} = queue_index_publish([0,1,2,4,5,7],
-                                                               false, Qi0),
-              Qi2 = rabbit_queue_index:deliver([0,1,4], Qi1),
-              Qi3 = rabbit_queue_index:ack([0], Qi2),
-              Qi4 = rabbit_queue_index:flush(Qi3),
-              {Qi5, [Eight,Six|_]} = queue_index_publish([3,6,8], false, Qi4),
-              Qi6 = rabbit_queue_index:deliver([2,3,5,6], Qi5),
-              Qi7 = rabbit_queue_index:ack([1,2,3], Qi6),
-              {[], Qi8} = rabbit_queue_index:read(0, 4, Qi7),
-              {ReadD, Qi9} = rabbit_queue_index:read(4, 7, Qi8),
-              ok = verify_read_with_published(true, false, ReadD,
-                                              [Four, Five, Six]),
-              {ReadE, Qi10} = rabbit_queue_index:read(7, 9, Qi9),
-              ok = verify_read_with_published(false, false, ReadE,
-                                              [Seven, Eight]),
-              Qi10
-      end),
-
-    %% e) as for (d), but use terminate instead of read, which will
-    %% exercise journal_minus_segment, not segment_plus_journal.
-    with_empty_test_queue(
-      fun (Qi0) ->
-              {Qi1, _SeqIdsMsgIdsE} = queue_index_publish([0,1,2,4,5,7],
-                                                          true, Qi0),
-              Qi2 = rabbit_queue_index:deliver([0,1,4], Qi1),
-              Qi3 = rabbit_queue_index:ack([0], Qi2),
-              {5, 50, Qi4} = restart_test_queue(Qi3),
-              {Qi5, _SeqIdsMsgIdsF} = queue_index_publish([3,6,8], true, Qi4),
-              Qi6 = rabbit_queue_index:deliver([2,3,5,6], Qi5),
-              Qi7 = rabbit_queue_index:ack([1,2,3], Qi6),
-              {5, 50, Qi8} = restart_test_queue(Qi7),
-              Qi8
-      end),
-
-    ok = rabbit_variable_queue:stop(),
-    {ok, _} = rabbit_variable_queue:start([]),
-
-    passed.
-
-bq_queue_index_props(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, bq_queue_index_props1, [Config]).
-
-bq_queue_index_props1(_Config) ->
-    with_empty_test_queue(
-      fun(Qi0) ->
-              MsgId = rabbit_guid:gen(),
-              Props = #message_properties{expiry=12345, size = 10},
-              Qi1 = rabbit_queue_index:publish(
-                      MsgId, 1, Props, true, infinity, Qi0),
-              {[{MsgId, 1, Props, _, _}], Qi2} =
-                  rabbit_queue_index:read(1, 2, Qi1),
-              Qi2
-      end),
-
-    ok = rabbit_variable_queue:stop(),
-    {ok, _} = rabbit_variable_queue:start([]),
-
-    passed.
-
-bq_variable_queue_delete_msg_store_files_callback(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, bq_variable_queue_delete_msg_store_files_callback1, [Config]).
-
-bq_variable_queue_delete_msg_store_files_callback1(Config) ->
-    ok = restart_msg_store_empty(),
-    {new, #amqqueue { pid = QPid, name = QName } = Q} =
-      rabbit_amqqueue:declare(
-        queue_name(Config,
-          <<"bq_variable_queue_delete_msg_store_files_callback-q">>),
-        true, false, [], none),
-    Payload = <<0:8388608>>, %% 1MB
-    Count = 30,
-    publish_and_confirm(Q, Payload, Count),
-
-    rabbit_amqqueue:set_ram_duration_target(QPid, 0),
-
-    {ok, Limiter} = rabbit_limiter:start_link(no_id),
-
-    CountMinusOne = Count - 1,
-    {ok, CountMinusOne, {QName, QPid, _AckTag, false, _Msg}} =
-        rabbit_amqqueue:basic_get(Q, self(), true, Limiter),
-    {ok, CountMinusOne} = rabbit_amqqueue:purge(Q),
-
-    %% give the queue a second to receive the close_fds callback msg
-    timer:sleep(1000),
-
-    rabbit_amqqueue:delete(Q, false, false),
-    passed.
-
-bq_queue_recover(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, bq_queue_recover1, [Config]).
-
-bq_queue_recover1(Config) ->
-    Count = 2 * rabbit_queue_index:next_segment_boundary(0),
-    {new, #amqqueue { pid = QPid, name = QName } = Q} =
-        rabbit_amqqueue:declare(queue_name(Config, <<"bq_queue_recover-q">>),
-                                true, false, [], none),
-    publish_and_confirm(Q, <<>>, Count),
-
-    SupPid = rabbit_ct_broker_helpers:get_queue_sup_pid(QPid),
-    true = is_pid(SupPid),
-    exit(SupPid, kill),
-    exit(QPid, kill),
-    MRef = erlang:monitor(process, QPid),
-    receive {'DOWN', MRef, process, QPid, _Info} -> ok
-    after 10000 -> exit(timeout_waiting_for_queue_death)
-    end,
-    rabbit_amqqueue:stop(),
-    rabbit_amqqueue:start(rabbit_amqqueue:recover()),
-    {ok, Limiter} = rabbit_limiter:start_link(no_id),
-    rabbit_amqqueue:with_or_die(
-      QName,
-      fun (Q1 = #amqqueue { pid = QPid1 }) ->
-              CountMinusOne = Count - 1,
-              {ok, CountMinusOne, {QName, QPid1, _AckTag, true, _Msg}} =
-                  rabbit_amqqueue:basic_get(Q1, self(), false, Limiter),
-              exit(QPid1, shutdown),
-              VQ1 = variable_queue_init(Q, true),
-              {{_Msg1, true, _AckTag1}, VQ2} =
-                  rabbit_variable_queue:fetch(true, VQ1),
-              CountMinusOne = rabbit_variable_queue:len(VQ2),
-              _VQ3 = rabbit_variable_queue:delete_and_terminate(shutdown, VQ2),
-              ok = rabbit_amqqueue:internal_delete(QName)
-      end),
-    passed.
-
-variable_queue_dynamic_duration_change(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_dynamic_duration_change1, [Config]).
-
-variable_queue_dynamic_duration_change1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_dynamic_duration_change2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_dynamic_duration_change2(VQ0) ->
-    SegmentSize = rabbit_queue_index:next_segment_boundary(0),
-
-    %% start by sending in a couple of segments worth
-    Len = 2*SegmentSize,
-    VQ1 = variable_queue_publish(false, Len, VQ0),
-    %% squeeze and relax queue
-    Churn = Len div 32,
-    VQ2 = publish_fetch_and_ack(Churn, Len, VQ1),
-
-    {Duration, VQ3} = rabbit_variable_queue:ram_duration(VQ2),
-    VQ7 = lists:foldl(
-            fun (Duration1, VQ4) ->
-                    {_Duration, VQ5} = rabbit_variable_queue:ram_duration(VQ4),
-                    VQ6 = variable_queue_set_ram_duration_target(
-                            Duration1, VQ5),
-                    publish_fetch_and_ack(Churn, Len, VQ6)
-            end, VQ3, [Duration / 4, 0, Duration / 4, infinity]),
-
-    %% drain
-    {VQ8, AckTags} = variable_queue_fetch(Len, false, false, Len, VQ7),
-    {_Guids, VQ9} = rabbit_variable_queue:ack(AckTags, VQ8),
-    {empty, VQ10} = rabbit_variable_queue:fetch(true, VQ9),
-
-    VQ10.
-
-variable_queue_partial_segments_delta_thing(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_partial_segments_delta_thing1, [Config]).
-
-variable_queue_partial_segments_delta_thing1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_partial_segments_delta_thing2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_partial_segments_delta_thing2(VQ0) ->
-    SegmentSize = rabbit_queue_index:next_segment_boundary(0),
-    HalfSegment = SegmentSize div 2,
-    OneAndAHalfSegment = SegmentSize + HalfSegment,
-    VQ1 = variable_queue_publish(true, OneAndAHalfSegment, VQ0),
-    {_Duration, VQ2} = rabbit_variable_queue:ram_duration(VQ1),
-    VQ3 = check_variable_queue_status(
-            variable_queue_set_ram_duration_target(0, VQ2),
-            %% one segment in q3, and half a segment in delta
-            [{delta, {delta, SegmentSize, HalfSegment, OneAndAHalfSegment}},
-             {q3, SegmentSize},
-             {len, SegmentSize + HalfSegment}]),
-    VQ4 = variable_queue_set_ram_duration_target(infinity, VQ3),
-    VQ5 = check_variable_queue_status(
-            variable_queue_publish(true, 1, VQ4),
-            %% one alpha, but it's in the same segment as the deltas
-            [{q1, 1},
-             {delta, {delta, SegmentSize, HalfSegment, OneAndAHalfSegment}},
-             {q3, SegmentSize},
-             {len, SegmentSize + HalfSegment + 1}]),
-    {VQ6, AckTags} = variable_queue_fetch(SegmentSize, true, false,
-                                          SegmentSize + HalfSegment + 1, VQ5),
-    VQ7 = check_variable_queue_status(
-            VQ6,
-            %% the half segment should now be in q3
-            [{q1, 1},
-             {delta, {delta, undefined, 0, undefined}},
-             {q3, HalfSegment},
-             {len, HalfSegment + 1}]),
-    {VQ8, AckTags1} = variable_queue_fetch(HalfSegment + 1, true, false,
-                                           HalfSegment + 1, VQ7),
-    {_Guids, VQ9} = rabbit_variable_queue:ack(AckTags ++ AckTags1, VQ8),
-    %% should be empty now
-    {empty, VQ10} = rabbit_variable_queue:fetch(true, VQ9),
-    VQ10.
-
-variable_queue_all_the_bits_not_covered_elsewhere_A(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_all_the_bits_not_covered_elsewhere_A1, [Config]).
-
-variable_queue_all_the_bits_not_covered_elsewhere_A1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_all_the_bits_not_covered_elsewhere_A2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_all_the_bits_not_covered_elsewhere_A2(VQ0) ->
-    Count = 2 * rabbit_queue_index:next_segment_boundary(0),
-    VQ1 = variable_queue_publish(true, Count, VQ0),
-    VQ2 = variable_queue_publish(false, Count, VQ1),
-    VQ3 = variable_queue_set_ram_duration_target(0, VQ2),
-    {VQ4, _AckTags}  = variable_queue_fetch(Count, true, false,
-                                            Count + Count, VQ3),
-    {VQ5, _AckTags1} = variable_queue_fetch(Count, false, false,
-                                            Count, VQ4),
-    _VQ6 = rabbit_variable_queue:terminate(shutdown, VQ5),
-    VQ7 = variable_queue_init(test_amqqueue(true), true),
-    {{_Msg1, true, _AckTag1}, VQ8} = rabbit_variable_queue:fetch(true, VQ7),
-    Count1 = rabbit_variable_queue:len(VQ8),
-    VQ9 = variable_queue_publish(false, 1, VQ8),
-    VQ10 = variable_queue_set_ram_duration_target(0, VQ9),
-    {VQ11, _AckTags2} = variable_queue_fetch(Count1, true, true, Count, VQ10),
-    {VQ12, _AckTags3} = variable_queue_fetch(1, false, false, 1, VQ11),
-    VQ12.
-
-variable_queue_all_the_bits_not_covered_elsewhere_B(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_all_the_bits_not_covered_elsewhere_B1, [Config]).
-
-variable_queue_all_the_bits_not_covered_elsewhere_B1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_all_the_bits_not_covered_elsewhere_B2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_all_the_bits_not_covered_elsewhere_B2(VQ0) ->
-    VQ1 = variable_queue_set_ram_duration_target(0, VQ0),
-    VQ2 = variable_queue_publish(false, 4, VQ1),
-    {VQ3, AckTags} = variable_queue_fetch(2, false, false, 4, VQ2),
-    {_Guids, VQ4} =
-        rabbit_variable_queue:requeue(AckTags, VQ3),
-    VQ5 = rabbit_variable_queue:timeout(VQ4),
-    _VQ6 = rabbit_variable_queue:terminate(shutdown, VQ5),
-    VQ7 = variable_queue_init(test_amqqueue(true), true),
-    {empty, VQ8} = rabbit_variable_queue:fetch(false, VQ7),
-    VQ8.
-
-variable_queue_drop(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_drop1, [Config]).
-
-variable_queue_drop1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_drop2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_drop2(VQ0) ->
-    %% start by sending a messages
-    VQ1 = variable_queue_publish(false, 1, VQ0),
-    %% drop message with AckRequired = true
-    {{MsgId, AckTag}, VQ2} = rabbit_variable_queue:drop(true, VQ1),
-    true = rabbit_variable_queue:is_empty(VQ2),
-    true = AckTag =/= undefinded,
-    %% drop again -> empty
-    {empty, VQ3} = rabbit_variable_queue:drop(false, VQ2),
-    %% requeue
-    {[MsgId], VQ4} = rabbit_variable_queue:requeue([AckTag], VQ3),
-    %% drop message with AckRequired = false
-    {{MsgId, undefined}, VQ5} = rabbit_variable_queue:drop(false, VQ4),
-    true = rabbit_variable_queue:is_empty(VQ5),
-    VQ5.
-
-variable_queue_fold_msg_on_disk(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_fold_msg_on_disk1, [Config]).
-
-variable_queue_fold_msg_on_disk1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_fold_msg_on_disk2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_fold_msg_on_disk2(VQ0) ->
-    VQ1 = variable_queue_publish(true, 1, VQ0),
-    {VQ2, AckTags} = variable_queue_fetch(1, true, false, 1, VQ1),
-    {ok, VQ3} = rabbit_variable_queue:ackfold(fun (_M, _A, ok) -> ok end,
-                                              ok, VQ2, AckTags),
-    VQ3.
-
-variable_queue_dropfetchwhile(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_dropfetchwhile1, [Config]).
-
-variable_queue_dropfetchwhile1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_dropfetchwhile2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_dropfetchwhile2(VQ0) ->
-    Count = 10,
-
-    %% add messages with sequential expiry
-    VQ1 = variable_queue_publish(
-            false, 1, Count,
-            fun (N, Props) -> Props#message_properties{expiry = N} end,
-            fun erlang:term_to_binary/1, VQ0),
-
-    %% fetch the first 5 messages
-    {#message_properties{expiry = 6}, {Msgs, AckTags}, VQ2} =
-        rabbit_variable_queue:fetchwhile(
-          fun (#message_properties{expiry = Expiry}) -> Expiry =< 5 end,
-          fun (Msg, AckTag, {MsgAcc, AckAcc}) ->
-                  {[Msg | MsgAcc], [AckTag | AckAcc]}
-          end, {[], []}, VQ1),
-    true = lists:seq(1, 5) == [msg2int(M) || M <- lists:reverse(Msgs)],
-
-    %% requeue them
-    {_MsgIds, VQ3} = rabbit_variable_queue:requeue(AckTags, VQ2),
-
-    %% drop the first 5 messages
-    {#message_properties{expiry = 6}, VQ4} =
-        rabbit_variable_queue:dropwhile(
-          fun (#message_properties {expiry = Expiry}) -> Expiry =< 5 end, VQ3),
-
-    %% fetch 5
-    VQ5 = lists:foldl(fun (N, VQN) ->
-                              {{Msg, _, _}, VQM} =
-                                  rabbit_variable_queue:fetch(false, VQN),
-                              true = msg2int(Msg) == N,
-                              VQM
-                      end, VQ4, lists:seq(6, Count)),
-
-    %% should be empty now
-    true = rabbit_variable_queue:is_empty(VQ5),
-
-    VQ5.
-
-variable_queue_dropwhile_varying_ram_duration(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_dropwhile_varying_ram_duration1, [Config]).
-
-variable_queue_dropwhile_varying_ram_duration1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_dropwhile_varying_ram_duration2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_dropwhile_varying_ram_duration2(VQ0) ->
-    test_dropfetchwhile_varying_ram_duration(
-      fun (VQ1) ->
-              {_, VQ2} = rabbit_variable_queue:dropwhile(
-                           fun (_) -> false end, VQ1),
-              VQ2
-      end, VQ0).
-
-variable_queue_fetchwhile_varying_ram_duration(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_fetchwhile_varying_ram_duration1, [Config]).
-
-variable_queue_fetchwhile_varying_ram_duration1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_fetchwhile_varying_ram_duration2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_fetchwhile_varying_ram_duration2(VQ0) ->
-    test_dropfetchwhile_varying_ram_duration(
-      fun (VQ1) ->
-              {_, ok, VQ2} = rabbit_variable_queue:fetchwhile(
-                               fun (_) -> false end,
-                               fun (_, _, A) -> A end,
-                               ok, VQ1),
-              VQ2
-      end, VQ0).
-
-test_dropfetchwhile_varying_ram_duration(Fun, VQ0) ->
-    VQ1 = variable_queue_publish(false, 1, VQ0),
-    VQ2 = variable_queue_set_ram_duration_target(0, VQ1),
-    VQ3 = Fun(VQ2),
-    VQ4 = variable_queue_set_ram_duration_target(infinity, VQ3),
-    VQ5 = variable_queue_publish(false, 1, VQ4),
-    VQ6 = Fun(VQ5),
-    VQ6.
-
-variable_queue_ack_limiting(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_ack_limiting1, [Config]).
-
-variable_queue_ack_limiting1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_ack_limiting2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_ack_limiting2(VQ0) ->
-    %% start by sending in a bunch of messages
-    Len = 1024,
-    VQ1 = variable_queue_publish(false, Len, VQ0),
-
-    %% squeeze and relax queue
-    Churn = Len div 32,
-    VQ2 = publish_fetch_and_ack(Churn, Len, VQ1),
-
-    %% update stats for duration
-    {_Duration, VQ3} = rabbit_variable_queue:ram_duration(VQ2),
-
-    %% fetch half the messages
-    {VQ4, _AckTags} = variable_queue_fetch(Len div 2, false, false, Len, VQ3),
-
-    VQ5 = check_variable_queue_status(
-            VQ4, [{len,                         Len div 2},
-                  {messages_unacknowledged_ram, Len div 2},
-                  {messages_ready_ram,          Len div 2},
-                  {messages_ram,                Len}]),
-
-    %% ensure all acks go to disk on 0 duration target
-    VQ6 = check_variable_queue_status(
-            variable_queue_set_ram_duration_target(0, VQ5),
-            [{len,                         Len div 2},
-             {target_ram_count,            0},
-             {messages_unacknowledged_ram, 0},
-             {messages_ready_ram,          0},
-             {messages_ram,                0}]),
-
-    VQ6.
-
-variable_queue_purge(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_purge1, [Config]).
-
-variable_queue_purge1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_purge2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_purge2(VQ0) ->
-    LenDepth = fun (VQ) ->
-                       {rabbit_variable_queue:len(VQ),
-                        rabbit_variable_queue:depth(VQ)}
-               end,
-    VQ1         = variable_queue_publish(false, 10, VQ0),
-    {VQ2, Acks} = variable_queue_fetch(6, false, false, 10, VQ1),
-    {4, VQ3}    = rabbit_variable_queue:purge(VQ2),
-    {0, 6}      = LenDepth(VQ3),
-    {_, VQ4}    = rabbit_variable_queue:requeue(lists:sublist(Acks, 2), VQ3),
-    {2, 6}      = LenDepth(VQ4),
-    VQ5         = rabbit_variable_queue:purge_acks(VQ4),
-    {2, 2}      = LenDepth(VQ5),
-    VQ5.
-
-variable_queue_requeue(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_requeue1, [Config]).
-
-variable_queue_requeue1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_requeue2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_requeue2(VQ0) ->
-    {_PendingMsgs, RequeuedMsgs, FreshMsgs, VQ1} =
-        variable_queue_with_holes(VQ0),
-    Msgs =
-        lists:zip(RequeuedMsgs,
-                  lists:duplicate(length(RequeuedMsgs), true)) ++
-        lists:zip(FreshMsgs,
-                  lists:duplicate(length(FreshMsgs), false)),
-    VQ2 = lists:foldl(fun ({I, Requeued}, VQa) ->
-                              {{M, MRequeued, _}, VQb} =
-                                  rabbit_variable_queue:fetch(true, VQa),
-                              Requeued = MRequeued, %% assertion
-                              I = msg2int(M),       %% assertion
-                              VQb
-                      end, VQ1, Msgs),
-    {empty, VQ3} = rabbit_variable_queue:fetch(true, VQ2),
-    VQ3.
-
-%% requeue from ram_pending_ack into q3, move to delta and then empty queue
-variable_queue_requeue_ram_beta(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_requeue_ram_beta1, [Config]).
-
-variable_queue_requeue_ram_beta1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_requeue_ram_beta2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_requeue_ram_beta2(VQ0) ->
-    Count = rabbit_queue_index:next_segment_boundary(0)*2 + 2,
-    VQ1 = variable_queue_publish(false, Count, VQ0),
-    {VQ2, AcksR} = variable_queue_fetch(Count, false, false, Count, VQ1),
-    {Back, Front} = lists:split(Count div 2, AcksR),
-    {_, VQ3} = rabbit_variable_queue:requeue(erlang:tl(Back), VQ2),
-    VQ4 = variable_queue_set_ram_duration_target(0, VQ3),
-    {_, VQ5} = rabbit_variable_queue:requeue([erlang:hd(Back)], VQ4),
-    VQ6 = requeue_one_by_one(Front, VQ5),
-    {VQ7, AcksAll} = variable_queue_fetch(Count, false, true, Count, VQ6),
-    {_, VQ8} = rabbit_variable_queue:ack(AcksAll, VQ7),
-    VQ8.
-
-variable_queue_fold(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_fold1, [Config]).
-
-variable_queue_fold1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_fold2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_fold2(VQ0) ->
-    {PendingMsgs, RequeuedMsgs, FreshMsgs, VQ1} =
-        variable_queue_with_holes(VQ0),
-    Count = rabbit_variable_queue:depth(VQ1),
-    Msgs = lists:sort(PendingMsgs ++ RequeuedMsgs ++ FreshMsgs),
-    lists:foldl(fun (Cut, VQ2) ->
-                        test_variable_queue_fold(Cut, Msgs, PendingMsgs, VQ2)
-                end, VQ1, [0, 1, 2, Count div 2,
-                           Count - 1, Count, Count + 1, Count * 2]).
-
-test_variable_queue_fold(Cut, Msgs, PendingMsgs, VQ0) ->
-    {Acc, VQ1} = rabbit_variable_queue:fold(
-                   fun (M, _, Pending, A) ->
-                           MInt = msg2int(M),
-                           Pending = lists:member(MInt, PendingMsgs), %% assert
-                           case MInt =< Cut of
-                               true  -> {cont, [MInt | A]};
-                               false -> {stop, A}
-                           end
-                   end, [], VQ0),
-    Expected = lists:takewhile(fun (I) -> I =< Cut end, Msgs),
-    Expected = lists:reverse(Acc), %% assertion
-    VQ1.
-
-variable_queue_batch_publish(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_batch_publish1, [Config]).
-
-variable_queue_batch_publish1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_batch_publish2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_batch_publish2(VQ) ->
-    Count = 10,
-    VQ1 = variable_queue_batch_publish(true, Count, VQ),
-    Count = rabbit_variable_queue:len(VQ1),
-    VQ1.
-
-variable_queue_batch_publish_delivered(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_batch_publish_delivered1, [Config]).
-
-variable_queue_batch_publish_delivered1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_batch_publish_delivered2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_batch_publish_delivered2(VQ) ->
-    Count = 10,
-    VQ1 = variable_queue_batch_publish_delivered(true, Count, VQ),
-    Count = rabbit_variable_queue:depth(VQ1),
-    VQ1.
-
-%% same as test_variable_queue_requeue_ram_beta but randomly changing
-%% the queue mode after every step.
-variable_queue_mode_change(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, variable_queue_mode_change1, [Config]).
-
-variable_queue_mode_change1(Config) ->
-    with_fresh_variable_queue(
-      fun variable_queue_mode_change2/1,
-      ?config(variable_queue_type, Config)).
-
-variable_queue_mode_change2(VQ0) ->
-    Count = rabbit_queue_index:next_segment_boundary(0)*2 + 2,
-    VQ1 = variable_queue_publish(false, Count, VQ0),
-    VQ2 = maybe_switch_queue_mode(VQ1),
-    {VQ3, AcksR} = variable_queue_fetch(Count, false, false, Count, VQ2),
-    VQ4 = maybe_switch_queue_mode(VQ3),
-    {Back, Front} = lists:split(Count div 2, AcksR),
-    {_, VQ5} = rabbit_variable_queue:requeue(erlang:tl(Back), VQ4),
-    VQ6 = maybe_switch_queue_mode(VQ5),
-    VQ7 = variable_queue_set_ram_duration_target(0, VQ6),
-    VQ8 = maybe_switch_queue_mode(VQ7),
-    {_, VQ9} = rabbit_variable_queue:requeue([erlang:hd(Back)], VQ8),
-    VQ10 = maybe_switch_queue_mode(VQ9),
-    VQ11 = requeue_one_by_one(Front, VQ10),
-    VQ12 = maybe_switch_queue_mode(VQ11),
-    {VQ13, AcksAll} = variable_queue_fetch(Count, false, true, Count, VQ12),
-    VQ14 = maybe_switch_queue_mode(VQ13),
-    {_, VQ15} = rabbit_variable_queue:ack(AcksAll, VQ14),
-    VQ16 = maybe_switch_queue_mode(VQ15),
-    VQ16.
-
-maybe_switch_queue_mode(VQ) ->
-    Mode = random_queue_mode(),
-    set_queue_mode(Mode, VQ).
-
-random_queue_mode() ->
-    Modes = [lazy, default],
-    lists:nth(rand_compat:uniform(length(Modes)), Modes).
-
-pub_res({_, VQS}) ->
-    VQS;
-pub_res(VQS) ->
-    VQS.
-
-make_publish(IsPersistent, PayloadFun, PropFun, N) ->
-    {rabbit_basic:message(
-       rabbit_misc:r(<<>>, exchange, <<>>),
-       <<>>, #'P_basic'{delivery_mode = case IsPersistent of
-                                            true  -> 2;
-                                            false -> 1
-                                        end},
-       PayloadFun(N)),
-     PropFun(N, #message_properties{size = 10}),
-     false}.
-
-make_publish_delivered(IsPersistent, PayloadFun, PropFun, N) ->
-    {rabbit_basic:message(
-       rabbit_misc:r(<<>>, exchange, <<>>),
-       <<>>, #'P_basic'{delivery_mode = case IsPersistent of
-                                            true  -> 2;
-                                            false -> 1
-                                        end},
-       PayloadFun(N)),
-     PropFun(N, #message_properties{size = 10})}.
-
-queue_name(Config, Name) ->
-    Name1 = rabbit_ct_helpers:config_to_testcase_name(Config, Name),
-    queue_name(Name1).
-
-queue_name(Name) ->
-    rabbit_misc:r(<<"/">>, queue, Name).
-
-test_queue() ->
-    queue_name(<<"test">>).
-
-init_test_queue() ->
-    TestQueue = test_queue(),
-    PRef = rabbit_guid:gen(),
-    PersistentClient = msg_store_client_init(?PERSISTENT_MSG_STORE, PRef),
-    Res = rabbit_queue_index:recover(
-            TestQueue, [], false,
-            fun (MsgId) ->
-                    rabbit_msg_store:contains(MsgId, PersistentClient)
-            end,
-            fun nop/1, fun nop/1),
-    ok = rabbit_msg_store:client_delete_and_terminate(PersistentClient),
-    Res.
-
-restart_test_queue(Qi) ->
-    _ = rabbit_queue_index:terminate([], Qi),
-    ok = rabbit_variable_queue:stop(),
-    {ok, _} = rabbit_variable_queue:start([test_queue()]),
-    init_test_queue().
-
-empty_test_queue() ->
-    ok = rabbit_variable_queue:stop(),
-    {ok, _} = rabbit_variable_queue:start([]),
-    {0, 0, Qi} = init_test_queue(),
-    _ = rabbit_queue_index:delete_and_terminate(Qi),
-    ok.
-
-with_empty_test_queue(Fun) ->
-    ok = empty_test_queue(),
-    {0, 0, Qi} = init_test_queue(),
-    rabbit_queue_index:delete_and_terminate(Fun(Qi)).
-
-restart_app() ->
-    rabbit:stop(),
-    rabbit:start().
-
-queue_index_publish(SeqIds, Persistent, Qi) ->
-    Ref = rabbit_guid:gen(),
-    MsgStore = case Persistent of
-                   true  -> ?PERSISTENT_MSG_STORE;
-                   false -> ?TRANSIENT_MSG_STORE
-               end,
-    MSCState = msg_store_client_init(MsgStore, Ref),
-    {A, B = [{_SeqId, LastMsgIdWritten} | _]} =
-        lists:foldl(
-          fun (SeqId, {QiN, SeqIdsMsgIdsAcc}) ->
-                  MsgId = rabbit_guid:gen(),
-                  QiM = rabbit_queue_index:publish(
-                          MsgId, SeqId, #message_properties{size = 10},
-                          Persistent, infinity, QiN),
-                  ok = rabbit_msg_store:write(MsgId, MsgId, MSCState),
-                  {QiM, [{SeqId, MsgId} | SeqIdsMsgIdsAcc]}
-          end, {Qi, []}, SeqIds),
-    %% do this just to force all of the publishes through to the msg_store:
-    true = rabbit_msg_store:contains(LastMsgIdWritten, MSCState),
-    ok = rabbit_msg_store:client_delete_and_terminate(MSCState),
-    {A, B}.
-
-verify_read_with_published(_Delivered, _Persistent, [], _) ->
-    ok;
-verify_read_with_published(Delivered, Persistent,
-                           [{MsgId, SeqId, _Props, Persistent, Delivered}|Read],
-                           [{SeqId, MsgId}|Published]) ->
-    verify_read_with_published(Delivered, Persistent, Read, Published);
-verify_read_with_published(_Delivered, _Persistent, _Read, _Published) ->
-    ko.
-
-nop(_) -> ok.
-nop(_, _) -> ok.
-
-msg_store_client_init(MsgStore, Ref) ->
-    rabbit_msg_store:client_init(MsgStore, Ref, undefined, undefined).
-
-variable_queue_init(Q, Recover) ->
-    rabbit_variable_queue:init(
-      Q, case Recover of
-             true  -> non_clean_shutdown;
-             false -> new
-         end, fun nop/2, fun nop/2, fun nop/1, fun nop/1).
-
-publish_and_confirm(Q, Payload, Count) ->
-    Seqs = lists:seq(1, Count),
-    [begin
-         Msg = rabbit_basic:message(rabbit_misc:r(<<>>, exchange, <<>>),
-                                    <<>>, #'P_basic'{delivery_mode = 2},
-                                    Payload),
-         Delivery = #delivery{mandatory = false, sender = self(),
-                              confirm = true, message = Msg, msg_seq_no = Seq,
-                              flow = noflow},
-         _QPids = rabbit_amqqueue:deliver([Q], Delivery)
-     end || Seq <- Seqs],
-    wait_for_confirms(gb_sets:from_list(Seqs)).
-
-wait_for_confirms(Unconfirmed) ->
-    case gb_sets:is_empty(Unconfirmed) of
-        true  -> ok;
-        false -> receive {'$gen_cast', {confirm, Confirmed, _}} ->
-                         wait_for_confirms(
-                           rabbit_misc:gb_sets_difference(
-                             Unconfirmed, gb_sets:from_list(Confirmed)))
-                 after ?TIMEOUT -> exit(timeout_waiting_for_confirm)
-                 end
-    end.
-
-with_fresh_variable_queue(Fun, Mode) ->
-    Ref = make_ref(),
-    Me = self(),
-    %% Run in a separate process since rabbit_msg_store will send
-    %% bump_credit messages and we want to ignore them
-    spawn_link(fun() ->
-                       ok = empty_test_queue(),
-                       VQ = variable_queue_init(test_amqqueue(true), false),
-                       S0 = variable_queue_status(VQ),
-                       assert_props(S0, [{q1, 0}, {q2, 0},
-                                         {delta,
-                                          {delta, undefined, 0, undefined}},
-                                         {q3, 0}, {q4, 0},
-                                         {len, 0}]),
-                       VQ1 = set_queue_mode(Mode, VQ),
-                       try
-                           _ = rabbit_variable_queue:delete_and_terminate(
-                                 shutdown, Fun(VQ1)),
-                           Me ! Ref
-                       catch
-                           Type:Error ->
-                               Me ! {Ref, Type, Error, erlang:get_stacktrace()}
-                       end
-               end),
-    receive
-        Ref                    -> ok;
-        {Ref, Type, Error, ST} -> exit({Type, Error, ST})
-    end,
-    passed.
-
-set_queue_mode(Mode, VQ) ->
-    VQ1 = rabbit_variable_queue:set_queue_mode(Mode, VQ),
-    S1 = variable_queue_status(VQ1),
-    assert_props(S1, [{mode, Mode}]),
-    VQ1.
-
-variable_queue_publish(IsPersistent, Count, VQ) ->
-    variable_queue_publish(IsPersistent, Count, fun (_N, P) -> P end, VQ).
-
-variable_queue_publish(IsPersistent, Count, PropFun, VQ) ->
-    variable_queue_publish(IsPersistent, 1, Count, PropFun,
-                           fun (_N) -> <<>> end, VQ).
-
-variable_queue_publish(IsPersistent, Start, Count, PropFun, PayloadFun, VQ) ->
-    variable_queue_wait_for_shuffling_end(
-      lists:foldl(
-        fun (N, VQN) ->
-                rabbit_variable_queue:publish(
-                  rabbit_basic:message(
-                    rabbit_misc:r(<<>>, exchange, <<>>),
-                    <<>>, #'P_basic'{delivery_mode = case IsPersistent of
-                                                         true  -> 2;
-                                                         false -> 1
-                                                     end},
-                    PayloadFun(N)),
-                  PropFun(N, #message_properties{size = 10}),
-                  false, self(), noflow, VQN)
-        end, VQ, lists:seq(Start, Start + Count - 1))).
-
-variable_queue_batch_publish(IsPersistent, Count, VQ) ->
-    variable_queue_batch_publish(IsPersistent, Count, fun (_N, P) -> P end, VQ).
-
-variable_queue_batch_publish(IsPersistent, Count, PropFun, VQ) ->
-    variable_queue_batch_publish(IsPersistent, 1, Count, PropFun,
-                                 fun (_N) -> <<>> end, VQ).
-
-variable_queue_batch_publish(IsPersistent, Start, Count, PropFun, PayloadFun, VQ) ->
-    variable_queue_batch_publish0(IsPersistent, Start, Count, PropFun,
-                                  PayloadFun, fun make_publish/4,
-                                  fun rabbit_variable_queue:batch_publish/4,
-                                  VQ).
-
-variable_queue_batch_publish_delivered(IsPersistent, Count, VQ) ->
-    variable_queue_batch_publish_delivered(IsPersistent, Count, fun (_N, P) -> P end, VQ).
-
-variable_queue_batch_publish_delivered(IsPersistent, Count, PropFun, VQ) ->
-    variable_queue_batch_publish_delivered(IsPersistent, 1, Count, PropFun,
-                                           fun (_N) -> <<>> end, VQ).
-
-variable_queue_batch_publish_delivered(IsPersistent, Start, Count, PropFun, PayloadFun, VQ) ->
-    variable_queue_batch_publish0(IsPersistent, Start, Count, PropFun,
-                                  PayloadFun, fun make_publish_delivered/4,
-                                  fun rabbit_variable_queue:batch_publish_delivered/4,
-                                  VQ).
-
-variable_queue_batch_publish0(IsPersistent, Start, Count, PropFun, PayloadFun,
-                              MakePubFun, PubFun, VQ) ->
-    Publishes =
-        [MakePubFun(IsPersistent, PayloadFun, PropFun, N)
-         || N <- lists:seq(Start, Start + Count - 1)],
-    Res = PubFun(Publishes, self(), noflow, VQ),
-    VQ1 = pub_res(Res),
-    variable_queue_wait_for_shuffling_end(VQ1).
-
-variable_queue_fetch(Count, IsPersistent, IsDelivered, Len, VQ) ->
-    lists:foldl(fun (N, {VQN, AckTagsAcc}) ->
-                        Rem = Len - N,
-                        {{#basic_message { is_persistent = IsPersistent },
-                          IsDelivered, AckTagN}, VQM} =
-                            rabbit_variable_queue:fetch(true, VQN),
-                        Rem = rabbit_variable_queue:len(VQM),
-                        {VQM, [AckTagN | AckTagsAcc]}
-                end, {VQ, []}, lists:seq(1, Count)).
-
-test_amqqueue(Durable) ->
-    (rabbit_amqqueue:pseudo_queue(test_queue(), self()))
-        #amqqueue { durable = Durable }.
-
-assert_prop(List, Prop, Value) ->
-    case proplists:get_value(Prop, List)of
-        Value -> ok;
-        _     -> {exit, Prop, exp, Value, List}
-    end.
-
-assert_props(List, PropVals) ->
-    [assert_prop(List, Prop, Value) || {Prop, Value} <- PropVals].
-
-variable_queue_set_ram_duration_target(Duration, VQ) ->
-    variable_queue_wait_for_shuffling_end(
-      rabbit_variable_queue:set_ram_duration_target(Duration, VQ)).
-
-publish_fetch_and_ack(0, _Len, VQ0) ->
-    VQ0;
-publish_fetch_and_ack(N, Len, VQ0) ->
-    VQ1 = variable_queue_publish(false, 1, VQ0),
-    {{_Msg, false, AckTag}, VQ2} = rabbit_variable_queue:fetch(true, VQ1),
-    Len = rabbit_variable_queue:len(VQ2),
-    {_Guids, VQ3} = rabbit_variable_queue:ack([AckTag], VQ2),
-    publish_fetch_and_ack(N-1, Len, VQ3).
-
-variable_queue_status(VQ) ->
-    Keys = rabbit_backing_queue:info_keys() -- [backing_queue_status],
-    [{K, rabbit_variable_queue:info(K, VQ)} || K <- Keys] ++
-        rabbit_variable_queue:info(backing_queue_status, VQ).
-
-variable_queue_wait_for_shuffling_end(VQ) ->
-    case credit_flow:blocked() of
-        false -> VQ;
-        true  -> receive
-                     {bump_credit, Msg} ->
-                         credit_flow:handle_bump_msg(Msg),
-                         variable_queue_wait_for_shuffling_end(
-                           rabbit_variable_queue:resume(VQ))
-                 end
-    end.
-
-msg2int(#basic_message{content = #content{ payload_fragments_rev = P}}) ->
-    binary_to_term(list_to_binary(lists:reverse(P))).
-
-ack_subset(AckSeqs, Interval, Rem) ->
-    lists:filter(fun ({_Ack, N}) -> (N + Rem) rem Interval == 0 end, AckSeqs).
-
-requeue_one_by_one(Acks, VQ) ->
-    lists:foldl(fun (AckTag, VQN) ->
-                        {_MsgId, VQM} = rabbit_variable_queue:requeue(
-                                          [AckTag], VQN),
-                        VQM
-                end, VQ, Acks).
-
-%% Create a vq with messages in q1, delta, and q3, and holes (in the
-%% form of pending acks) in the latter two.
-variable_queue_with_holes(VQ0) ->
-    Interval = 2048, %% should match vq:IO_BATCH_SIZE
-    Count = rabbit_queue_index:next_segment_boundary(0)*2 + 2 * Interval,
-    Seq = lists:seq(1, Count),
-    VQ1 = variable_queue_set_ram_duration_target(0, VQ0),
-    VQ2 = variable_queue_publish(
-            false, 1, Count,
-            fun (_, P) -> P end, fun erlang:term_to_binary/1, VQ1),
-    {VQ3, AcksR} = variable_queue_fetch(Count, false, false, Count, VQ2),
-    Acks = lists:reverse(AcksR),
-    AckSeqs = lists:zip(Acks, Seq),
-    [{Subset1, _Seq1}, {Subset2, _Seq2}, {Subset3, Seq3}] =
-        [lists:unzip(ack_subset(AckSeqs, Interval, I)) || I <- [0, 1, 2]],
-    %% we requeue in three phases in order to exercise requeuing logic
-    %% in various vq states
-    {_MsgIds, VQ4} = rabbit_variable_queue:requeue(
-                       Acks -- (Subset1 ++ Subset2 ++ Subset3), VQ3),
-    VQ5 = requeue_one_by_one(Subset1, VQ4),
-    %% by now we have some messages (and holes) in delta
-    VQ6 = requeue_one_by_one(Subset2, VQ5),
-    VQ7 = variable_queue_set_ram_duration_target(infinity, VQ6),
-    %% add the q1 tail
-    VQ8 = variable_queue_publish(
-            true, Count + 1, Interval,
-            fun (_, P) -> P end, fun erlang:term_to_binary/1, VQ7),
-    %% assertions
-    Status = variable_queue_status(VQ8),
-    vq_with_holes_assertions(VQ8, proplists:get_value(mode, Status)),
-    Depth = Count + Interval,
-    Depth = rabbit_variable_queue:depth(VQ8),
-    Len = Depth - length(Subset3),
-    Len = rabbit_variable_queue:len(VQ8),
-    {Seq3, Seq -- Seq3, lists:seq(Count + 1, Count + Interval), VQ8}.
-
-vq_with_holes_assertions(VQ, default) ->
-    [false =
-         case V of
-             {delta, _, 0, _} -> true;
-             0                -> true;
-             _                -> false
-         end || {K, V} <- variable_queue_status(VQ),
-                lists:member(K, [q1, delta, q3])];
-vq_with_holes_assertions(VQ, lazy) ->
-    [false =
-         case V of
-             {delta, _, 0, _} -> true;
-             _                -> false
-         end || {K, V} <- variable_queue_status(VQ),
-                lists:member(K, [delta])].
-
-check_variable_queue_status(VQ0, Props) ->
-    VQ1 = variable_queue_wait_for_shuffling_end(VQ0),
-    S = variable_queue_status(VQ1),
-    assert_props(S, Props),
-    VQ1.
-
-%% ---------------------------------------------------------------------------
-%% Credit flow.
-%% ---------------------------------------------------------------------------
-
-credit_flow_settings(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, credit_flow_settings1, [Config]).
-
-credit_flow_settings1(_Config) ->
-    %% default values
-    passed = test_proc(200, 50),
-
-    application:set_env(rabbit, credit_flow_default_credit, {100, 20}),
-    passed = test_proc(100, 20),
-
-    application:unset_env(rabbit, credit_flow_default_credit),
-
-    % back to defaults
-    passed = test_proc(200, 50),
-    passed.
-
-test_proc(InitialCredit, MoreCreditAfter) ->
-    Pid = spawn(fun dummy/0),
-    Pid ! {credit, self()},
-    {InitialCredit, MoreCreditAfter} =
-        receive
-            {credit, Val} -> Val
-        end,
-    passed.
-
-dummy() ->
-    credit_flow:send(self()),
-    receive
-        {credit, From} ->
-            From ! {credit, get(credit_flow_default_credit)};
-        _      ->
-            dummy()
-    end.
-
-%% -------------------------------------------------------------------
-%% dynamic_mirroring.
-%% -------------------------------------------------------------------
-
-dynamic_mirroring(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, dynamic_mirroring1, [Config]).
-
-dynamic_mirroring1(_Config) ->
-    %% Just unit tests of the node selection logic, see multi node
-    %% tests for the rest...
-    Test = fun ({NewM, NewSs, ExtraSs}, Policy, Params,
-                {MNode, SNodes, SSNodes}, All) ->
-                   {ok, M} = rabbit_mirror_queue_misc:module(Policy),
-                   {NewM, NewSs0} = M:suggested_queue_nodes(
-                                      Params, MNode, SNodes, SSNodes, All),
-                   NewSs1 = lists:sort(NewSs0),
-                   case dm_list_match(NewSs, NewSs1, ExtraSs) of
-                       ok    -> ok;
-                       error -> exit({no_match, NewSs, NewSs1, ExtraSs})
-                   end
-           end,
-
-    Test({a,[b,c],0},<<"all">>,'_',{a,[],   []},   [a,b,c]),
-    Test({a,[b,c],0},<<"all">>,'_',{a,[b,c],[b,c]},[a,b,c]),
-    Test({a,[b,c],0},<<"all">>,'_',{a,[d],  [d]},  [a,b,c]),
-
-    N = fun (Atoms) -> [list_to_binary(atom_to_list(A)) || A <- Atoms] end,
-
-    %% Add a node
-    Test({a,[b,c],0},<<"nodes">>,N([a,b,c]),{a,[b],[b]},[a,b,c,d]),
-    Test({b,[a,c],0},<<"nodes">>,N([a,b,c]),{b,[a],[a]},[a,b,c,d]),
-    %% Add two nodes and drop one
-    Test({a,[b,c],0},<<"nodes">>,N([a,b,c]),{a,[d],[d]},[a,b,c,d]),
-    %% Don't try to include nodes that are not running
-    Test({a,[b],  0},<<"nodes">>,N([a,b,f]),{a,[b],[b]},[a,b,c,d]),
-    %% If we can't find any of the nodes listed then just keep the master
-    Test({a,[],   0},<<"nodes">>,N([f,g,h]),{a,[b],[b]},[a,b,c,d]),
-    %% And once that's happened, still keep the master even when not listed,
-    %% if nothing is synced
-    Test({a,[b,c],0},<<"nodes">>,N([b,c]),  {a,[], []}, [a,b,c,d]),
-    Test({a,[b,c],0},<<"nodes">>,N([b,c]),  {a,[b],[]}, [a,b,c,d]),
-    %% But if something is synced we can lose the master - but make
-    %% sure we pick the new master from the nodes which are synced!
-    Test({b,[c],  0},<<"nodes">>,N([b,c]),  {a,[b],[b]},[a,b,c,d]),
-    Test({b,[c],  0},<<"nodes">>,N([c,b]),  {a,[b],[b]},[a,b,c,d]),
-
-    Test({a,[],   1},<<"exactly">>,2,{a,[],   []},   [a,b,c,d]),
-    Test({a,[],   2},<<"exactly">>,3,{a,[],   []},   [a,b,c,d]),
-    Test({a,[c],  0},<<"exactly">>,2,{a,[c],  [c]},  [a,b,c,d]),
-    Test({a,[c],  1},<<"exactly">>,3,{a,[c],  [c]},  [a,b,c,d]),
-    Test({a,[c],  0},<<"exactly">>,2,{a,[c,d],[c,d]},[a,b,c,d]),
-    Test({a,[c,d],0},<<"exactly">>,3,{a,[c,d],[c,d]},[a,b,c,d]),
-
-    passed.
-
-%% Does the first list match the second where the second is required
-%% to have exactly Extra superfluous items?
-dm_list_match([],     [],      0)     -> ok;
-dm_list_match(_,      [],     _Extra) -> error;
-dm_list_match([H|T1], [H |T2], Extra) -> dm_list_match(T1, T2, Extra);
-dm_list_match(L1,     [_H|T2], Extra) -> dm_list_match(L1, T2, Extra - 1).
-
-%% ---------------------------------------------------------------------------
-%% file_handle_cache.
-%% ---------------------------------------------------------------------------
-
-file_handle_cache(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, file_handle_cache1, [Config]).
-
-file_handle_cache1(_Config) ->
-    %% test copying when there is just one spare handle
-    Limit = file_handle_cache:get_limit(),
-    ok = file_handle_cache:set_limit(5), %% 1 or 2 sockets, 2 msg_stores
-    TmpDir = filename:join(rabbit_mnesia:dir(), "tmp"),
-    ok = filelib:ensure_dir(filename:join(TmpDir, "nothing")),
-    [Src1, Dst1, Src2, Dst2] = Files =
-        [filename:join(TmpDir, Str) || Str <- ["file1", "file2", "file3", "file4"]],
-    Content = <<"foo">>,
-    CopyFun = fun (Src, Dst) ->
-                      {ok, Hdl} = prim_file:open(Src, [binary, write]),
-                      ok = prim_file:write(Hdl, Content),
-                      ok = prim_file:sync(Hdl),
-                      prim_file:close(Hdl),
-
-                      {ok, SrcHdl} = file_handle_cache:open(Src, [read], []),
-                      {ok, DstHdl} = file_handle_cache:open(Dst, [write], []),
-                      Size = size(Content),
-                      {ok, Size} = file_handle_cache:copy(SrcHdl, DstHdl, Size),
-                      ok = file_handle_cache:delete(SrcHdl),
-                      ok = file_handle_cache:delete(DstHdl)
-              end,
-    Pid = spawn(fun () -> {ok, Hdl} = file_handle_cache:open(
-                                        filename:join(TmpDir, "file5"),
-                                        [write], []),
-                          receive {next, Pid1} -> Pid1 ! {next, self()} end,
-                          file_handle_cache:delete(Hdl),
-                          %% This will block and never return, so we
-                          %% exercise the fhc tidying up the pending
-                          %% queue on the death of a process.
-                          ok = CopyFun(Src1, Dst1)
-                end),
-    ok = CopyFun(Src1, Dst1),
-    ok = file_handle_cache:set_limit(2),
-    Pid ! {next, self()},
-    receive {next, Pid} -> ok end,
-    timer:sleep(100),
-    Pid1 = spawn(fun () -> CopyFun(Src2, Dst2) end),
-    timer:sleep(100),
-    erlang:monitor(process, Pid),
-    erlang:monitor(process, Pid1),
-    exit(Pid, kill),
-    exit(Pid1, kill),
-    receive {'DOWN', _MRef, process, Pid, _Reason} -> ok end,
-    receive {'DOWN', _MRef1, process, Pid1, _Reason1} -> ok end,
-    [file:delete(File) || File <- Files],
-    ok = file_handle_cache:set_limit(Limit),
-    passed.
-
-%% -------------------------------------------------------------------
-%% Log management.
-%% -------------------------------------------------------------------
-
-log_management(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, log_management1, [Config]).
-
-log_management1(_Config) ->
-    override_group_leader(),
-
-    MainLog = rabbit:log_location(kernel),
-    SaslLog = rabbit:log_location(sasl),
-    Suffix = ".1",
-
-    ok = test_logs_working(MainLog, SaslLog),
-
-    %% prepare basic logs
-    file:delete([MainLog, Suffix]),
-    file:delete([SaslLog, Suffix]),
-
-    %% simple logs reopening
-    ok = control_action(rotate_logs, []),
-    ok = test_logs_working(MainLog, SaslLog),
-
-    %% simple log rotation
-    ok = control_action(rotate_logs, [Suffix]),
-    [true, true] = non_empty_files([[MainLog, Suffix], [SaslLog, Suffix]]),
-    [true, true] = empty_files([MainLog, SaslLog]),
-    ok = test_logs_working(MainLog, SaslLog),
-
-    %% reopening logs with log rotation performed first
-    ok = clean_logs([MainLog, SaslLog], Suffix),
-    ok = control_action(rotate_logs, []),
-    ok = file:rename(MainLog, [MainLog, Suffix]),
-    ok = file:rename(SaslLog, [SaslLog, Suffix]),
-    ok = test_logs_working([MainLog, Suffix], [SaslLog, Suffix]),
-    ok = control_action(rotate_logs, []),
-    ok = test_logs_working(MainLog, SaslLog),
-
-    %% log rotation on empty files (the main log will have a ctl action logged)
-    ok = clean_logs([MainLog, SaslLog], Suffix),
-    ok = control_action(rotate_logs, []),
-    ok = control_action(rotate_logs, [Suffix]),
-    [false, true] = empty_files([[MainLog, Suffix], [SaslLog, Suffix]]),
-
-    %% logs with suffix are not writable
-    ok = control_action(rotate_logs, [Suffix]),
-    ok = make_files_non_writable([[MainLog, Suffix], [SaslLog, Suffix]]),
-    ok = control_action(rotate_logs, [Suffix]),
-    ok = test_logs_working(MainLog, SaslLog),
-
-    %% logging directed to tty (first, remove handlers)
-    ok = delete_log_handlers([rabbit_sasl_report_file_h,
-                              rabbit_error_logger_file_h]),
-    ok = clean_logs([MainLog, SaslLog], Suffix),
-    ok = application:set_env(rabbit, sasl_error_logger, tty),
-    ok = application:set_env(rabbit, error_logger, tty),
-    ok = control_action(rotate_logs, []),
-    [{error, enoent}, {error, enoent}] = empty_files([MainLog, SaslLog]),
-
-    %% rotate logs when logging is turned off
-    ok = application:set_env(rabbit, sasl_error_logger, false),
-    ok = application:set_env(rabbit, error_logger, silent),
-    ok = control_action(rotate_logs, []),
-    [{error, enoent}, {error, enoent}] = empty_files([MainLog, SaslLog]),
-
-    %% cleanup
-    ok = application:set_env(rabbit, sasl_error_logger, {file, SaslLog}),
-    ok = application:set_env(rabbit, error_logger, {file, MainLog}),
-    ok = add_log_handlers([{rabbit_error_logger_file_h, MainLog},
-                           {rabbit_sasl_report_file_h, SaslLog}]),
-    passed.
-
-log_management_during_startup(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, log_management_during_startup1, [Config]).
-
-log_management_during_startup1(_Config) ->
-    MainLog = rabbit:log_location(kernel),
-    SaslLog = rabbit:log_location(sasl),
-
-    %% start application with simple tty logging
-    ok = control_action(stop_app, []),
-    ok = application:set_env(rabbit, error_logger, tty),
-    ok = application:set_env(rabbit, sasl_error_logger, tty),
-    ok = add_log_handlers([{error_logger_tty_h, []},
-                           {sasl_report_tty_h, []}]),
-    ok = control_action(start_app, []),
-
-    %% start application with tty logging and
-    %% proper handlers not installed
-    ok = control_action(stop_app, []),
-    ok = error_logger:tty(false),
-    ok = delete_log_handlers([sasl_report_tty_h]),
-    ok = case catch control_action(start_app, []) of
-             ok -> exit({got_success_but_expected_failure,
-                         log_rotation_tty_no_handlers_test});
-             {badrpc, {'EXIT', {error,
-                                {cannot_log_to_tty, _, not_installed}}}} -> ok
-         end,
-
-    %% fix sasl logging
-    ok = application:set_env(rabbit, sasl_error_logger, {file, SaslLog}),
-
-    %% start application with logging to non-existing directory
-    TmpLog = "/tmp/rabbit-tests/test.log",
-    delete_file(TmpLog),
-    ok = control_action(stop_app, []),
-    ok = application:set_env(rabbit, error_logger, {file, TmpLog}),
-
-    ok = delete_log_handlers([rabbit_error_logger_file_h]),
-    ok = add_log_handlers([{error_logger_file_h, MainLog}]),
-    ok = control_action(start_app, []),
-
-    %% start application with logging to directory with no
-    %% write permissions
-    ok = control_action(stop_app, []),
-    TmpDir = "/tmp/rabbit-tests",
-    ok = set_permissions(TmpDir, 8#00400),
-    ok = delete_log_handlers([rabbit_error_logger_file_h]),
-    ok = add_log_handlers([{error_logger_file_h, MainLog}]),
-    ok = case control_action(start_app, []) of
-             ok -> exit({got_success_but_expected_failure,
-                         log_rotation_no_write_permission_dir_test});
-             {badrpc, {'EXIT',
-                       {error, {cannot_log_to_file, _, _}}}} -> ok
-         end,
-
-    %% start application with logging to a subdirectory which
-    %% parent directory has no write permissions
-    ok = control_action(stop_app, []),
-    TmpTestDir = "/tmp/rabbit-tests/no-permission/test/log",
-    ok = application:set_env(rabbit, error_logger, {file, TmpTestDir}),
-    ok = add_log_handlers([{error_logger_file_h, MainLog}]),
-    ok = case control_action(start_app, []) of
-             ok -> exit({got_success_but_expected_failure,
-                         log_rotatation_parent_dirs_test});
-             {badrpc,
-              {'EXIT',
-               {error, {cannot_log_to_file, _,
-                        {error,
-                         {cannot_create_parent_dirs, _, eacces}}}}}} -> ok
-         end,
-    ok = set_permissions(TmpDir, 8#00700),
-    ok = set_permissions(TmpLog, 8#00600),
-    ok = delete_file(TmpLog),
-    ok = file:del_dir(TmpDir),
-
-    %% start application with standard error_logger_file_h
-    %% handler not installed
-    ok = control_action(stop_app, []),
-    ok = application:set_env(rabbit, error_logger, {file, MainLog}),
-    ok = control_action(start_app, []),
-
-    %% start application with standard sasl handler not installed
-    %% and rabbit main log handler installed correctly
-    ok = control_action(stop_app, []),
-    ok = delete_log_handlers([rabbit_sasl_report_file_h]),
-    ok = control_action(start_app, []),
-    passed.
-
-%% "rabbitmqctl rotate_logs" without additional parameters
-%% shouldn't truncate files.
-rotate_logs_without_suffix(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, rotate_logs_without_suffix1, [Config]).
-
-rotate_logs_without_suffix1(_Config) ->
-    override_group_leader(),
-
-    MainLog = rabbit:log_location(kernel),
-    SaslLog = rabbit:log_location(sasl),
-    Suffix = ".1",
-    file:delete(MainLog),
-    file:delete(SaslLog),
-
-    %% Empty log-files should be created
-    ok = control_action(rotate_logs, []),
-    [true, true] = empty_files([MainLog, SaslLog]),
-
-    %% Write something to log files and simulate external log rotation
-    ok = test_logs_working(MainLog, SaslLog),
-    ok = file:rename(MainLog, [MainLog, Suffix]),
-    ok = file:rename(SaslLog, [SaslLog, Suffix]),
-
-    %% Create non-empty files
-    TestData = "test-data\n",
-    file:write_file(MainLog, TestData),
-    file:write_file(SaslLog, TestData),
-
-    %% Nothing should be truncated - neither moved files which are still
-    %% opened by server, nor new log files that should be just reopened.
-    ok = control_action(rotate_logs, []),
-    [true, true, true, true] =
-        non_empty_files([MainLog, SaslLog, [MainLog, Suffix],
-            [SaslLog, Suffix]]),
-
-    %% And log files should be re-opened - new log records should go to
-    %% new files.
-    ok = test_logs_working(MainLog, SaslLog),
-    true = (rabbit_file:file_size(MainLog) > length(TestData)),
-    true = (rabbit_file:file_size(SaslLog) > length(TestData)),
-    passed.
-
-override_group_leader() ->
-    %% Override group leader, otherwise SASL fake events are ignored by
-    %% the error_logger local to RabbitMQ.
-    {group_leader, Leader} = erlang:process_info(whereis(rabbit), group_leader),
-    erlang:group_leader(Leader, self()).
-
-empty_files(Files) ->
-    [case file:read_file_info(File) of
-         {ok, FInfo} -> FInfo#file_info.size == 0;
-         Error       -> Error
-     end || File <- Files].
-
-non_empty_files(Files) ->
-    [case EmptyFile of
-         {error, Reason} -> {error, Reason};
-         _               -> not(EmptyFile)
-     end || EmptyFile <- empty_files(Files)].
-
-test_logs_working(MainLogFile, SaslLogFile) ->
-    ok = rabbit_log:error("Log a test message~n"),
-    ok = error_logger:error_report(crash_report, [fake_crash_report, ?MODULE]),
-    %% give the error loggers some time to catch up
-    timer:sleep(100),
-    [true, true] = non_empty_files([MainLogFile, SaslLogFile]),
-    ok.
-
-set_permissions(Path, Mode) ->
-    case file:read_file_info(Path) of
-        {ok, FInfo} -> file:write_file_info(
-                         Path,
-                         FInfo#file_info{mode=Mode});
-        Error       -> Error
-    end.
-
-clean_logs(Files, Suffix) ->
-    [begin
-         ok = delete_file(File),
-         ok = delete_file([File, Suffix])
-     end || File <- Files],
-    ok.
-
-assert_ram_node() ->
-    case rabbit_mnesia:node_type() of
-        disc -> exit('not_ram_node');
-        ram  -> ok
-    end.
-
-assert_disc_node() ->
-    case rabbit_mnesia:node_type() of
-        disc -> ok;
-        ram  -> exit('not_disc_node')
-    end.
-
-delete_file(File) ->
-    case file:delete(File) of
-        ok              -> ok;
-        {error, enoent} -> ok;
-        Error           -> Error
-    end.
-
-make_files_non_writable(Files) ->
-    [ok = file:write_file_info(File, #file_info{mode=8#444}) ||
-        File <- Files],
-    ok.
-
-add_log_handlers(Handlers) ->
-    [ok = error_logger:add_report_handler(Handler, Args) ||
-        {Handler, Args} <- Handlers],
-    ok.
-
-%% sasl_report_file_h returns [] during terminate
-%% see: https://github.com/erlang/otp/blob/maint/lib/stdlib/src/error_logger_file_h.erl#L98
-%%
-%% error_logger_file_h returns ok since OTP 18.1
-%% see: https://github.com/erlang/otp/blob/maint/lib/stdlib/src/error_logger_file_h.erl#L98
-delete_log_handlers(Handlers) ->
-    [ok_or_empty_list(error_logger:delete_report_handler(Handler))
-     || Handler <- Handlers],
-    ok.
-
-ok_or_empty_list([]) ->
-    [];
-ok_or_empty_list(ok) ->
-    ok.
-
-%% ---------------------------------------------------------------------------
-%% Password hashing.
-%% ---------------------------------------------------------------------------
-
-password_hashing(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, password_hashing1, [Config]).
-
-password_hashing1(_Config) ->
-    rabbit_password_hashing_sha256 = rabbit_password:hashing_mod(),
-    application:set_env(rabbit, password_hashing_module,
-                        rabbit_password_hashing_md5),
-    rabbit_password_hashing_md5    = rabbit_password:hashing_mod(),
-    application:set_env(rabbit, password_hashing_module,
-                        rabbit_password_hashing_sha256),
-    rabbit_password_hashing_sha256 = rabbit_password:hashing_mod(),
-
-    rabbit_password_hashing_sha256 =
-        rabbit_password:hashing_mod(rabbit_password_hashing_sha256),
-    rabbit_password_hashing_md5    =
-        rabbit_password:hashing_mod(rabbit_password_hashing_md5),
-    rabbit_password_hashing_md5    =
-        rabbit_password:hashing_mod(undefined),
-
-    rabbit_password_hashing_md5    =
-        rabbit_auth_backend_internal:hashing_module_for_user(
-          #internal_user{}),
-    rabbit_password_hashing_md5    =
-        rabbit_auth_backend_internal:hashing_module_for_user(
-          #internal_user{
-             hashing_algorithm = undefined
-            }),
-    rabbit_password_hashing_md5    =
-        rabbit_auth_backend_internal:hashing_module_for_user(
-          #internal_user{
-             hashing_algorithm = rabbit_password_hashing_md5
-            }),
-
-    rabbit_password_hashing_sha256 =
-        rabbit_auth_backend_internal:hashing_module_for_user(
-          #internal_user{
-             hashing_algorithm = rabbit_password_hashing_sha256
-            }),
-
-    passed.
-
-change_password(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, change_password1, [Config]).
-
-change_password1(_Config) ->
-    UserName = <<"test_user">>,
-    Password = <<"test_password">>,
-    case rabbit_auth_backend_internal:lookup_user(UserName) of
-        {ok, _} -> rabbit_auth_backend_internal:delete_user(UserName);
-        _       -> ok
-    end,
-    ok = application:set_env(rabbit, password_hashing_module,
-                             rabbit_password_hashing_md5),
-    ok = rabbit_auth_backend_internal:add_user(UserName, Password),
-    {ok, #auth_user{username = UserName}} =
-        rabbit_auth_backend_internal:user_login_authentication(
-            UserName, [{password, Password}]),
-    ok = application:set_env(rabbit, password_hashing_module,
-                             rabbit_password_hashing_sha256),
-    {ok, #auth_user{username = UserName}} =
-        rabbit_auth_backend_internal:user_login_authentication(
-            UserName, [{password, Password}]),
-
-    NewPassword = <<"test_password1">>,
-    ok = rabbit_auth_backend_internal:change_password(UserName, NewPassword),
-    {ok, #auth_user{username = UserName}} =
-        rabbit_auth_backend_internal:user_login_authentication(
-            UserName, [{password, NewPassword}]),
-
-    {refused, _, [UserName]} =
-        rabbit_auth_backend_internal:user_login_authentication(
-            UserName, [{password, Password}]),
-    passed.
-
-%% -------------------------------------------------------------------
-%% rabbitmqctl.
-%% -------------------------------------------------------------------
-
-list_operations_timeout_pass(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, list_operations_timeout_pass1, [Config]).
-
-list_operations_timeout_pass1(Config) ->
-    %% create a few things so there is some useful information to list
-    {_Writer1, Limiter1, Ch1} = rabbit_ct_broker_helpers:test_channel(),
-    {_Writer2, Limiter2, Ch2} = rabbit_ct_broker_helpers:test_channel(),
-
-    [Q, Q2] = [Queue || Name <- [<<"list_operations_timeout_pass-q1">>,
-                                 <<"list_operations_timeout_pass-q2">>],
-                        {new, Queue = #amqqueue{}} <-
-                            [rabbit_amqqueue:declare(
-                               rabbit_misc:r(<<"/">>, queue, Name),
-                               false, false, [], none)]],
-
-    ok = rabbit_amqqueue:basic_consume(
-           Q, true, Ch1, Limiter1, false, 0, <<"ctag1">>, true, [],
-           undefined),
-    ok = rabbit_amqqueue:basic_consume(
-           Q2, true, Ch2, Limiter2, false, 0, <<"ctag2">>, true, [],
-           undefined),
-
-    %% list users
-    ok = control_action(add_user,
-      ["list_operations_timeout_pass-user",
-       "list_operations_timeout_pass-password"]),
-    {error, {user_already_exists, _}} =
-        control_action(add_user,
-          ["list_operations_timeout_pass-user",
-           "list_operations_timeout_pass-password"]),
-    ok = control_action_t(list_users, [], ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list parameters
-    ok = dummy_runtime_parameters:register(),
-    ok = control_action(set_parameter, ["test", "good", "123"]),
-    ok = control_action_t(list_parameters, [], ?TIMEOUT_LIST_OPS_PASS),
-    ok = control_action(clear_parameter, ["test", "good"]),
-    dummy_runtime_parameters:unregister(),
-
-    %% list vhosts
-    ok = control_action(add_vhost, ["/list_operations_timeout_pass-vhost"]),
-    {error, {vhost_already_exists, _}} =
-        control_action(add_vhost, ["/list_operations_timeout_pass-vhost"]),
-    ok = control_action_t(list_vhosts, [], ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list permissions
-    ok = control_action(set_permissions,
-      ["list_operations_timeout_pass-user", ".*", ".*", ".*"],
-      [{"-p", "/list_operations_timeout_pass-vhost"}]),
-    ok = control_action_t(list_permissions, [],
-      [{"-p", "/list_operations_timeout_pass-vhost"}],
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list user permissions
-    ok = control_action_t(list_user_permissions,
-      ["list_operations_timeout_pass-user"],
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list policies
-    ok = control_action_opts(
-      ["set_policy", "list_operations_timeout_pass-policy", ".*",
-       "{\"ha-mode\":\"all\"}"]),
-    ok = control_action_t(list_policies, [], ?TIMEOUT_LIST_OPS_PASS),
-    ok = control_action(clear_policy, ["list_operations_timeout_pass-policy"]),
-
-    %% list queues
-    ok = info_action_t(list_queues,
-      rabbit_amqqueue:info_keys(), false,
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list exchanges
-    ok = info_action_t(list_exchanges,
-      rabbit_exchange:info_keys(), true,
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list bindings
-    ok = info_action_t(list_bindings,
-      rabbit_binding:info_keys(), true,
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list connections
-    H = ?config(rmq_hostname, Config),
-    P = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp),
-    {ok, C1} = gen_tcp:connect(H, P, [binary, {active, false}]),
-    gen_tcp:send(C1, <<"AMQP", 0, 0, 9, 1>>),
-    {ok, <<1,0,0>>} = gen_tcp:recv(C1, 3, 100),
-
-    {ok, C2} = gen_tcp:connect(H, P, [binary, {active, false}]),
-    gen_tcp:send(C2, <<"AMQP", 0, 0, 9, 1>>),
-    {ok, <<1,0,0>>} = gen_tcp:recv(C2, 3, 100),
-
-    ok = info_action_t(
-      list_connections, rabbit_networking:connection_info_keys(), false,
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list consumers
-    ok = info_action_t(
-      list_consumers, rabbit_amqqueue:consumer_info_keys(), false,
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% list channels
-    ok = info_action_t(
-      list_channels, rabbit_channel:info_keys(), false,
-      ?TIMEOUT_LIST_OPS_PASS),
-
-    %% do some cleaning up
-    ok = control_action(delete_user, ["list_operations_timeout_pass-user"]),
-    {error, {no_such_user, _}} =
-        control_action(delete_user, ["list_operations_timeout_pass-user"]),
-
-    ok = control_action(delete_vhost, ["/list_operations_timeout_pass-vhost"]),
-    {error, {no_such_vhost, _}} =
-        control_action(delete_vhost, ["/list_operations_timeout_pass-vhost"]),
-
-    %% close_connection
-    Conns = rabbit_ct_broker_helpers:get_connection_pids([C1, C2]),
-    [ok, ok] = [ok = control_action(
-        close_connection, [rabbit_misc:pid_to_string(ConnPid), "go away"])
-     || ConnPid <- Conns],
-
-    %% cleanup queues
-    [{ok, _} = rabbit_amqqueue:delete(QR, false, false) || QR <- [Q, Q2]],
-
-    [begin
-         unlink(Chan),
-         ok = rabbit_channel:shutdown(Chan)
-     end || Chan <- [Ch1, Ch2]],
-    passed.
-
-user_management(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, user_management1, [Config]).
-
-user_management1(_Config) ->
-
-    %% lots if stuff that should fail
-    {error, {no_such_user, _}} =
-        control_action(delete_user,
-          ["user_management-user"]),
-    {error, {no_such_user, _}} =
-        control_action(change_password,
-          ["user_management-user", "user_management-password"]),
-    {error, {no_such_vhost, _}} =
-        control_action(delete_vhost,
-          ["/user_management-vhost"]),
-    {error, {no_such_user, _}} =
-        control_action(set_permissions,
-          ["user_management-user", ".*", ".*", ".*"]),
-    {error, {no_such_user, _}} =
-        control_action(clear_permissions,
-          ["user_management-user"]),
-    {error, {no_such_user, _}} =
-        control_action(list_user_permissions,
-          ["user_management-user"]),
-    {error, {no_such_vhost, _}} =
-        control_action(list_permissions, [],
-          [{"-p", "/user_management-vhost"}]),
-    {error, {invalid_regexp, _, _}} =
-        control_action(set_permissions,
-          ["guest", "+foo", ".*", ".*"]),
-    {error, {no_such_user, _}} =
-        control_action(set_user_tags,
-          ["user_management-user", "bar"]),
-
-    %% user creation
-    ok = control_action(add_user,
-      ["user_management-user", "user_management-password"]),
-    {error, {user_already_exists, _}} =
-        control_action(add_user,
-          ["user_management-user", "user_management-password"]),
-    ok = control_action(clear_password,
-      ["user_management-user"]),
-    ok = control_action(change_password,
-      ["user_management-user", "user_management-newpassword"]),
-
-    TestTags = fun (Tags) ->
-                       Args = ["user_management-user" | [atom_to_list(T) || T <- Tags]],
-                       ok = control_action(set_user_tags, Args),
-                       {ok, #internal_user{tags = Tags}} =
-                           rabbit_auth_backend_internal:lookup_user(
-                             <<"user_management-user">>),
-                       ok = control_action(list_users, [])
-               end,
-    TestTags([foo, bar, baz]),
-    TestTags([administrator]),
-    TestTags([]),
-
-    %% user authentication
-    ok = control_action(authenticate_user,
-      ["user_management-user", "user_management-newpassword"]),
-    {refused, _User, _Format, _Params} =
-        control_action(authenticate_user,
-          ["user_management-user", "user_management-password"]),
-
-    %% vhost creation
-    ok = control_action(add_vhost,
-      ["/user_management-vhost"]),
-    {error, {vhost_already_exists, _}} =
-        control_action(add_vhost,
-          ["/user_management-vhost"]),
-    ok = control_action(list_vhosts, []),
-
-    %% user/vhost mapping
-    ok = control_action(set_permissions,
-      ["user_management-user", ".*", ".*", ".*"],
-      [{"-p", "/user_management-vhost"}]),
-    ok = control_action(set_permissions,
-      ["user_management-user", ".*", ".*", ".*"],
-      [{"-p", "/user_management-vhost"}]),
-    ok = control_action(set_permissions,
-      ["user_management-user", ".*", ".*", ".*"],
-      [{"-p", "/user_management-vhost"}]),
-    ok = control_action(list_permissions, [],
-      [{"-p", "/user_management-vhost"}]),
-    ok = control_action(list_permissions, [],
-      [{"-p", "/user_management-vhost"}]),
-    ok = control_action(list_user_permissions,
-      ["user_management-user"]),
-
-    %% user/vhost unmapping
-    ok = control_action(clear_permissions,
-      ["user_management-user"], [{"-p", "/user_management-vhost"}]),
-    ok = control_action(clear_permissions,
-      ["user_management-user"], [{"-p", "/user_management-vhost"}]),
-
-    %% vhost deletion
-    ok = control_action(delete_vhost,
-      ["/user_management-vhost"]),
-    {error, {no_such_vhost, _}} =
-        control_action(delete_vhost,
-          ["/user_management-vhost"]),
-
-    %% deleting a populated vhost
-    ok = control_action(add_vhost,
-      ["/user_management-vhost"]),
-    ok = control_action(set_permissions,
-      ["user_management-user", ".*", ".*", ".*"],
-      [{"-p", "/user_management-vhost"}]),
-    {new, _} = rabbit_amqqueue:declare(
-                 rabbit_misc:r(<<"/user_management-vhost">>, queue,
-                               <<"user_management-vhost-queue">>),
-                 true, false, [], none),
-    ok = control_action(delete_vhost,
-      ["/user_management-vhost"]),
-
-    %% user deletion
-    ok = control_action(delete_user,
-      ["user_management-user"]),
-    {error, {no_such_user, _}} =
-        control_action(delete_user,
-          ["user_management-user"]),
-
-    passed.
-
-runtime_parameters(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, runtime_parameters1, [Config]).
-
-runtime_parameters1(_Config) ->
-    dummy_runtime_parameters:register(),
-    Good = fun(L) -> ok                = control_action(set_parameter, L) end,
-    Bad  = fun(L) -> {error_string, _} = control_action(set_parameter, L) end,
-
-    %% Acceptable for bijection
-    Good(["test", "good", "\"ignore\""]),
-    Good(["test", "good", "123"]),
-    Good(["test", "good", "true"]),
-    Good(["test", "good", "false"]),
-    Good(["test", "good", "null"]),
-    Good(["test", "good", "{\"key\": \"value\"}"]),
-
-    %% Invalid json
-    Bad(["test", "good", "atom"]),
-    Bad(["test", "good", "{\"foo\": \"bar\""]),
-    Bad(["test", "good", "{foo: \"bar\"}"]),
-
-    %% Test actual validation hook
-    Good(["test", "maybe", "\"good\""]),
-    Bad(["test", "maybe", "\"bad\""]),
-    Good(["test", "admin", "\"ignore\""]), %% ctl means 'user' -> none
-
-    ok = control_action(list_parameters, []),
-
-    ok = control_action(clear_parameter, ["test", "good"]),
-    ok = control_action(clear_parameter, ["test", "maybe"]),
-    ok = control_action(clear_parameter, ["test", "admin"]),
-    {error_string, _} =
-        control_action(clear_parameter, ["test", "neverexisted"]),
-
-    %% We can delete for a component that no longer exists
-    Good(["test", "good", "\"ignore\""]),
-    dummy_runtime_parameters:unregister(),
-    ok = control_action(clear_parameter, ["test", "good"]),
-    passed.
-
-policy_validation(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, policy_validation1, [Config]).
-
-policy_validation1(_Config) ->
-    PolicyName = "runtime_parameters-policy",
-    dummy_runtime_parameters:register_policy_validator(),
-    SetPol = fun (Key, Val) ->
-                     control_action_opts(
-                       ["set_policy", PolicyName, ".*",
-                        rabbit_misc:format("{\"~s\":~p}", [Key, Val])])
-             end,
-    OK     = fun (Key, Val) ->
-                 ok = SetPol(Key, Val),
-                 true = does_policy_exist(PolicyName,
-                   [{definition, [{list_to_binary(Key), Val}]}])
-             end,
-
-    OK("testeven", []),
-    OK("testeven", [1, 2]),
-    OK("testeven", [1, 2, 3, 4]),
-    OK("testpos",  [2, 5, 5678]),
-
-    {error_string, _} = SetPol("testpos",  [-1, 0, 1]),
-    {error_string, _} = SetPol("testeven", [ 1, 2, 3]),
-
-    ok = control_action(clear_policy, [PolicyName]),
-    dummy_runtime_parameters:unregister_policy_validator(),
-    passed.
-
-policy_opts_validation(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, policy_opts_validation1, [Config]).
-
-policy_opts_validation1(_Config) ->
-    PolicyName = "policy_opts_validation-policy",
-    Set  = fun (Extra) -> control_action_opts(
-                            ["set_policy", PolicyName,
-                             ".*", "{\"ha-mode\":\"all\"}"
-                             | Extra]) end,
-    OK   = fun (Extra, Props) ->
-               ok = Set(Extra),
-               true = does_policy_exist(PolicyName, Props)
-           end,
-    Fail = fun (Extra) ->
-            case Set(Extra) of
-                {error_string, _} -> ok;
-                no_command when Extra =:= ["--priority"] -> ok;
-                no_command when Extra =:= ["--apply-to"] -> ok;
-                {'EXIT',
-                 {function_clause,
-                  [{rabbit_control_main,action, _, _} | _]}}
-                when Extra =:= ["--offline"] -> ok
-          end
-    end,
-
-    OK  ([], [{priority, 0}, {'apply-to', <<"all">>}]),
-
-    OK  (["--priority", "0"], [{priority, 0}]),
-    OK  (["--priority", "3"], [{priority, 3}]),
-    Fail(["--priority", "banana"]),
-    Fail(["--priority"]),
-
-    OK  (["--apply-to", "all"],    [{'apply-to', <<"all">>}]),
-    OK  (["--apply-to", "queues"], [{'apply-to', <<"queues">>}]),
-    Fail(["--apply-to", "bananas"]),
-    Fail(["--apply-to"]),
-
-    OK  (["--priority", "3",      "--apply-to", "queues"], [{priority, 3}, {'apply-to', <<"queues">>}]),
-    Fail(["--priority", "banana", "--apply-to", "queues"]),
-    Fail(["--priority", "3",      "--apply-to", "bananas"]),
-
-    Fail(["--offline"]),
-
-    ok = control_action(clear_policy, [PolicyName]),
-    passed.
-
-ha_policy_validation(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, ha_policy_validation1, [Config]).
-
-ha_policy_validation1(_Config) ->
-    PolicyName = "ha_policy_validation-policy",
-    Set  = fun (JSON) -> control_action_opts(
-                           ["set_policy", PolicyName,
-                            ".*", JSON]) end,
-    OK   = fun (JSON, Def) ->
-               ok = Set(JSON),
-               true = does_policy_exist(PolicyName, [{definition, Def}])
-           end,
-    Fail = fun (JSON) -> {error_string, _} = Set(JSON) end,
-
-    OK  ("{\"ha-mode\":\"all\"}", [{<<"ha-mode">>, <<"all">>}]),
-    Fail("{\"ha-mode\":\"made_up\"}"),
-
-    Fail("{\"ha-mode\":\"nodes\"}"),
-    Fail("{\"ha-mode\":\"nodes\",\"ha-params\":2}"),
-    Fail("{\"ha-mode\":\"nodes\",\"ha-params\":[\"a\",2]}"),
-    OK  ("{\"ha-mode\":\"nodes\",\"ha-params\":[\"a\",\"b\"]}",
-      [{<<"ha-mode">>, <<"nodes">>}, {<<"ha-params">>, [<<"a">>, <<"b">>]}]),
-    Fail("{\"ha-params\":[\"a\",\"b\"]}"),
-
-    Fail("{\"ha-mode\":\"exactly\"}"),
-    Fail("{\"ha-mode\":\"exactly\",\"ha-params\":[\"a\",\"b\"]}"),
-    OK  ("{\"ha-mode\":\"exactly\",\"ha-params\":2}",
-      [{<<"ha-mode">>, <<"exactly">>}, {<<"ha-params">>, 2}]),
-    Fail("{\"ha-params\":2}"),
-
-    OK  ("{\"ha-mode\":\"all\",\"ha-sync-mode\":\"manual\"}",
-      [{<<"ha-mode">>, <<"all">>}, {<<"ha-sync-mode">>, <<"manual">>}]),
-    OK  ("{\"ha-mode\":\"all\",\"ha-sync-mode\":\"automatic\"}",
-      [{<<"ha-mode">>, <<"all">>}, {<<"ha-sync-mode">>, <<"automatic">>}]),
-    Fail("{\"ha-mode\":\"all\",\"ha-sync-mode\":\"made_up\"}"),
-    Fail("{\"ha-sync-mode\":\"manual\"}"),
-    Fail("{\"ha-sync-mode\":\"automatic\"}"),
-
-    ok = control_action(clear_policy, [PolicyName]),
-    passed.
-
-queue_master_location_policy_validation(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, queue_master_location_policy_validation1, [Config]).
-
-queue_master_location_policy_validation1(_Config) ->
-    PolicyName = "queue_master_location_policy_validation-policy",
-    Set  = fun (JSON) ->
-                   control_action_opts(
-                     ["set_policy", PolicyName, ".*", JSON])
-           end,
-    OK   = fun (JSON, Def) ->
-               ok = Set(JSON),
-               true = does_policy_exist(PolicyName, [{definition, Def}])
-           end,
-    Fail = fun (JSON) -> {error_string, _} = Set(JSON) end,
-
-    OK  ("{\"queue-master-locator\":\"min-masters\"}",
-      [{<<"queue-master-locator">>, <<"min-masters">>}]),
-    OK  ("{\"queue-master-locator\":\"client-local\"}",
-      [{<<"queue-master-locator">>, <<"client-local">>}]),
-    OK  ("{\"queue-master-locator\":\"random\"}",
-      [{<<"queue-master-locator">>, <<"random">>}]),
-    Fail("{\"queue-master-locator\":\"made_up\"}"),
-
-    ok = control_action(clear_policy, [PolicyName]),
-    passed.
-
-queue_modes_policy_validation(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, queue_modes_policy_validation1, [Config]).
-
-queue_modes_policy_validation1(_Config) ->
-    PolicyName = "queue_modes_policy_validation-policy",
-    Set  = fun (JSON) ->
-                   control_action_opts(
-                     ["set_policy", PolicyName, ".*", JSON])
-           end,
-    OK   = fun (JSON, Def) ->
-               ok = Set(JSON),
-               true = does_policy_exist(PolicyName, [{definition, Def}])
-           end,
-    Fail = fun (JSON) -> {error_string, _} = Set(JSON) end,
-
-    OK  ("{\"queue-mode\":\"lazy\"}",
-      [{<<"queue-mode">>, <<"lazy">>}]),
-    OK  ("{\"queue-mode\":\"default\"}",
-      [{<<"queue-mode">>, <<"default">>}]),
-    Fail("{\"queue-mode\":\"wrong\"}"),
-
-    ok = control_action(clear_policy, [PolicyName]),
-    passed.
-
-vhost_removed_while_updating_policy(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, vhost_removed_while_updating_policy1, [Config]).
-
-vhost_removed_while_updating_policy1(_Config) ->
-    VHost = "/vhost_removed_while_updating_policy-vhost",
-    PolicyName = "vhost_removed_while_updating_policy-policy",
-
-    ok = control_action(add_vhost, [VHost]),
-    ok = control_action_opts(
-      ["set_policy", "-p", VHost, PolicyName, ".*", "{\"ha-mode\":\"all\"}"]),
-    true = does_policy_exist(PolicyName, []),
-
-    %% Removing the vhost triggers the deletion of the policy. Once
-    %% the policy and the vhost are actually removed, RabbitMQ calls
-    %% update_policies() which lists policies on the given vhost. This
-    %% obviously fails because the vhost is gone, but the call should
-    %% still succeed.
-    ok = control_action(delete_vhost, [VHost]),
-    false = does_policy_exist(PolicyName, []),
-
-    passed.
-
-does_policy_exist(PolicyName, Props) ->
-    PolicyNameBin = list_to_binary(PolicyName),
-    Policies = lists:filter(
-      fun(Policy) ->
-          lists:member({name, PolicyNameBin}, Policy)
-      end, rabbit_policy:list()),
-    case Policies of
-        [Policy] -> check_policy_props(Policy, Props);
-        []       -> false;
-        _        -> false
-    end.
-
-check_policy_props(Policy, [Prop | Rest]) ->
-    case lists:member(Prop, Policy) of
-        true  -> check_policy_props(Policy, Rest);
-        false -> false
-    end;
-check_policy_props(_Policy, []) ->
-    true.
-
-server_status(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, server_status1, [Config]).
-
-server_status1(Config) ->
-    %% create a few things so there is some useful information to list
-    {_Writer, Limiter, Ch} = rabbit_ct_broker_helpers:test_channel(),
-    [Q, Q2] = [Queue || {Name, Owner} <- [{<<"server_status-q1">>, none},
-                                          {<<"server_status-q2">>, self()}],
-                        {new, Queue = #amqqueue{}} <-
-                            [rabbit_amqqueue:declare(
-                               rabbit_misc:r(<<"/">>, queue, Name),
-                               false, false, [], Owner)]],
-    ok = rabbit_amqqueue:basic_consume(
-           Q, true, Ch, Limiter, false, 0, <<"ctag">>, true, [], undefined),
-
-    %% list queues
-    ok = info_action(list_queues,
-      rabbit_amqqueue:info_keys(), true),
-
-    %% as we have no way to collect output of
-    %% info_action/3 call, the only way we
-    %% can test individual queueinfoitems is by directly calling
-    %% rabbit_amqqueue:info/2
-    [{exclusive, false}] = rabbit_amqqueue:info(Q, [exclusive]),
-    [{exclusive, true}] = rabbit_amqqueue:info(Q2, [exclusive]),
-
-    %% list exchanges
-    ok = info_action(list_exchanges,
-      rabbit_exchange:info_keys(), true),
-
-    %% list bindings
-    ok = info_action(list_bindings,
-      rabbit_binding:info_keys(), true),
-    %% misc binding listing APIs
-    [_|_] = rabbit_binding:list_for_source(
-              rabbit_misc:r(<<"/">>, exchange, <<"">>)),
-    [_] = rabbit_binding:list_for_destination(
-            rabbit_misc:r(<<"/">>, queue, <<"server_status-q1">>)),
-    [_] = rabbit_binding:list_for_source_and_destination(
-            rabbit_misc:r(<<"/">>, exchange, <<"">>),
-            rabbit_misc:r(<<"/">>, queue, <<"server_status-q1">>)),
-
-    %% list connections
-    H = ?config(rmq_hostname, Config),
-    P = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp),
-    {ok, C} = gen_tcp:connect(H, P, []),
-    gen_tcp:send(C, <<"AMQP", 0, 0, 9, 1>>),
-    timer:sleep(100),
-    ok = info_action(list_connections,
-      rabbit_networking:connection_info_keys(), false),
-    %% close_connection
-    [ConnPid] = rabbit_ct_broker_helpers:get_connection_pids([C]),
-    ok = control_action(close_connection,
-      [rabbit_misc:pid_to_string(ConnPid), "go away"]),
-
-    %% list channels
-    ok = info_action(list_channels, rabbit_channel:info_keys(), false),
-
-    %% list consumers
-    ok = control_action(list_consumers, []),
-
-    %% set vm memory high watermark
-    HWM = vm_memory_monitor:get_vm_memory_high_watermark(),
-    ok = control_action(set_vm_memory_high_watermark, ["1"]),
-    ok = control_action(set_vm_memory_high_watermark, ["1.0"]),
-    %% this will trigger an alarm
-    ok = control_action(set_vm_memory_high_watermark, ["0.0"]),
-    %% reset
-    ok = control_action(set_vm_memory_high_watermark, [float_to_list(HWM)]),
-
-    %% eval
-    {error_string, _} = control_action(eval, ["\""]),
-    {error_string, _} = control_action(eval, ["a("]),
-    ok = control_action(eval, ["a."]),
-
-    %% cleanup
-    [{ok, _} = rabbit_amqqueue:delete(QR, false, false) || QR <- [Q, Q2]],
-
-    unlink(Ch),
-    ok = rabbit_channel:shutdown(Ch),
-
-    passed.
-
-amqp_connection_refusal(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, amqp_connection_refusal1, [Config]).
-
-amqp_connection_refusal1(Config) ->
-    H = ?config(rmq_hostname, Config),
-    P = rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_amqp),
-    [passed = test_amqp_connection_refusal(H, P, V) ||
-        V <- [<<"AMQP",9,9,9,9>>, <<"AMQP",0,1,0,0>>, <<"XXXX",0,0,9,1>>]],
-    passed.
-
-test_amqp_connection_refusal(H, P, Header) ->
-    {ok, C} = gen_tcp:connect(H, P, [binary, {active, false}]),
-    ok = gen_tcp:send(C, Header),
-    {ok, <<"AMQP",0,0,9,1>>} = gen_tcp:recv(C, 8, 100),
-    ok = gen_tcp:close(C),
-    passed.
-
-list_consumers_sanity_check(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-    Chan = rabbit_ct_client_helpers:open_channel(Config, A),
-    %% this queue is not cleaned up because the entire node is
-    %% reset between tests
-    QName = <<"list_consumers_q">>,
-    #'queue.declare_ok'{} = amqp_channel:call(Chan, #'queue.declare'{queue = QName}),
-
-    %% No consumers even if we have some queues
-    [] = rabbitmqctl_list_consumers(Config, A),
-
-    %% Several consumers on single channel should be correctly reported
-    #'basic.consume_ok'{consumer_tag = CTag1} = amqp_channel:call(Chan, #'basic.consume'{queue = QName}),
-    #'basic.consume_ok'{consumer_tag = CTag2} = amqp_channel:call(Chan, #'basic.consume'{queue = QName}),
-    true = (lists:sort([CTag1, CTag2]) =:=
-            lists:sort(rabbitmqctl_list_consumers(Config, A))),
-
-    %% `rabbitmqctl report` shares some code with `list_consumers`, so
-    %% check that it also reports both channels
-    {ok, ReportStdOut} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A,
-      ["list_consumers"]),
-    ReportLines = re:split(ReportStdOut, <<"\n">>, [trim]),
-    ReportCTags = [lists:nth(3, re:split(Row, <<"\t">>)) || <<"list_consumers_q", _/binary>> = Row <- ReportLines],
-    true = (lists:sort([CTag1, CTag2]) =:=
-            lists:sort(ReportCTags)).
-
-rabbitmqctl_list_consumers(Config, Node) ->
-    {ok, StdOut} = rabbit_ct_broker_helpers:rabbitmqctl(Config, Node,
-      ["list_consumers"]),
-    [<<"Listing consumers", _/binary>> | ConsumerRows] = re:split(StdOut, <<"\n">>, [trim]),
-    CTags = [ lists:nth(3, re:split(Row, <<"\t">>)) || Row <- ConsumerRows ],
-    CTags.
-
-list_queues_online_and_offline(Config) ->
-    [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
-    ACh = rabbit_ct_client_helpers:open_channel(Config, A),
-    %% Node B will be stopped
-    BCh = rabbit_ct_client_helpers:open_channel(Config, B),
-    #'queue.declare_ok'{} = amqp_channel:call(ACh, #'queue.declare'{queue = <<"q_a_1">>, durable = true}),
-    #'queue.declare_ok'{} = amqp_channel:call(ACh, #'queue.declare'{queue = <<"q_a_2">>, durable = true}),
-    #'queue.declare_ok'{} = amqp_channel:call(BCh, #'queue.declare'{queue = <<"q_b_1">>, durable = true}),
-    #'queue.declare_ok'{} = amqp_channel:call(BCh, #'queue.declare'{queue = <<"q_b_2">>, durable = true}),
-
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, B, ["stop"]),
-
-    GotUp = lists:sort(rabbit_ct_broker_helpers:rabbitmqctl_list(Config, A,
-        ["list_queues", "--online", "name"])),
-    ExpectUp = [[<<"q_a_1">>], [<<"q_a_2">>]],
-    ExpectUp = GotUp,
-
-    GotDown = lists:sort(rabbit_ct_broker_helpers:rabbitmqctl_list(Config, A,
-        ["list_queues", "--offline", "name"])),
-    ExpectDown = [[<<"q_b_1">>], [<<"q_b_2">>]],
-    ExpectDown = GotDown,
-
-    GotAll = lists:sort(rabbit_ct_broker_helpers:rabbitmqctl_list(Config, A,
-        ["list_queues", "name"])),
-    ExpectAll = ExpectUp ++ ExpectDown,
-    ExpectAll = GotAll,
-
-    ok.
-
-%% -------------------------------------------------------------------
-%% Statistics.
-%% -------------------------------------------------------------------
-
-channel_statistics(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, channel_statistics1, [Config]).
-
-channel_statistics1(_Config) ->
-    application:set_env(rabbit, collect_statistics, fine),
-
-    %% ATM this just tests the queue / exchange stats in channels. That's
-    %% by far the most complex code though.
-
-    %% Set up a channel and queue
-    {_Writer, Ch} = test_spawn(),
-    rabbit_channel:do(Ch, #'queue.declare'{}),
-    QName = receive #'queue.declare_ok'{queue = Q0} -> Q0
-            after ?TIMEOUT -> throw(failed_to_receive_queue_declare_ok)
-            end,
-    QRes = rabbit_misc:r(<<"/">>, queue, QName),
-    X = rabbit_misc:r(<<"/">>, exchange, <<"">>),
-
-    dummy_event_receiver:start(self(), [node()], [channel_stats]),
-
-    %% Check stats empty
-    Event = test_ch_statistics_receive_event(Ch, fun (_) -> true end),
-    [] = proplists:get_value(channel_queue_stats, Event),
-    [] = proplists:get_value(channel_exchange_stats, Event),
-    [] = proplists:get_value(channel_queue_exchange_stats, Event),
-
-    %% Publish and get a message
-    rabbit_channel:do(Ch, #'basic.publish'{exchange = <<"">>,
-                                           routing_key = QName},
-                      rabbit_basic:build_content(#'P_basic'{}, <<"">>)),
-    rabbit_channel:do(Ch, #'basic.get'{queue = QName}),
-
-    %% Check the stats reflect that
-    Event2 = test_ch_statistics_receive_event(
-               Ch,
-               fun (E) ->
-                       length(proplists:get_value(
-                                channel_queue_exchange_stats, E)) > 0
-               end),
-    [{QRes, [{get,1}]}] = proplists:get_value(channel_queue_stats,    Event2),
-    [{X,[{publish,1}]}] = proplists:get_value(channel_exchange_stats, Event2),
-    [{{QRes,X},[{publish,1}]}] =
-        proplists:get_value(channel_queue_exchange_stats, Event2),
-
-    %% Check the stats remove stuff on queue deletion
-    rabbit_channel:do(Ch, #'queue.delete'{queue = QName}),
-    Event3 = test_ch_statistics_receive_event(
-               Ch,
-               fun (E) ->
-                       length(proplists:get_value(
-                                channel_queue_exchange_stats, E)) == 0
-               end),
-
-    [] = proplists:get_value(channel_queue_stats, Event3),
-    [{X,[{publish,1}]}] = proplists:get_value(channel_exchange_stats, Event3),
-    [] = proplists:get_value(channel_queue_exchange_stats, Event3),
-
-    rabbit_channel:shutdown(Ch),
-    dummy_event_receiver:stop(),
-    passed.
-
-test_ch_statistics_receive_event(Ch, Matcher) ->
-    rabbit_channel:flush(Ch),
-    Ch ! emit_stats,
-    test_ch_statistics_receive_event1(Ch, Matcher).
-
-test_ch_statistics_receive_event1(Ch, Matcher) ->
-    receive #event{type = channel_stats, props = Props} ->
-            case Matcher(Props) of
-                true -> Props;
-                _    -> test_ch_statistics_receive_event1(Ch, Matcher)
-            end
-    after ?TIMEOUT -> throw(failed_to_receive_event)
-    end.
-
-head_message_timestamp_statistics(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, head_message_timestamp1, [Config]).
-
-head_message_timestamp1(_Config) ->
-    %% Can't find a way to receive the ack here so can't test pending acks status
-
-    application:set_env(rabbit, collect_statistics, fine),
-
-    %% Set up a channel and queue
-    {_Writer, Ch} = test_spawn(),
-    rabbit_channel:do(Ch, #'queue.declare'{}),
-    QName = receive #'queue.declare_ok'{queue = Q0} -> Q0
-            after ?TIMEOUT -> throw(failed_to_receive_queue_declare_ok)
-            end,
-    QRes = rabbit_misc:r(<<"/">>, queue, QName),
-
-    {ok, Q1} = rabbit_amqqueue:lookup(QRes),
-    QPid = Q1#amqqueue.pid,
-
-    %% Set up event receiver for queue
-    dummy_event_receiver:start(self(), [node()], [queue_stats]),
-
-    %% Check timestamp is empty when queue is empty
-    Event1 = test_queue_statistics_receive_event(QPid, fun (E) -> proplists:get_value(name, E) == QRes end),
-    '' = proplists:get_value(head_message_timestamp, Event1),
-
-    %% Publish two messages and check timestamp is that of first message
-    rabbit_channel:do(Ch, #'basic.publish'{exchange = <<"">>,
-                                           routing_key = QName},
-                      rabbit_basic:build_content(#'P_basic'{timestamp = 1}, <<"">>)),
-    rabbit_channel:do(Ch, #'basic.publish'{exchange = <<"">>,
-                                           routing_key = QName},
-                      rabbit_basic:build_content(#'P_basic'{timestamp = 2}, <<"">>)),
-    Event2 = test_queue_statistics_receive_event(QPid, fun (E) -> proplists:get_value(name, E) == QRes end),
-    1 = proplists:get_value(head_message_timestamp, Event2),
-
-    %% Get first message and check timestamp is that of second message
-    rabbit_channel:do(Ch, #'basic.get'{queue = QName, no_ack = true}),
-    Event3 = test_queue_statistics_receive_event(QPid, fun (E) -> proplists:get_value(name, E) == QRes end),
-    2 = proplists:get_value(head_message_timestamp, Event3),
-
-    %% Get second message and check timestamp is empty again
-    rabbit_channel:do(Ch, #'basic.get'{queue = QName, no_ack = true}),
-    Event4 = test_queue_statistics_receive_event(QPid, fun (E) -> proplists:get_value(name, E) == QRes end),
-    '' = proplists:get_value(head_message_timestamp, Event4),
-
-    %% Teardown
-    rabbit_channel:do(Ch, #'queue.delete'{queue = QName}),
-    rabbit_channel:shutdown(Ch),
-    dummy_event_receiver:stop(),
-
-    passed.
-
-test_queue_statistics_receive_event(Q, Matcher) ->
-    %% Q ! emit_stats,
-    test_queue_statistics_receive_event1(Q, Matcher).
-
-test_queue_statistics_receive_event1(Q, Matcher) ->
-    receive #event{type = queue_stats, props = Props} ->
-            case Matcher(Props) of
-                true -> Props;
-                _    -> test_queue_statistics_receive_event1(Q, Matcher)
-            end
-    after ?TIMEOUT -> throw(failed_to_receive_event)
-    end.
-
-test_spawn() ->
-    {Writer, _Limiter, Ch} = rabbit_ct_broker_helpers:test_channel(),
-    ok = rabbit_channel:do(Ch, #'channel.open'{}),
-    receive #'channel.open_ok'{} -> ok
-    after ?TIMEOUT -> throw(failed_to_receive_channel_open_ok)
-    end,
-    {Writer, Ch}.
-
-test_spawn(Node) ->
-    rpc:call(Node, ?MODULE, test_spawn_remote, []).
-
-%% Spawn an arbitrary long lived process, so we don't end up linking
-%% the channel to the short-lived process (RPC, here) spun up by the
-%% RPC server.
-test_spawn_remote() ->
-    RPC = self(),
-    spawn(fun () ->
-                  {Writer, Ch} = test_spawn(),
-                  RPC ! {Writer, Ch},
-                  link(Ch),
-                  receive
-                      _ -> ok
-                  end
-          end),
-    receive Res -> Res
-    after ?TIMEOUT  -> throw(failed_to_receive_result)
-    end.
-
-%% -------------------------------------------------------------------
-%% Topic matching.
-%% -------------------------------------------------------------------
-
-topic_matching(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, topic_matching1, [Config]).
-
-topic_matching1(_Config) ->
-    XName = #resource{virtual_host = <<"/">>,
-                      kind = exchange,
-                      name = <<"topic_matching-exchange">>},
-    X0 = #exchange{name = XName, type = topic, durable = false,
-                   auto_delete = false, arguments = []},
-    X = rabbit_exchange_decorator:set(X0),
-    %% create
-    rabbit_exchange_type_topic:validate(X),
-    exchange_op_callback(X, create, []),
-
-    %% add some bindings
-    Bindings = [#binding{source = XName,
-                         key = list_to_binary(Key),
-                         destination = #resource{virtual_host = <<"/">>,
-                                                 kind = queue,
-                                                 name = list_to_binary(Q)},
-                         args = Args} ||
-                   {Key, Q, Args} <- [{"a.b.c",         "t1",  []},
-                                      {"a.*.c",         "t2",  []},
-                                      {"a.#.b",         "t3",  []},
-                                      {"a.b.b.c",       "t4",  []},
-                                      {"#",             "t5",  []},
-                                      {"#.#",           "t6",  []},
-                                      {"#.b",           "t7",  []},
-                                      {"*.*",           "t8",  []},
-                                      {"a.*",           "t9",  []},
-                                      {"*.b.c",         "t10", []},
-                                      {"a.#",           "t11", []},
-                                      {"a.#.#",         "t12", []},
-                                      {"b.b.c",         "t13", []},
-                                      {"a.b.b",         "t14", []},
-                                      {"a.b",           "t15", []},
-                                      {"b.c",           "t16", []},
-                                      {"",              "t17", []},
-                                      {"*.*.*",         "t18", []},
-                                      {"vodka.martini", "t19", []},
-                                      {"a.b.c",         "t20", []},
-                                      {"*.#",           "t21", []},
-                                      {"#.*.#",         "t22", []},
-                                      {"*.#.#",         "t23", []},
-                                      {"#.#.#",         "t24", []},
-                                      {"*",             "t25", []},
-                                      {"#.b.#",         "t26", []},
-                                      {"args-test",     "t27",
-                                       [{<<"foo">>, longstr, <<"bar">>}]},
-                                      {"args-test",     "t27", %% Note aliasing
-                                       [{<<"foo">>, longstr, <<"baz">>}]}]],
-    lists:foreach(fun (B) -> exchange_op_callback(X, add_binding, [B]) end,
-                  Bindings),
-
-    %% test some matches
-    test_topic_expect_match(
-      X, [{"a.b.c",               ["t1", "t2", "t5", "t6", "t10", "t11", "t12",
-                                   "t18", "t20", "t21", "t22", "t23", "t24",
-                                   "t26"]},
-          {"a.b",                 ["t3", "t5", "t6", "t7", "t8", "t9", "t11",
-                                   "t12", "t15", "t21", "t22", "t23", "t24",
-                                   "t26"]},
-          {"a.b.b",               ["t3", "t5", "t6", "t7", "t11", "t12", "t14",
-                                   "t18", "t21", "t22", "t23", "t24", "t26"]},
-          {"",                    ["t5", "t6", "t17", "t24"]},
-          {"b.c.c",               ["t5", "t6", "t18", "t21", "t22", "t23",
-                                   "t24", "t26"]},
-          {"a.a.a.a.a",           ["t5", "t6", "t11", "t12", "t21", "t22",
-                                   "t23", "t24"]},
-          {"vodka.gin",           ["t5", "t6", "t8", "t21", "t22", "t23",
-                                   "t24"]},
-          {"vodka.martini",       ["t5", "t6", "t8", "t19", "t21", "t22", "t23",
-                                   "t24"]},
-          {"b.b.c",               ["t5", "t6", "t10", "t13", "t18", "t21",
-                                   "t22", "t23", "t24", "t26"]},
-          {"nothing.here.at.all", ["t5", "t6", "t21", "t22", "t23", "t24"]},
-          {"oneword",             ["t5", "t6", "t21", "t22", "t23", "t24",
-                                   "t25"]},
-          {"args-test",           ["t5", "t6", "t21", "t22", "t23", "t24",
-                                   "t25", "t27"]}]),
-    %% remove some bindings
-    RemovedBindings = [lists:nth(1, Bindings), lists:nth(5, Bindings),
-                       lists:nth(11, Bindings), lists:nth(19, Bindings),
-                       lists:nth(21, Bindings), lists:nth(28, Bindings)],
-    exchange_op_callback(X, remove_bindings, [RemovedBindings]),
-    RemainingBindings = ordsets:to_list(
-                          ordsets:subtract(ordsets:from_list(Bindings),
-                                           ordsets:from_list(RemovedBindings))),
-
-    %% test some matches
-    test_topic_expect_match(
-      X,
-      [{"a.b.c",               ["t2", "t6", "t10", "t12", "t18", "t20", "t22",
-                                "t23", "t24", "t26"]},
-       {"a.b",                 ["t3", "t6", "t7", "t8", "t9", "t12", "t15",
-                                "t22", "t23", "t24", "t26"]},
-       {"a.b.b",               ["t3", "t6", "t7", "t12", "t14", "t18", "t22",
-                                "t23", "t24", "t26"]},
-       {"",                    ["t6", "t17", "t24"]},
-       {"b.c.c",               ["t6", "t18", "t22", "t23", "t24", "t26"]},
-       {"a.a.a.a.a",           ["t6", "t12", "t22", "t23", "t24"]},
-       {"vodka.gin",           ["t6", "t8", "t22", "t23", "t24"]},
-       {"vodka.martini",       ["t6", "t8", "t22", "t23", "t24"]},
-       {"b.b.c",               ["t6", "t10", "t13", "t18", "t22", "t23",
-                                "t24", "t26"]},
-       {"nothing.here.at.all", ["t6", "t22", "t23", "t24"]},
-       {"oneword",             ["t6", "t22", "t23", "t24", "t25"]},
-       {"args-test",           ["t6", "t22", "t23", "t24", "t25", "t27"]}]),
-
-    %% remove the entire exchange
-    exchange_op_callback(X, delete, [RemainingBindings]),
-    %% none should match now
-    test_topic_expect_match(X, [{"a.b.c", []}, {"b.b.c", []}, {"", []}]),
-    passed.
-
-exchange_op_callback(X, Fun, Args) ->
-    rabbit_misc:execute_mnesia_transaction(
-      fun () -> rabbit_exchange:callback(X, Fun, transaction, [X] ++ Args) end),
-    rabbit_exchange:callback(X, Fun, none, [X] ++ Args).
-
-test_topic_expect_match(X, List) ->
-    lists:foreach(
-      fun ({Key, Expected}) ->
-              BinKey = list_to_binary(Key),
-              Message = rabbit_basic:message(X#exchange.name, BinKey,
-                                             #'P_basic'{}, <<>>),
-              Res = rabbit_exchange_type_topic:route(
-                      X, #delivery{mandatory = false,
-                                   sender    = self(),
-                                   message   = Message}),
-              ExpectedRes = lists:map(
-                              fun (Q) -> #resource{virtual_host = <<"/">>,
-                                                   kind = queue,
-                                                   name = list_to_binary(Q)}
-                              end, Expected),
-              true = (lists:usort(ExpectedRes) =:= lists:usort(Res))
-      end, List).
-
-%% ---------------------------------------------------------------------------
-%% Unordered tests (originally from rabbit_tests.erl).
-%% ---------------------------------------------------------------------------
-
-confirms(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, confirms1, [Config]).
-
-confirms1(_Config) ->
-    {_Writer, Ch} = test_spawn(),
-    DeclareBindDurableQueue =
-        fun() ->
-                rabbit_channel:do(Ch, #'queue.declare'{durable = true}),
-                receive #'queue.declare_ok'{queue = Q0} ->
-                        rabbit_channel:do(Ch, #'queue.bind'{
-                                                 queue = Q0,
-                                                 exchange = <<"amq.direct">>,
-                                                 routing_key = "confirms-magic" }),
-                        receive #'queue.bind_ok'{} -> Q0
-                        after ?TIMEOUT -> throw(failed_to_bind_queue)
-                        end
-                after ?TIMEOUT -> throw(failed_to_declare_queue)
-                end
-        end,
-    %% Declare and bind two queues
-    QName1 = DeclareBindDurableQueue(),
-    QName2 = DeclareBindDurableQueue(),
-    %% Get the first one's pid (we'll crash it later)
-    {ok, Q1} = rabbit_amqqueue:lookup(rabbit_misc:r(<<"/">>, queue, QName1)),
-    QPid1 = Q1#amqqueue.pid,
-    %% Enable confirms
-    rabbit_channel:do(Ch, #'confirm.select'{}),
-    receive
-        #'confirm.select_ok'{} -> ok
-    after ?TIMEOUT -> throw(failed_to_enable_confirms)
-    end,
-    %% Publish a message
-    rabbit_channel:do(Ch, #'basic.publish'{exchange = <<"amq.direct">>,
-                                           routing_key = "confirms-magic"
-                                          },
-                      rabbit_basic:build_content(
-                        #'P_basic'{delivery_mode = 2}, <<"">>)),
-    %% We must not kill the queue before the channel has processed the
-    %% 'publish'.
-    ok = rabbit_channel:flush(Ch),
-    %% Crash the queue
-    QPid1 ! boom,
-    %% Wait for a nack
-    receive
-        #'basic.nack'{} -> ok;
-        #'basic.ack'{}  -> throw(received_ack_instead_of_nack)
-    after ?TIMEOUT-> throw(did_not_receive_nack)
-    end,
-    receive
-        #'basic.ack'{} -> throw(received_ack_when_none_expected)
-    after 1000 -> ok
-    end,
-    %% Cleanup
-    rabbit_channel:do(Ch, #'queue.delete'{queue = QName2}),
-    receive
-        #'queue.delete_ok'{} -> ok
-    after ?TIMEOUT -> throw(failed_to_cleanup_queue)
-    end,
-    unlink(Ch),
-    ok = rabbit_channel:shutdown(Ch),
-
-    passed.
-
-gen_server2_with_state(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, gen_server2_with_state1, [Config]).
-
-gen_server2_with_state1(_Config) ->
-    fhc_state = gen_server2:with_state(file_handle_cache,
-                                       fun (S) -> element(1, S) end),
-    passed.
-
-mcall(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, mcall1, [Config]).
-
-mcall1(_Config) ->
-    P1 = spawn(fun gs2_test_listener/0),
-    register(foo, P1),
-    global:register_name(gfoo, P1),
-
-    P2 = spawn(fun() -> exit(bang) end),
-    %% ensure P2 is dead (ignore the race setting up the monitor)
-    await_exit(P2),
-
-    P3 = spawn(fun gs2_test_crasher/0),
-
-    %% since P2 crashes almost immediately and P3 after receiving its first
-    %% message, we have to spawn a few more processes to handle the additional
-    %% cases we're interested in here
-    register(baz, spawn(fun gs2_test_crasher/0)),
-    register(bog, spawn(fun gs2_test_crasher/0)),
-    global:register_name(gbaz, spawn(fun gs2_test_crasher/0)),
-
-    NoNode = rabbit_nodes:make("nonode"),
-
-    Targets =
-        %% pids
-        [P1, P2, P3]
-        ++
-        %% registered names
-        [foo, bar, baz]
-        ++
-        %% {Name, Node} pairs
-        [{foo, node()}, {bar, node()}, {bog, node()}, {foo, NoNode}]
-        ++
-        %% {global, Name}
-        [{global, gfoo}, {global, gbar}, {global, gbaz}],
-
-    GoodResults = [{D, goodbye} || D <- [P1, foo,
-                                         {foo, node()},
-                                         {global, gfoo}]],
-
-    BadResults  = [{P2,             noproc},   % died before use
-                   {P3,             boom},     % died on first use
-                   {bar,            noproc},   % never registered
-                   {baz,            boom},     % died on first use
-                   {{bar, node()},  noproc},   % never registered
-                   {{bog, node()},  boom},     % died on first use
-                   {{foo, NoNode},  nodedown}, % invalid node
-                   {{global, gbar}, noproc},   % never registered globally
-                   {{global, gbaz}, boom}],    % died on first use
-
-    {Replies, Errors} = gen_server2:mcall([{T, hello} || T <- Targets]),
-    true = lists:sort(Replies) == lists:sort(GoodResults),
-    true = lists:sort(Errors)  == lists:sort(BadResults),
-
-    %% cleanup (ignore the race setting up the monitor)
-    P1 ! stop,
-    await_exit(P1),
-    passed.
-
-await_exit(Pid) ->
-    MRef = erlang:monitor(process, Pid),
-    receive
-        {'DOWN', MRef, _, _, _} -> ok
-    end.
-
-gs2_test_crasher() ->
-    receive
-        {'$gen_call', _From, hello} -> exit(boom)
-    end.
-
-gs2_test_listener() ->
-    receive
-        {'$gen_call', From, hello} ->
-            gen_server2:reply(From, goodbye),
-            gs2_test_listener();
-        stop ->
-            ok
-    end.
-
-configurable_server_properties(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, configurable_server_properties1, [Config]).
-
-configurable_server_properties1(_Config) ->
-    %% List of the names of the built-in properties do we expect to find
-    BuiltInPropNames = [<<"product">>, <<"version">>, <<"platform">>,
-                        <<"copyright">>, <<"information">>],
-
-    Protocol = rabbit_framing_amqp_0_9_1,
-
-    %% Verify that the built-in properties are initially present
-    ActualPropNames = [Key || {Key, longstr, _} <-
-                                  rabbit_reader:server_properties(Protocol)],
-    true = lists:all(fun (X) -> lists:member(X, ActualPropNames) end,
-                     BuiltInPropNames),
-
-    %% Get the initial server properties configured in the environment
-    {ok, ServerProperties} = application:get_env(rabbit, server_properties),
-
-    %% Helper functions
-    ConsProp = fun (X) -> application:set_env(rabbit,
-                                              server_properties,
-                                              [X | ServerProperties]) end,
-    IsPropPresent =
-        fun (X) ->
-                lists:member(X, rabbit_reader:server_properties(Protocol))
-        end,
-
-    %% Add a wholly new property of the simplified {KeyAtom, StringValue} form
-    NewSimplifiedProperty = {NewHareKey, NewHareVal} = {hare, "soup"},
-    ConsProp(NewSimplifiedProperty),
-    %% Do we find hare soup, appropriately formatted in the generated properties?
-    ExpectedHareImage = {list_to_binary(atom_to_list(NewHareKey)),
-                         longstr,
-                         list_to_binary(NewHareVal)},
-    true = IsPropPresent(ExpectedHareImage),
-
-    %% Add a wholly new property of the {BinaryKey, Type, Value} form
-    %% and check for it
-    NewProperty = {<<"new-bin-key">>, signedint, -1},
-    ConsProp(NewProperty),
-    %% Do we find the new property?
-    true = IsPropPresent(NewProperty),
-
-    %% Add a property that clobbers a built-in, and verify correct clobbering
-    {NewVerKey, NewVerVal} = NewVersion = {version, "X.Y.Z."},
-    {BinNewVerKey, BinNewVerVal} = {list_to_binary(atom_to_list(NewVerKey)),
-                                    list_to_binary(NewVerVal)},
-    ConsProp(NewVersion),
-    ClobberedServerProps = rabbit_reader:server_properties(Protocol),
-    %% Is the clobbering insert present?
-    true = IsPropPresent({BinNewVerKey, longstr, BinNewVerVal}),
-    %% Is the clobbering insert the only thing with the clobbering key?
-    [{BinNewVerKey, longstr, BinNewVerVal}] =
-        [E || {K, longstr, _V} = E <- ClobberedServerProps, K =:= BinNewVerKey],
-
-    application:set_env(rabbit, server_properties, ServerProperties),
-    passed.
-
-memory_high_watermark(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, memory_high_watermark1, [Config]).
-
-memory_high_watermark1(_Config) ->
-    %% set vm memory high watermark
-    HWM = vm_memory_monitor:get_vm_memory_high_watermark(),
-    %% this will trigger an alarm
-    ok = control_action(set_vm_memory_high_watermark,
-      ["absolute", "2000"]),
-    [{{resource_limit,memory,_},[]}] = rabbit_alarm:get_alarms(),
-    %% reset
-    ok = control_action(set_vm_memory_high_watermark,
-      [float_to_list(HWM)]),
-
-    passed.
-
-set_disk_free_limit_command(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, set_disk_free_limit_command1, [Config]).
-
-set_disk_free_limit_command1(_Config) ->
-    ok = control_action(set_disk_free_limit,
-      ["2000kiB"]),
-    2048000 = rabbit_disk_monitor:get_disk_free_limit(),
-    ok = control_action(set_disk_free_limit,
-      ["mem_relative", "1.1"]),
-    ExpectedLimit = 1.1 * vm_memory_monitor:get_total_memory(),
-    % Total memory is unstable, so checking order
-    true = ExpectedLimit/rabbit_disk_monitor:get_disk_free_limit() < 1.2,
-    true = ExpectedLimit/rabbit_disk_monitor:get_disk_free_limit() > 0.98,
-    ok = control_action(set_disk_free_limit, ["50MB"]),
-    passed.
-
-disk_monitor(Config) ->
-    passed = rabbit_ct_broker_helpers:rpc(Config, 0,
-      ?MODULE, disk_monitor1, [Config]).
-
-disk_monitor1(_Config) ->
-    %% Issue: rabbitmq-server #91
-    %% os module could be mocked using 'unstick', however it may have undesired
-    %% side effects in following tests. Thus, we mock at rabbit_misc level
-    ok = meck:new(rabbit_misc, [passthrough]),
-    ok = meck:expect(rabbit_misc, os_cmd, fun(_) -> "\n" end),
-    ok = rabbit_sup:stop_child(rabbit_disk_monitor_sup),
-    ok = rabbit_sup:start_delayed_restartable_child(rabbit_disk_monitor, [1000]),
-    meck:unload(rabbit_misc),
-    passed.
-
-disconnect_detected_during_alarm(Config) ->
-    A = rabbit_ct_broker_helpers:get_node_config(Config, 0, nodename),
-
-    %% Set a low memory high watermark.
-    rabbit_ct_broker_helpers:rabbitmqctl(Config, A,
-      ["set_vm_memory_high_watermark", "0.000000001"]),
-
-    %% Open a connection and a channel.
-    Port = rabbit_ct_broker_helpers:get_node_config(Config, A, tcp_port_amqp),
-    Heartbeat = 1,
-    {ok, Conn} = amqp_connection:start(
-      #amqp_params_network{port = Port,
-                           heartbeat = Heartbeat}),
-    {ok, Ch} = amqp_connection:open_channel(Conn),
-
-    amqp_connection:register_blocked_handler(Conn, self()),
-    Publish = #'basic.publish'{routing_key = <<"nowhere-to-go">>},
-    amqp_channel:cast(Ch, Publish, #amqp_msg{payload = <<"foobar">>}),
-    receive
-        % Check that connection was indeed blocked
-        #'connection.blocked'{} -> ok
-    after
-        1000 -> exit(connection_was_not_blocked)
-    end,
-
-    %% Connection is blocked, now we should forcefully kill it
-    {'EXIT', _} = (catch amqp_connection:close(Conn, 10)),
-
-    ListConnections =
-        fun() ->
-            rpc:call(A, rabbit_networking, connection_info_all, [])
-        end,
-
-    %% We've already disconnected, but blocked connection still should still linger on.
-    [SingleConn] = ListConnections(),
-    blocked = rabbit_misc:pget(state, SingleConn),
-
-    %% It should definitely go away after 2 heartbeat intervals.
-    timer:sleep(round(2.5 * 1000 * Heartbeat)),
-    [] = ListConnections(),
-
-    passed.
-
-%% ---------------------------------------------------------------------------
-%% Cluster-dependent tests.
-%% ---------------------------------------------------------------------------
-
-delegates_async(Config) ->
-    {I, J} = ?config(test_direction, Config),
-    From = rabbit_ct_broker_helpers:get_node_config(Config, I, nodename),
-    To = rabbit_ct_broker_helpers:get_node_config(Config, J, nodename),
-    rabbit_ct_broker_helpers:add_code_path_to_node(To, ?MODULE),
-    passed = rabbit_ct_broker_helpers:rpc(Config,
-      From, ?MODULE, delegates_async1, [Config, To]).
-
-delegates_async1(_Config, SecondaryNode) ->
-    Self = self(),
-    Sender = fun (Pid) -> Pid ! {invoked, Self} end,
-
-    Responder = make_responder(fun ({invoked, Pid}) -> Pid ! response end),
-
-    ok = delegate:invoke_no_result(spawn(Responder), Sender),
-    ok = delegate:invoke_no_result(spawn(SecondaryNode, Responder), Sender),
-    await_response(2),
-
-    LocalPids = spawn_responders(node(), Responder, 10),
-    RemotePids = spawn_responders(SecondaryNode, Responder, 10),
-    ok = delegate:invoke_no_result(LocalPids ++ RemotePids, Sender),
-    await_response(20),
-
-    passed.
-
-delegates_sync(Config) ->
-    {I, J} = ?config(test_direction, Config),
-    From = rabbit_ct_broker_helpers:get_node_config(Config, I, nodename),
-    To = rabbit_ct_broker_helpers:get_node_config(Config, J, nodename),
-    rabbit_ct_broker_helpers:add_code_path_to_node(To, ?MODULE),
-    passed = rabbit_ct_broker_helpers:rpc(Config,
-      From, ?MODULE, delegates_sync1, [Config, To]).
-
-delegates_sync1(_Config, SecondaryNode) ->
-    Sender = fun (Pid) -> gen_server:call(Pid, invoked, infinity) end,
-    BadSender = fun (_Pid) -> exit(exception) end,
-
-    Responder = make_responder(fun ({'$gen_call', From, invoked}) ->
-                                       gen_server:reply(From, response)
-                               end),
-
-    BadResponder = make_responder(fun ({'$gen_call', From, invoked}) ->
-                                          gen_server:reply(From, response)
-                                  end, bad_responder_died),
-
-    response = delegate:invoke(spawn(Responder), Sender),
-    response = delegate:invoke(spawn(SecondaryNode, Responder), Sender),
-
-    must_exit(fun () -> delegate:invoke(spawn(BadResponder), BadSender) end),
-    must_exit(fun () ->
-                      delegate:invoke(spawn(SecondaryNode, BadResponder), BadSender) end),
-
-    LocalGoodPids = spawn_responders(node(), Responder, 2),
-    RemoteGoodPids = spawn_responders(SecondaryNode, Responder, 2),
-    LocalBadPids = spawn_responders(node(), BadResponder, 2),
-    RemoteBadPids = spawn_responders(SecondaryNode, BadResponder, 2),
-
-    {GoodRes, []} = delegate:invoke(LocalGoodPids ++ RemoteGoodPids, Sender),
-    true = lists:all(fun ({_, response}) -> true end, GoodRes),
-    GoodResPids = [Pid || {Pid, _} <- GoodRes],
-
-    Good = lists:usort(LocalGoodPids ++ RemoteGoodPids),
-    Good = lists:usort(GoodResPids),
-
-    {[], BadRes} = delegate:invoke(LocalBadPids ++ RemoteBadPids, BadSender),
-    true = lists:all(fun ({_, {exit, exception, _}}) -> true end, BadRes),
-    BadResPids = [Pid || {Pid, _} <- BadRes],
-
-    Bad = lists:usort(LocalBadPids ++ RemoteBadPids),
-    Bad = lists:usort(BadResPids),
-
-    MagicalPids = [rabbit_misc:string_to_pid(Str) ||
-                      Str <- ["<nonode@nohost.0.1.0>", "<nonode@nohost.0.2.0>"]],
-    {[], BadNodes} = delegate:invoke(MagicalPids, Sender),
-    true = lists:all(
-             fun ({_, {exit, {nodedown, nonode@nohost}, _Stack}}) -> true end,
-             BadNodes),
-    BadNodesPids = [Pid || {Pid, _} <- BadNodes],
-
-    Magical = lists:usort(MagicalPids),
-    Magical = lists:usort(BadNodesPids),
-
-    passed.
-
-queue_cleanup(Config) ->
-    {I, J} = ?config(test_direction, Config),
-    From = rabbit_ct_broker_helpers:get_node_config(Config, I, nodename),
-    To = rabbit_ct_broker_helpers:get_node_config(Config, J, nodename),
-    rabbit_ct_broker_helpers:add_code_path_to_node(To, ?MODULE),
-    passed = rabbit_ct_broker_helpers:rpc(Config,
-      From, ?MODULE, queue_cleanup1, [Config, To]).
-
-queue_cleanup1(_Config, _SecondaryNode) ->
-    {_Writer, Ch} = test_spawn(),
-    rabbit_channel:do(Ch, #'queue.declare'{ queue = ?CLEANUP_QUEUE_NAME }),
-    receive #'queue.declare_ok'{queue = ?CLEANUP_QUEUE_NAME} ->
-            ok
-    after ?TIMEOUT -> throw(failed_to_receive_queue_declare_ok)
-    end,
-    rabbit_channel:shutdown(Ch),
-    rabbit:stop(),
-    rabbit:start(),
-    {_Writer2, Ch2} = test_spawn(),
-    rabbit_channel:do(Ch2, #'queue.declare'{ passive = true,
-                                             queue   = ?CLEANUP_QUEUE_NAME }),
-    receive
-        #'channel.close'{reply_code = ?NOT_FOUND} ->
-            ok
-    after ?TIMEOUT -> throw(failed_to_receive_channel_exit)
-    end,
-    rabbit_channel:shutdown(Ch2),
-    passed.
-
-declare_on_dead_queue(Config) ->
-    {I, J} = ?config(test_direction, Config),
-    From = rabbit_ct_broker_helpers:get_node_config(Config, I, nodename),
-    To = rabbit_ct_broker_helpers:get_node_config(Config, J, nodename),
-    rabbit_ct_broker_helpers:add_code_path_to_node(To, ?MODULE),
-    passed = rabbit_ct_broker_helpers:rpc(Config,
-      From, ?MODULE, declare_on_dead_queue1, [Config, To]).
-
-declare_on_dead_queue1(_Config, SecondaryNode) ->
-    QueueName = rabbit_misc:r(<<"/">>, queue, ?CLEANUP_QUEUE_NAME),
-    Self = self(),
-    Pid = spawn(SecondaryNode,
-                fun () ->
-                        {new, #amqqueue{name = QueueName, pid = QPid}} =
-                            rabbit_amqqueue:declare(QueueName, false, false, [],
-                                                    none),
-                        exit(QPid, kill),
-                        Self ! {self(), killed, QPid}
-                end),
-    receive
-        {Pid, killed, OldPid} ->
-            Q = dead_queue_loop(QueueName, OldPid),
-            {ok, 0} = rabbit_amqqueue:delete(Q, false, false),
-            passed
-    after ?TIMEOUT -> throw(failed_to_create_and_kill_queue)
-    end.
-
-refresh_events(Config) ->
-    {I, J} = ?config(test_direction, Config),
-    From = rabbit_ct_broker_helpers:get_node_config(Config, I, nodename),
-    To = rabbit_ct_broker_helpers:get_node_config(Config, J, nodename),
-    rabbit_ct_broker_helpers:add_code_path_to_node(To, ?MODULE),
-    passed = rabbit_ct_broker_helpers:rpc(Config,
-      From, ?MODULE, refresh_events1, [Config, To]).
-
-refresh_events1(Config, SecondaryNode) ->
-    dummy_event_receiver:start(self(), [node(), SecondaryNode],
-                               [channel_created, queue_created]),
-
-    {_Writer, Ch} = test_spawn(),
-    expect_events(pid, Ch, channel_created),
-    rabbit_channel:shutdown(Ch),
-
-    {_Writer2, Ch2} = test_spawn(SecondaryNode),
-    expect_events(pid, Ch2, channel_created),
-    rabbit_channel:shutdown(Ch2),
-
-    {new, #amqqueue{name = QName} = Q} =
-        rabbit_amqqueue:declare(queue_name(Config, <<"refresh_events-q">>),
-                                false, false, [], none),
-    expect_events(name, QName, queue_created),
-    rabbit_amqqueue:delete(Q, false, false),
-
-    dummy_event_receiver:stop(),
-    passed.
-
-make_responder(FMsg) -> make_responder(FMsg, timeout).
-make_responder(FMsg, Throw) ->
-    fun () ->
-            receive Msg -> FMsg(Msg)
-            after ?TIMEOUT -> throw(Throw)
-            end
-    end.
-
-spawn_responders(Node, Responder, Count) ->
-    [spawn(Node, Responder) || _ <- lists:seq(1, Count)].
-
-await_response(0) ->
-    ok;
-await_response(Count) ->
-    receive
-        response -> ok,
-                    await_response(Count - 1)
-    after ?TIMEOUT -> throw(timeout)
-    end.
-
-must_exit(Fun) ->
-    try
-        Fun(),
-        throw(exit_not_thrown)
-    catch
-        exit:_ -> ok
-    end.
-
-dead_queue_loop(QueueName, OldPid) ->
-    {existing, Q} = rabbit_amqqueue:declare(QueueName, false, false, [], none),
-    case Q#amqqueue.pid of
-        OldPid -> timer:sleep(25),
-                  dead_queue_loop(QueueName, OldPid);
-        _      -> true = rabbit_misc:is_process_alive(Q#amqqueue.pid),
-                  Q
-    end.
-
-expect_events(Tag, Key, Type) ->
-    expect_event(Tag, Key, Type),
-    rabbit:force_event_refresh(make_ref()),
-    expect_event(Tag, Key, Type).
-
-expect_event(Tag, Key, Type) ->
-    receive #event{type = Type, props = Props} ->
-            case rabbit_misc:pget(Tag, Props) of
-                Key -> ok;
-                _   -> expect_event(Tag, Key, Type)
-            end
-    after ?TIMEOUT -> throw({failed_to_receive_event, Type})
-    end.
-
-%% ---------------------------------------------------------------------------
-%% rabbitmqctl helpers.
-%% ---------------------------------------------------------------------------
-
-control_action(Command, Args) ->
-    control_action(Command, node(), Args, default_options()).
-
-control_action(Command, Args, NewOpts) ->
-    control_action(Command, node(), Args,
-                   expand_options(default_options(), NewOpts)).
-
-control_action(Command, Node, Args, Opts) ->
-    case catch rabbit_control_main:action(
-                 Command, Node, Args, Opts,
-                 fun (Format, Args1) ->
-                         io:format(Format ++ " ...~n", Args1)
-                 end) of
-        ok ->
-            io:format("done.~n"),
-            ok;
-        {ok, Result} ->
-            rabbit_control_misc:print_cmd_result(Command, Result),
-            ok;
-        Other ->
-            io:format("failed: ~p~n", [Other]),
-            Other
-    end.
-
-control_action_t(Command, Args, Timeout) when is_number(Timeout) ->
-    control_action_t(Command, node(), Args, default_options(), Timeout).
-
-control_action_t(Command, Args, NewOpts, Timeout) when is_number(Timeout) ->
-    control_action_t(Command, node(), Args,
-                     expand_options(default_options(), NewOpts),
-                     Timeout).
-
-control_action_t(Command, Node, Args, Opts, Timeout) when is_number(Timeout) ->
-    case catch rabbit_control_main:action(
-                 Command, Node, Args, Opts,
-                 fun (Format, Args1) ->
-                         io:format(Format ++ " ...~n", Args1)
-                 end, Timeout) of
-        ok ->
-            io:format("done.~n"),
-            ok;
-        {ok, Result} ->
-            rabbit_control_misc:print_cmd_result(Command, Result),
-            ok;
-        Other ->
-            io:format("failed: ~p~n", [Other]),
-            Other
-    end.
-
-control_action_opts(Raw) ->
-    NodeStr = atom_to_list(node()),
-    case rabbit_control_main:parse_arguments(Raw, NodeStr) of
-        {ok, {Cmd, Opts, Args}} ->
-            case control_action(Cmd, node(), Args, Opts) of
-                ok    -> ok;
-                Error -> Error
-            end;
-        Error ->
-            Error
-    end.
-
-info_action(Command, Args, CheckVHost) ->
-    ok = control_action(Command, []),
-    if CheckVHost -> ok = control_action(Command, [], ["-p", "/"]);
-       true       -> ok
-    end,
-    ok = control_action(Command, lists:map(fun atom_to_list/1, Args)),
-    {bad_argument, dummy} = control_action(Command, ["dummy"]),
-    ok.
-
-info_action_t(Command, Args, CheckVHost, Timeout) when is_number(Timeout) ->
-    if CheckVHost -> ok = control_action_t(Command, [], ["-p", "/"], Timeout);
-       true       -> ok
-    end,
-    ok = control_action_t(Command, lists:map(fun atom_to_list/1, Args), Timeout),
-    ok.
-
-default_options() -> [{"-p", "/"}, {"-q", "false"}].
-
-expand_options(As, Bs) ->
-    lists:foldl(fun({K, _}=A, R) ->
-                        case proplists:is_defined(K, R) of
-                            true -> R;
-                            false -> [A | R]
-                        end
-                end, Bs, As).
similarity index 84%
rename from rabbitmq-server/scripts/rabbitmq-server-ha.ocf
rename to scripts/rabbitmq-server-ha.ocf
index cd07d0c1b0d32f5c3f0cf30ba41407e3fa045693..49f3af769695bf7e6f03a599918de1ae1d59f580 100755 (executable)
@@ -39,6 +39,7 @@ OCF_RESKEY_definitions_dump_file_default="/etc/rabbitmq/definitions"
 OCF_RESKEY_pid_file_default="/var/run/rabbitmq/pid"
 OCF_RESKEY_log_dir_default="/var/log/rabbitmq"
 OCF_RESKEY_mnesia_base_default="/var/lib/rabbitmq/mnesia"
+OCF_RESKEY_mnesia_schema_base_default="/var/lib/rabbitmq"
 OCF_RESKEY_host_ip_default="127.0.0.1"
 OCF_RESKEY_node_port_default=5672
 OCF_RESKEY_erlang_cookie_default=false
@@ -47,6 +48,8 @@ OCF_RESKEY_use_fqdn_default=false
 OCF_RESKEY_fqdn_prefix_default=""
 OCF_RESKEY_max_rabbitmqctl_timeouts_default=3
 OCF_RESKEY_policy_file_default="/usr/local/sbin/set_rabbitmq_policy"
+OCF_RESKEY_rmq_feature_health_check_default=true
+OCF_RESKEY_rmq_feature_local_list_queues_default=true
 
 : ${HA_LOGTAG="lrmd"}
 : ${HA_LOGFACILITY="daemon"}
@@ -60,6 +63,7 @@ OCF_RESKEY_policy_file_default="/usr/local/sbin/set_rabbitmq_policy"
 : ${OCF_RESKEY_definitions_dump_file=${OCF_RESKEY_definitions_dump_file_default}}
 : ${OCF_RESKEY_log_dir=${OCF_RESKEY_log_dir_default}}
 : ${OCF_RESKEY_mnesia_base=${OCF_RESKEY_mnesia_base_default}}
+: ${OCF_RESKEY_mnesia_schema_base=${OCF_RESKEY_mnesia_schema_base_default}}
 : ${OCF_RESKEY_pid_file=${OCF_RESKEY_pid_file_default}}
 : ${OCF_RESKEY_node_port=${OCF_RESKEY_node_port_default}}
 : ${OCF_RESKEY_erlang_cookie=${OCF_RESKEY_erlang_cookie_default}}
@@ -68,6 +72,8 @@ OCF_RESKEY_policy_file_default="/usr/local/sbin/set_rabbitmq_policy"
 : ${OCF_RESKEY_fqdn_prefix=${OCF_RESKEY_fqdn_prefix_default}}
 : ${OCF_RESKEY_max_rabbitmqctl_timeouts=${OCF_RESKEY_max_rabbitmqctl_timeouts_default}}
 : ${OCF_RESKEY_policy_file=${OCF_RESKEY_policy_file_default}}
+: ${OCF_RESKEY_rmq_feature_health_check=${OCF_RESKEY_rmq_feature_health_check_default}}
+: ${OCF_RESKEY_rmq_feature_local_list_queues=${OCF_RESKEY_rmq_feature_local_list_queues_default}}
 
 #######################################################################
 
@@ -230,6 +236,14 @@ Base directory for storing Mnesia files
 <content type="boolean" default="${OCF_RESKEY_mnesia_base_default}" />
 </parameter>
 
+<parameter name="mnesia_schema_base" unique="0" required="0">
+<longdesc lang="en">
+Parent directory for Mnesia schema directory
+</longdesc>
+<shortdesc lang="en">Parent directory for Mnesia schema directory</shortdesc>
+<content type="string" default="${OCF_RESKEY_mnesia_schema_base_default}" />
+</parameter>
+
 <parameter name="host_ip" unique="0" required="0">
 <longdesc lang="en">
 ${OCF_RESKEY_binary} should listen on this IP address
@@ -298,6 +312,26 @@ A path to the shell script to setup RabbitMQ policies
 <content type="string" default="${OCF_RESKEY_policy_file_default}" />
 </parameter>
 
+<parameter name="rmq_feature_health_check" unique="0" required="0">
+<longdesc lang="en">
+Since rabbit 3.6.4 list_queues/list_channels-based monitoring should
+be replaced with "node_health_check" command, as it creates no network
+load at all.
+</longdesc>
+<shortdesc lang="en">Use node_health_check for monitoring</shortdesc>
+<content type="boolean" default="${OCF_RESKEY_rmq_feature_health_check_default}" />
+</parameter>
+
+<parameter name="rmq_feature_local_list_queues" unique="0" required="0">
+<longdesc lang="en">
+For rabbit version that implements --local flag for list_queues, this
+can greatly reduce network overhead in cases when node is
+stopped/demoted.
+</longdesc>
+<shortdesc lang="en">Use --local option for list_queues</shortdesc>
+<content type="boolean" default="${OCF_RESKEY_rmq_feature_local_list_queues_default}" />
+</parameter>
+
 $EXTENDED_OCF_PARAMS
 
 </parameters>
@@ -308,7 +342,6 @@ $EXTENDED_OCF_PARAMS
 <action name="status" timeout="20" />
 <action name="monitor" depth="0" timeout="30" interval="5" />
 <action name="monitor" depth="0" timeout="30" interval="3" role="Master"/>
-<action name="monitor" depth="30" timeout="60" interval="103" />
 <action name="promote" timeout="30" />
 <action name="demote"  timeout="30" />
 <action name="notify"   timeout="20" />
@@ -319,6 +352,11 @@ $EXTENDED_OCF_PARAMS
 END
 }
 
+
+MIN_MASTER_SCORE=100
+BEST_MASTER_SCORE=1000
+
+
 #######################################################################
 # Functions invoked by resource manager actions
 
@@ -360,8 +398,8 @@ proc_kill()
         local matched
         matched="$(pgrep -fla ${service_name})"
         if [ -z "${matched}" ] ; then
-            ocf_log err "${LH} cannot find any processes matching the ${service_name}!"
-            return 2
+            ocf_log info "${LH} cannot find any processes matching the ${service_name}, considering target process to be already dead"
+            return 0
         fi
         ocf_log debug "${LH} no pid provided, will try the ${service_name}, matched list: ${matched}"
         while [ $count -gt 0 ]; do
@@ -571,17 +609,21 @@ my_host() {
     return $rc
 }
 
-srv_uptime() {
-    local stime
-    stime=$( crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --query 2>/dev/null | awk '{print $3}' | awk -F "=" '{print $2}' | sed -e '/(null)/d' )
-
-    if [ -z "${stime}" -o "${stime}" = "(null)" ] ; then
-        echo 0
-    else
-        echo $(( $(now) - ${stime} ))
+get_integer_node_attr() {
+    local value
+    value=$(crm_attribute -N $1 -l reboot --name "$2" --query 2>/dev/null | awk '{ split($3, vals, "="); if (vals[2] != "(null)") print vals[2] }')
+    if [ $? -ne 0 -o -z "$value" ] ; then
+        value=0
     fi
+    echo $value
+}
 
-    return $OCF_SUCCESS
+get_node_start_time() {
+    get_integer_node_attr $1 'rabbit-start-time'
+}
+
+get_node_master_score() {
+    get_integer_node_attr $1 'master-p_rabbitmq-server'
 }
 
 # Return either rabbit node name as FQDN or shortname, depends on the OCF_RESKEY_use_fqdn.
@@ -679,7 +721,9 @@ reset_mnesia() {
     if $make_amnesia ; then
         kill_rmq_and_remove_pid
         ocf_run rm -rf "${MNESIA_FILES}"
-        ocf_log warn "${LH} Mnesia files appear corrupted and have been removed from ${MNESIA_FILES}."
+        mnesia_schema_location="${OCF_RESKEY_mnesia_schema_base}/Mnesia.$(rabbit_node_name $(get_hostname))"
+        ocf_run rm -rf "$mnesia_schema_location"
+        ocf_log warn "${LH} Mnesia files appear corrupted and have been removed from ${MNESIA_FILES} and $mnesia_schema_location"
     fi
     # always return OCF SUCCESS
     return $OCF_SUCCESS
@@ -691,9 +735,9 @@ block_client_access()
     # do not add temporary RMQ blocking rule, if it is already exist
     # otherwise, try to add a blocking rule with max of 5 retries
     local tries=5
-    until $(iptables -nvL | grep -q 'temporary RMQ block') || [ $tries -eq 0 ]; do
+    until $(iptables -nvL --wait | grep -q 'temporary RMQ block') || [ $tries -eq 0 ]; do
       tries=$((tries-1))
-      iptables -I INPUT -p tcp -m tcp --dport ${OCF_RESKEY_node_port} -m state --state NEW,RELATED,ESTABLISHED \
+      iptables --wait -I INPUT -p tcp -m tcp --dport ${OCF_RESKEY_node_port} -m state --state NEW,RELATED,ESTABLISHED \
       -m comment --comment 'temporary RMQ block' -j REJECT --reject-with tcp-reset
       sleep 1
     done
@@ -707,8 +751,8 @@ block_client_access()
 unblock_client_access()
 {
     # remove all temporary RMQ blocking rules, if there are more than one exist
-    for i in $(iptables -nvL --line-numbers | awk '/temporary RMQ block/ {print $1}'); do
-      iptables -D INPUT -p tcp -m tcp --dport ${OCF_RESKEY_node_port} -m state --state NEW,RELATED,ESTABLISHED \
+    for i in $(iptables -nvL --wait --line-numbers | awk '/temporary RMQ block/ {print $1}'); do
+      iptables --wait -D INPUT -p tcp -m tcp --dport ${OCF_RESKEY_node_port} -m state --state NEW,RELATED,ESTABLISHED \
       -m comment --comment 'temporary RMQ block' -j REJECT --reject-with tcp-reset
     done
 }
@@ -746,12 +790,6 @@ get_running_nodes() {
     return $?
 }
 
-# Get all known cluster nodes including offline ones
-get_all_pacemaker_nodes()
-{
-    echo `crm_node -l | awk '{print $2}' | grep -v "^$" | sed -e '/(null)/d'`
-}
-
 # Get alive cluster nodes in visible partition, but the specified one
 get_alive_pacemaker_nodes_but()
 {
@@ -779,10 +817,46 @@ get_master_name_but()
     done
 }
 
+# Evals some erlang code on current node
+erl_eval() {
+    local fmt="${1:?}"
+    shift
+
+    $COMMAND_TIMEOUT ${OCF_RESKEY_ctl} eval "$(printf "$fmt" "$@")"
+}
+
 # Returns 0 if we are clustered with provideded node
 is_clustered_with()
 {
-    get_running_nodes | grep -q $(rabbit_node_name $1);
+    local LH="${LH}: is_clustered_with: "
+    local node_name
+    local rc
+    node_name=$(rabbit_node_name $1)
+
+    local seen_as_running
+    seen_as_running=$(erl_eval "lists:member('%s', rabbit_mnesia:cluster_nodes(running))." "$node_name")
+    rc=$?
+    if [ "$rc" -ne 0 ]; then
+        ocf_log err "${LH} Failed to check whether '$node_name' is considered running by us"
+        # XXX Or should we give remote node benefit of a doubt?
+        return 1
+    elif [ "$seen_as_running" != true ]; then
+        ocf_log info "${LH} Node $node_name is not running, considering it not clustered with us"
+        return 1
+    fi
+
+    local seen_as_partitioned
+    seen_as_partitioned=$(erl_eval "lists:member('%s', rabbit_node_monitor:partitions())." "$node_name")
+    rc=$?
+    if [ "$rc" -ne 0 ]; then
+        ocf_log err "${LH} Failed to check whether '$node_name' is partitioned with us"
+        # XXX Or should we give remote node benefit of a doubt?
+        return 1
+    elif [ "$seen_as_partitioned" != false ]; then
+        ocf_log info "${LH} Node $node_name is partitioned from us"
+        return 1
+    fi
+
     return $?
 }
 
@@ -873,12 +947,21 @@ action_validate() {
     return $OCF_SUCCESS
 }
 
+update_rabbit_start_time_if_rc() {
+    local nowtime
+    local rc=$1
+    if [ $rc -eq 0 ]; then
+        nowtime="$(now)"
+        ocf_log info "${LH} Rabbit app started successfully. Updating start time attribute with ${nowtime}"
+        ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --update "${nowtime}"
+    fi
+}
+
 join_to_cluster() {
     local node="$1"
     local rmq_node
     local rc=$OCF_ERR_GENERIC
     local LH="${LL} join_to_cluster():"
-    local nowtime
 
     ocf_log info "${LH} start."
 
@@ -912,9 +995,7 @@ join_to_cluster() {
         action_stop
         return $OCF_ERR_GENERIC
     else
-        nowtime="$(now)"
-        ocf_log info "${LH} Rabbit app started successfully. Updating start time attribute with ${nowtime}"
-        ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --update "${nowtime}"
+        update_rabbit_start_time_if_rc 0
         ocf_log info "${LH} Joined to cluster succesfully."
     fi
 
@@ -996,7 +1077,7 @@ stop_server_process() {
     if [ $rc -ne 0 ] ; then
         # Try to stop without known PID
         ocf_log err "${LH} RMQ-server process PIDFILE was not found!"
-        su_rabbit_cmd "${OCF_RESKEY_ctl} stop 2>&1 >> \"${OCF_RESKEY_log_dir}/shutdown_log\""
+        su_rabbit_cmd "${OCF_RESKEY_ctl} stop >> \"${OCF_RESKEY_log_dir}/shutdown_log\" 2>&1"
         if [ $? -eq 0 ] ; then
             ocf_log info "${LH} RMQ-server process stopped succesfully, although there was no PIDFILE found."
             ocf_log info "${LH} grant a graceful termintation window ${OCF_RESKEY_stop_time} to end its beam"
@@ -1007,7 +1088,7 @@ stop_server_process() {
     elif [ "${pid}" ] ; then
         # Try to stop gracefully by known PID
         ocf_log info "${LH} Execute stop with timeout: ${TIMEOUT_ARG}"
-        su_rabbit_cmd "${OCF_RESKEY_ctl} stop ${OCF_RESKEY_pid_file} 2>&1 >> \"${OCF_RESKEY_log_dir}/shutdown_log\""
+        su_rabbit_cmd "${OCF_RESKEY_ctl} stop ${OCF_RESKEY_pid_file} >> \"${OCF_RESKEY_log_dir}/shutdown_log\" 2>&1"
         [ $? -eq 0 ] && ocf_log info "${LH} RMQ-server process (PID=${pid}) stopped succesfully."
     fi
 
@@ -1017,14 +1098,9 @@ stop_server_process() {
     if [ -f ${OCF_RESKEY_pid_file} -o $rc -eq 0 ] ; then
         ocf_log warn "${LH} The pidfile or beam's still exist, forcing the RMQ-server cleanup"
         kill_rmq_and_remove_pid
-    fi
-
-    # Return the actual status
-    get_status
-    if [ $? -ne 0 ] ; then
-        return $OCF_SUCCESS
+        return $?
     else
-        return $OCF_ERR_GENERIC
+        return $OCF_SUCCESS
     fi
 }
 
@@ -1042,7 +1118,7 @@ stop_rmq_server_app() {
 
     # stop the app
     ocf_log info "${LH} Execute stop_app with timeout: ${TIMEOUT_ARG}"
-    su_rabbit_cmd "${OCF_RESKEY_ctl} stop_app 2>&1 >> \"${OCF_RESKEY_log_dir}/shutdown_log\""
+    su_rabbit_cmd "${OCF_RESKEY_ctl} stop_app >> \"${OCF_RESKEY_log_dir}/shutdown_log\" 2>&1"
     rc=$?
     if [ $rc -ne 0 ] ; then
          ocf_log err "${LH} RMQ-server app cannot be stopped."
@@ -1075,7 +1151,7 @@ start_beam_process() {
         ocf_log warn "${LH} found old PID-file '${OCF_RESKEY_pid_file}'."
         pid=$(cat ${OCF_RESKEY_pid_file})
         if [ "${pid}" -a -d "/proc/${pid}" ] ; then
-            ocf_run cat /proc/${pid}/cmdline | grep -c 'bin/beam' 2>&1 > /dev/null
+            ocf_run cat /proc/${pid}/cmdline | grep -c 'bin/beam' > /dev/null 2>&1
             rc=$?
             if [ $rc -eq $OCF_SUCCESS ] ; then
                 ocf_log warn "${LH} found beam process with PID=${pid}, killing...'."
@@ -1245,7 +1321,7 @@ start_rmq_server_app() {
     rc=$?
     if [ $rc -eq $OCF_SUCCESS ] ; then
         # rabbitmq-server started successfuly as master of cluster
-        master_score 1  # minimal positive master-score for this node.
+        master_score $MIN_MASTER_SCORE
         stop_rmq_server_app
         rc=$?
         if [ $rc -ne 0 ] ; then
@@ -1269,7 +1345,7 @@ start_rmq_server_app() {
                 if [ $rc -eq $OCF_SUCCESS ]; then
                     ocf_log info "${LH} RMQ-server app Mnesia cleaned successfully."
                     rc=$OCF_SUCCESS
-                    master_score 1
+                    master_score $MIN_MASTER_SCORE
                     break
                 else
                     ocf_log err "${LH} RMQ-server app can't be stopped during Mnesia cleaning. Beam will be killed."
@@ -1318,7 +1394,7 @@ get_status() {
     # try to parse the which_applications() output only if it exited w/o errors
     if [ "${what}" -a $rc -eq 0 ] ; then
         rc=$OCF_NOT_RUNNING
-        echo "$body" | grep "\{${what}," 2>&1 > /dev/null && rc=$OCF_SUCCESS
+        echo "$body" | grep "\{${what}," > /dev/null 2>&1 && rc=$OCF_SUCCESS
 
         if [ $rc -ne $OCF_SUCCESS ] ; then
             ocf_log info "${LH} app ${what} was not found in command output: ${body}"
@@ -1361,26 +1437,21 @@ check_timeouts() {
     local timeouts_attr_name=$2
     local op_name=$3
 
-    if [ $op_rc -ne 124 -a $op_rc -ne 137 ]; then
-        ocf_run attrd_updater -p --name $timeouts_attr_name --update 0
+    # 75 is EX_TEMPFAIL from sysexits, and is used by rabbitmqctl to signal about
+    # timeout.
+    if [ $op_rc -ne 124 -a $op_rc -ne 137 -a $op_rc -ne 75 ]; then
+        ocf_update_private_attr $timeouts_attr_name 0
         return 0
     fi
 
     local count
-    count=`attrd_updater --name $timeouts_attr_name --query 2>/dev/null`
-    if [ $? -ne 0 ]; then
-        # the attrd_updater exited with error. In that case most probably it printed garbage
-        # instead of the number we need. So defensively assume that it is zero.
-
-        count=0
-    fi
-    count=`echo "${count}" | awk '{print $3}' | awk -F "=" '{print $2}' | sed -e '/(null)/d'`
+    count=$(ocf_get_private_attr $timeouts_attr_name 0)
 
     count=$((count+1))
     # There is a slight chance that this piece of code will be executed twice simultaneously.
     # As a result, $timeouts_attr_name's value will be one less than it should be. But we don't need
     # precise calculation here.
-    ocf_run attrd_updater -p --name $timeouts_attr_name --update $count
+    ocf_update_private_attr $timeouts_attr_name $count
 
     if [ $count -lt $OCF_RESKEY_max_rabbitmqctl_timeouts ]; then
         ocf_log warn "${LH} 'rabbitmqctl $op_name' timed out $count of max. $OCF_RESKEY_max_rabbitmqctl_timeouts time(s) in a row. Doing nothing for now."
@@ -1392,12 +1463,20 @@ check_timeouts() {
 }
 
 wait_sync() {
-  wait_time=$1
+    local wait_time=$1
+    local queues
+    local opt_arg=""
 
-  queues="${COMMAND_TIMEOUT} ${OCF_RESKEY_ctl} list_queues name state"
-  su_rabbit_cmd -t "${wait_time}" "sh -c \"while ${queues} | grep -q 'syncing,'; \
-      do sleep 2; done\""
-  return $?
+    if [ "$OCF_RESKEY_rmq_feature_local_list_queues" = "true" ]; then
+        opt_arg="--local"
+    fi
+
+    queues="${COMMAND_TIMEOUT} ${OCF_RESKEY_ctl} list_queues $opt_arg name state"
+
+    su_rabbit_cmd -t "${wait_time}" "sh -c \"while ${queues} | grep -q 'syncing,'; \
+          do sleep 2; done\""
+
+    return $?
 }
 
 get_monitor() {
@@ -1407,11 +1486,10 @@ get_monitor() {
     local rabbit_running
     local name
     local node
-    local nodelist
-    local max
-    local our_uptime
-    local node_uptime
     local node_start_time
+    local nowtime
+    local partitions_report
+    local node_partitions
 
     ocf_log info "${LH} CHECK LEVEL IS: ${OCF_CHECK_LEVEL}"
     get_status
@@ -1442,46 +1520,27 @@ get_monitor() {
     rabbit_running=$?
     ocf_log info "${LH} checking if rabbit app is running"
 
-    if [ $rabbit_running -eq $OCF_SUCCESS ]
-    then
-        ocf_log info "${LH} rabbit app is running. checking if we are the part of healthy cluster"
-
-        if [ $rc -eq $OCF_RUNNING_MASTER ] ; then
-            # The master is always running inside of its cluster
+    if [ $rc -eq $OCF_RUNNING_MASTER ]; then
+        if [ $rabbit_running -eq $OCF_SUCCESS ]; then
             ocf_log info "${LH} rabbit app is running and is master of cluster"
-
         else
-            local master_name=$(get_master_name_but $THIS_PCMK_NODE)
-
-            if [ -z "$master_name" ]; then
-                ocf_log info "${LH} no master is elected currently. Skipping cluster health check."
-
-            elif is_clustered_with $master_name; then
-                ocf_log info "${LH} rabbit app is running and is member of healthy cluster"
-
-            else
-                # Rabbit is running but is not connected to master
-                # Failing to avoid split brain
-                ocf_log err "${LH} rabbit node is running out of the cluster"
-                stop_server_process
-                rc=$OCF_ERR_GENERIC
-            fi
+            ocf_log err "${LH} we are the master and rabbit app is not running. This is a failure"
+            exit $OCF_FAILED_MASTER
         fi
     else
-        if [ "$OCF_CHECK_LEVEL" -gt 20 ]; then
-            ocf_log info "${LH} rabbit app is not running. checking if there is a master"
-            # Do not refetch the master status as we know it already
-            if [ $rc -eq $OCF_RUNNING_MASTER ]; then
-              ocf_log err "${LH} we are the master and rabbit app is not running. this is a failure"
-              exit $OCF_FAILED_MASTER
-            fi
-
-            local master_name=$(get_master_name_but $THIS_PCMK_NODE)
-
-            if [ -n "$master_name" ]; then
-                ocf_log info "${LH} master exists and rabbit app is not running. Exiting to be restarted by pacemaker"
+        start_time=$((180 + $(ocf_get_private_attr 'rabbit-start-phase-1-time' 0)))
+        restart_order_time=$((60 + $(ocf_get_private_attr 'rabbit-ordered-to-restart' 0)))
+        nowtime=$(now)
+
+        # If we started more than 3 minutes ago, and
+        # we got order to restart less than 1 minute ago
+        if [ $nowtime -lt $restart_order_time ]; then
+            if [ $nowtime -gt $start_time ]; then
+                ocf_log err "${LH} failing because we have received an order to restart from the master"
                 stop_server_process
                 rc=$OCF_ERR_GENERIC
+            else
+                ocf_log warn "${LH} received an order to restart from the master, ignoring it because we have just started"
             fi
         fi
     fi
@@ -1491,45 +1550,37 @@ get_monitor() {
         ocf_log info "${LH} ensuring this slave does not get promoted."
         master_score 0
         return $OCF_ERR_GENERIC
-    elif [ $rc -ne $OCF_RUNNING_MASTER ] ; then
-        ocf_log info "${LH} preparing to update master score for node"
-        our_uptime=$(srv_uptime)
-        nodelist=$(get_alive_pacemaker_nodes_but $THIS_PCMK_NODE)
-        max=1
-        for node in $nodelist
+    fi
+
+    # Recounting our master score
+    ocf_log info "${LH} preparing to update master score for node"
+    local our_start_time
+    local new_score
+    local node_start_time
+    local node_score
+
+    our_start_time=$(get_node_start_time $THIS_PCMK_NODE)
+
+    if [ $our_start_time -eq 0 ]; then
+        new_score=$MIN_MASTER_SCORE
+    else
+        new_score=$BEST_MASTER_SCORE
+        for node in $(get_alive_pacemaker_nodes_but $THIS_PCMK_NODE)
         do
-            node_start_time=`crm_attribute -N $node -l reboot --name 'rabbit-start-time' --query 2>/dev/null | awk '{print $3}' | awk -F "=" '{print $2}' | sed -e '/(null)/d'`
-            if [ -z "${node_start_time}" -o "${node_start_time}" = "(null)" ] ; then
-                node_uptime=0
-            else
-                node_uptime=$(( $(now) - ${node_start_time}  ))
-            fi
-            ocf_log info "${LH} comparing our uptime (${our_uptime}) with $node (${node_uptime})"
-            if [ ${our_uptime} -lt ${node_uptime} ]
-            then
-                max=1
-                break
-            else
-                # When uptime is equal, accept the existing master - if any - as the oldest node
-                is_master $node
-                status_master=$?
-                if [ $status_master -eq 0 ] ; then
-                    max=1
-                    ocf_log info "${LH} Found the oldest master node $node with uptime (${node_uptime})"
-                    break
-                else
-                    max=0
-                fi
+            node_start_time=$(get_node_start_time $node)
+            node_score=$(get_node_master_score $node)
+
+            ocf_log info "${LH} comparing us (start time: $our_start_time, score: $new_score) with $node (start time: $node_start_time, score: $node_score)"
+            if [ $node_start_time -ne 0 -a $node_score -ne 0 -a $node_start_time -lt $our_start_time ]; then
+                new_score=$((node_score - 10 < new_score ? node_score - 10 : new_score ))
             fi
         done
+    fi
 
-
-        if [ $max -eq 0 ]
-        then
-            ocf_log info "${LH} we are the oldest node"
-            master_score 1000
-        fi
+    if [ "$new_score" -ne "$(get_node_master_score $THIS_PCMK_NODE)" ]; then
+        master_score $new_score
     fi
+    ocf_log info "${LH} our start time is $our_start_time and score is $new_score"
 
     # Skip all other checks if rabbit app is not running
     if [ $rabbit_running -ne $OCF_SUCCESS ]; then
@@ -1537,10 +1588,132 @@ get_monitor() {
         return $rc
     fi
 
-    # Check if the rabbitmqctl control plane is alive.
+    # rc can be SUCCESS or RUNNING_MASTER, don't touch it unless there
+    # is some error uncovered by node_health_check
+    if ! node_health_check; then
+        rc=$OCF_ERR_GENERIC
+    fi
+
+    if [ $rc -eq $OCF_RUNNING_MASTER ] ; then
+        # If we are the master and healthy, perform various
+        # connectivity checks for other nodes in the cluster.
+        # Order a member to restart if something fishy happens with it.
+        # All cross-node checks MUST happen only here.
+
+        partitions_report="$(partitions_report)"
+
+        for node in $(get_alive_pacemaker_nodes_but $THIS_PCMK_NODE); do
+            # Restart node if we don't consider ourselves clustered with it
+            if ! is_clustered_with $node; then
+                ocf_log warn "${LH} node $node is not connected with us"
+                order_node_restart "$node"
+                continue
+            fi
+
+            # Restart node if it has any unresolved partitions
+            node_partitions=$(grep_partitions_report $node "$partitions_report")
+            if [ ! -z "$node_partitions" ]; then
+                ocf_log warn "${LH} Node $node thinks that it is partitoned with $node_partitions"
+                order_node_restart "$node"
+                continue
+            fi
+        done
+    fi
+
+    ocf_log info "${LH} get_monitor function ready to return ${rc}"
+    return $rc
+}
+
+order_node_restart() {
+    local node=${1:?}
+    ocf_log warn "${LH} Ordering node '$node' to restart"
+    ocf_update_private_attr 'rabbit-ordered-to-restart' "$(now)" "$node"
+}
+
+# Checks whether node is mentioned somewhere in report returned by
+# partitions_report()
+grep_partitions_report() {
+    local node="${1:?}"
+    local report="${2:?}"
+    local rabbit_node
+    rabbit_node=$(rabbit_node_name "$node")
+    echo "$report" | grep "PARTITIONED $rabbit_node:" | sed -e 's/^[^:]\+: //'
+}
+
+# Report partitions (if any) from viewpoint of every running node in cluster.
+# It is parseable/grepable version of `rabbitmqctl cluster_status`.
+#
+# If node sees partition, report will contain the line like:
+#     PARTITIONED node-name: list-of-nodes, which-node-name-considers, itself-partitioned-with
+partitions_report() {
+    $COMMAND_TIMEOUT xargs -0 ${OCF_RESKEY_ctl} eval <<EOF
+RpcTimeout = 10,
+
+Nodes = rabbit_mnesia:cluster_nodes(running),
+
+{Replies, _BadNodes} = gen_server:multi_call(Nodes, rabbit_node_monitor, partitions, RpcTimeout * 1000),
+
+lists:foreach(fun ({_, []}) -> ok;
+                  ({Node, Partitions}) ->
+                      PartitionsStr = string:join([atom_to_list(Part) || Part <- Partitions],
+                                                  ", "),
+                      io:format("PARTITIONED ~s: ~s~n",
+                                [Node, PartitionsStr])
+              end, Replies),
+
+ok.
+EOF
+}
+
+# Check if the rabbitmqctl control plane is alive.
+node_health_check() {
+    local rc
+    if [ "$OCF_RESKEY_rmq_feature_health_check" = true ]; then
+        node_health_check_local
+        rc=$?
+    else
+        node_health_check_legacy
+        rc=$?
+    fi
+    return $rc
+}
+
+node_health_check_local() {
+    local LH="${LH} node_health_check_local():"
+    local rc
+    local rc_timeouts
+
+    # Give node_health_check some time to handle timeout by itself.
+    # By using internal rabbitmqctl timeouts, we allow it to print
+    # more useful diagnostics
+    local timeout=$((TIMEOUT_ARG - 2))
+    su_rabbit_cmd "${OCF_RESKEY_ctl} node_health_check -t $timeout"
+    rc=$?
+
+    check_timeouts $rc "rabbit_node_health_check_timeouts" "node_health_check"
+    rc_timeouts=$?
+
+    if [ "$rc_timeouts" -eq 2 ]; then
+        master_score 0
+        ocf_log info "${LH} node_health_check timed out, retry limit reached"
+        return $OCF_ERR_GENERIC
+    elif [ "$rc_timeouts" -eq 1 ]; then
+        ocf_log info "${LH} node_health_check timed out, going to retry"
+        return $OCF_SUCCESS
+    fi
+
+    if [ "$rc" -ne 0 ]; then
+        ocf_log err "${LH} rabbitmqctl node_health_check exited with errors."
+        return $OCF_ERR_GENERIC
+    else
+        return $OCF_SUCCESS
+    fi
+}
+
+node_health_check_legacy() {
     local rc_alive
     local timeout_alive
-    su_rabbit_cmd "${OCF_RESKEY_ctl} list_channels 2>&1 > /dev/null"
+    su_rabbit_cmd "${OCF_RESKEY_ctl} list_channels > /dev/null 2>&1"
     rc_alive=$?
     [ $rc_alive -eq 137 -o $rc_alive -eq 124 ] && ocf_log err "${LH} 'rabbitmqctl list_channels' timed out, per-node explanation: $(enhanced_list_channels)"
     check_timeouts $rc_alive "rabbit_list_channels_timeouts" "list_channels"
@@ -1579,11 +1752,11 @@ get_monitor() {
             rc=$OCF_ERR_GENERIC
 
         elif [ -n "${alarms}" ]; then
-            for node in "${alarms}"; do
+            for node in ${alarms}; do
                 name=`echo ${node} | perl -n -e "m/memory,'(?<n>\S+)+'/ && print \"$+{n}\n\""`
                 if [ "${name}" = "${RABBITMQ_NODENAME}" ] ; then
                     ocf_log err "${LH} Found raised memory alarm. Erasing the alarm and restarting."
-                    su_rabbit_cmd "${OCF_RESKEY_ctl} set_vm_memory_high_watermark 10 2>&1 > /dev/null"
+                    su_rabbit_cmd "${OCF_RESKEY_ctl} set_vm_memory_high_watermark 10 > /dev/null 2>&1"
                     rc=$OCF_ERR_GENERIC
                     break
                 fi
@@ -1616,13 +1789,13 @@ get_monitor() {
 
         elif [ -n "${queues}" ]; then
             local q_c
-            q_c=`printf "%b\n" "${queues}" | wc -l`
+            q_c=`printf %b "${queues}\n" | wc -l`
             local mem
-            mem=`printf "%b\n" "${queues}" | awk -v sum=0 '{sum+=$1} END {print (sum/1048576)}'`
+            mem=`printf %b "${queues}\n" | awk -v sum=0 '{sum+=$1} END {print (sum/1048576)}'`
             local mes
-            mes=`printf "%b\n" "${queues}" | awk -v sum=0 '{sum+=$2} END {print sum}'`
+            mes=`printf %b "${queues}\n" | awk -v sum=0 '{sum+=$2} END {print sum}'`
             local c_u
-            c_u=`printf "%b\n" "${queues}" | awk -v sum=0 -v cnt=${q_c} '{sum+=$3} END {print (sum+1)/(cnt+1)}'`
+            c_u=`printf %b "${queues}\n" | awk -v sum=0 -v cnt=${q_c} '{sum+=$3} END {print (sum+1)/(cnt+1)}'`
             local status
             status=`echo $(su_rabbit_cmd "${OCF_RESKEY_ctl} -q status")`
             ocf_log info "${LH} RabbitMQ is running ${q_c} queues consuming ${mem}m of ${TOTALVMEM}m total, with ${mes} queued messages, average consumer utilization ${c_u}"
@@ -1630,14 +1803,27 @@ get_monitor() {
         fi
     fi
 
-    ocf_log info "${LH} get_monitor function ready to return ${rc}"
     return $rc
 }
 
+ocf_get_private_attr() {
+    local attr_name="${1:?}"
+    local attr_default_value="${2:?}"
+    local nodename="${3:-$THIS_PCMK_NODE}"
+    local count
+    count=$(attrd_updater -p --name "$attr_name" --node "$nodename" --query)
+    if [ $? -ne 0 ]; then
+        echo $attr_default_value
+    else
+        echo "$count" | awk -vdef_val="$attr_default_value" '{ gsub(/"/, "", $3); split($3, vals, "="); if (vals[2] != "") print vals[2]; else print def_val }'
+    fi
+}
+
 ocf_update_private_attr() {
     local attr_name="${1:?}"
     local attr_value="${2:?}"
-    ocf_run attrd_updater -p --name "$attr_name" --update "$attr_value"
+    local nodename="${3:-$THIS_PCMK_NODE}"
+    ocf_run attrd_updater -p --name "$attr_name" --node "$nodename" --update "$attr_value"
 }
 
 rabbitmqctl_with_timeout_check() {
@@ -1687,6 +1873,7 @@ action_monitor() {
 action_start() {
     local rc=$OCF_ERR_GENERIC
     local LH="${LL} start:"
+    local nowtime
 
     if [ "${OCF_RESKEY_debug}" = 'true' ] ; then
         d=`date '+%Y%m%d %H:%M:%S'`
@@ -1704,12 +1891,15 @@ action_start() {
         return $OCF_SUCCESS
     fi
 
-    local attrs_to_zero="rabbit_list_channels_timeouts rabbit_get_alarms_timeouts rabbit_list_queues_timeouts rabbit_cluster_status_timeouts"
+    local attrs_to_zero="rabbit_list_channels_timeouts rabbit_get_alarms_timeouts rabbit_list_queues_timeouts rabbit_cluster_status_timeouts rabbit_node_health_check_timeouts"
     local attr_name_to_reset
     for attr_name_to_reset in $attrs_to_zero; do
         ocf_update_private_attr $attr_name_to_reset 0
     done
 
+    nowtime=$(now)
+    ocf_log info "${LH} Setting phase 1 one start time to $nowtime"
+    ocf_update_private_attr 'rabbit-start-phase-1-time' "$nowtime"
     ocf_log info "${LH} Deleting start time attribute"
     ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --delete
     ocf_log info "${LH} Deleting master attribute"
@@ -1752,25 +1942,16 @@ action_stop() {
 
     ocf_log info "${LH} RMQ-runtime (beam) going to down."
     stop_server_process
-    # Fail early without additional rabbitmqctl invocations
-    if [ $? -ne $OCF_SUCCESS ] ; then
-        ocf_log err "RMQ-runtime (beam) couldn't be stopped and will likely became unmanaged. Take care of it manually!"
-        ocf_log info "${LH} action end."
-        exit $OCF_ERR_GENERIC
-    fi
 
-    # Ensure the actual status to be returned
-    get_status
-    if [ $? -eq $OCF_NOT_RUNNING ] ; then
-        ocf_log info "${LH} RMQ-runtime (beam) not running."
-        ocf_log info "${LH} action end."
-        return $OCF_SUCCESS
-    else
+    if [ $? -ne $OCF_SUCCESS ] ; then
         ocf_log err "RMQ-runtime (beam) couldn't be stopped and will likely became unmanaged. Take care of it manually!"
         ocf_log info "${LH} action end."
         exit $OCF_ERR_GENERIC
     fi
 
+    ocf_log info "${LH} RMQ-runtime (beam) not running."
+    ocf_log info "${LH} action end."
+    return $OCF_SUCCESS
 }
 
 #######################################################################
@@ -1915,7 +2096,6 @@ action_notify() {
     local rc2=$OCF_ERR_GENERIC
     local LH="${LL} notify:"
     local nodelist
-    local nowtime
 
     if [ "${OCF_RESKEY_debug}" = 'true' ] ; then
         d=`date '+%Y%m%d %H:%M:%S'`
@@ -1924,28 +2104,6 @@ action_notify() {
         echo "$d  [notify]  ${OCF_RESKEY_CRM_meta_notify_type}-${OCF_RESKEY_CRM_meta_notify_operation} promote='${OCF_RESKEY_CRM_meta_notify_promote_uname}' demote='${OCF_RESKEY_CRM_meta_notify_demote_uname}' master='${OCF_RESKEY_CRM_meta_notify_master_uname}' slave='${OCF_RESKEY_CRM_meta_notify_slave_uname}' start='${OCF_RESKEY_CRM_meta_notify_start_uname}' stop='${OCF_RESKEY_CRM_meta_notify_stop_uname}' active='${OCF_RESKEY_CRM_meta_notify_active_uname}' inactive='${OCF_RESKEY_CRM_meta_notify_inactive_uname}'" >> /tmp/rmq-ocf.log
     fi
 
-    if [ "${OCF_RESKEY_CRM_meta_notify_type}" = 'pre' ] ; then
-        # PRE- anything notify section
-        case "$OCF_RESKEY_CRM_meta_notify_operation" in
-            promote)
-                ocf_log info "${LH} pre-promote begin."
-                my_host "$OCF_RESKEY_CRM_meta_notify_promote_uname"
-                rc=$?
-                if [ $rc -eq $OCF_SUCCESS ] ; then
-                    nodelist=$(get_all_pacemaker_nodes)
-                    for i in $nodelist
-                    do
-                       ocf_log info "${LH} Deleting master attribute for node ${i}"
-                       ocf_run crm_attribute -N $i -l reboot --name 'rabbit-master' --delete
-                    done
-                    ocf_log info "${LH} pre-promote end."
-                fi
-                ;;
-            *)
-                ;;
-        esac
-    fi
-
     if [ "${OCF_RESKEY_CRM_meta_notify_type}" = 'post' ] ; then
         # POST- anything notify section
         case "$OCF_RESKEY_CRM_meta_notify_operation" in
@@ -1963,7 +2121,15 @@ action_notify() {
                     ocf_log info "${LH} ignoring post-promote of self"
 
                 elif is_clustered_with "${OCF_RESKEY_CRM_meta_notify_promote_uname}"; then
-                    ocf_log info "${LH} we are already clustered with master - ${OCF_RESKEY_CRM_meta_notify_promote_uname}. Nothing to do."
+                    if get_status rabbit; then
+                        ocf_log info "${LH} we are already clustered with master - ${OCF_RESKEY_CRM_meta_notify_promote_uname}. Nothing to do."
+                    else
+                        ocf_log info "${LH} we are already clustered with master - ${OCF_RESKEY_CRM_meta_notify_promote_uname}. We only need to start the app."
+
+                        try_to_start_rmq_app
+                        rc2=$?
+                        update_rabbit_start_time_if_rc $rc2
+                    fi
 
                 else
                     # Note, this should fail when the mnesia is inconsistent.
@@ -2012,14 +2178,10 @@ action_notify() {
                       rc2=$?
                     else
                       ocf_log warn "${LH} We are already clustered with node ${OCF_RESKEY_CRM_meta_notify_master_uname}"
-                      if try_to_start_rmq_app; then
-                          rc2=$OCF_SUCCESS
-                          nowtime="$(now)"
-                          ocf_log info "${LH} Updating start time attribute with ${nowtime}"
-                          ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --update "${nowtime}"
-                      else
-                          rc2=$OCF_ERR_GENERIC
-                      fi
+
+                      try_to_start_rmq_app
+                      rc2=$?
+                      update_rabbit_start_time_if_rc $rc2
                     fi
                     ocf_log info "${LH} post-start end."
                     if [ -s "${OCF_RESKEY_definitions_dump_file}" ] ; then
@@ -2064,42 +2226,6 @@ action_notify() {
                 # always returns OCF_SUCCESS
                 ocf_log info "${LH} post-stop end."
                 ;;
-            demote)
-                # if rabbitmq-server stops on any another node, we should remove it from cluster (as ordinary operation)
-                ocf_log info "${LH} post-demote begin."
-                # Report not running, if the list of nodes being demoted reported empty
-                if [ -z "${OCF_RESKEY_CRM_meta_notify_demote_uname}" ] ; then
-                  ocf_log warn "${LH} there are no nodes being demoted reported on post-demote. The resource will be restarted."
-                  ocf_log info "${LH} post-demote end."
-                  return $OCF_ERR_GENERIC
-                fi
-                my_host "${OCF_RESKEY_CRM_meta_notify_demote_uname}"
-                rc=$?
-                if [ $rc -ne $OCF_SUCCESS ] ; then
-                    # On ohter nodes processing the post-demote, make sure the demoted node will be forgotten
-                    unjoin_nodes_from_cluster "${OCF_RESKEY_CRM_meta_notify_demote_uname}"
-                else
-                    # Wait for synced state first
-                    ocf_log info "${LH} waiting $((OCF_RESKEY_stop_time/2)) to sync"
-                    wait_sync $((OCF_RESKEY_stop_time/2))
-                    # On the nodes being demoted, reset the master score
-                    ocf_log info "${LH} resetting the master score."
-                    master_score 0
-                    ocf_log info "${LH} Deleting start time attribute"
-                    ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --delete
-                    ocf_log info "${LH} Deleting master attribute"
-                    ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-master' --delete
-                    ocf_log info "${LH} master was demoted. stopping RabbitMQ app."
-                    stop_rmq_server_app
-                    rc2=$?
-                    if [ $rc2 -ne $OCF_SUCCESS ] ; then
-                        ocf_log err "${LH} RMQ-server app can't be stopped on post-demote. Master resource is failed"
-                        ocf_log info "${LH} post-demote end."
-                        exit $OCF_FAILED_MASTER
-                    fi
-                fi
-                ocf_log info "${LH} post-demote end."
-                ;;
             *)  ;;
         esac
     fi
@@ -2111,7 +2237,6 @@ action_notify() {
 action_promote() {
     local rc=$OCF_ERR_GENERIC
     local LH="${LL} promote:"
-    local nowtime
 
     if [ "${OCF_RESKEY_debug}" = 'true' ] ; then
         d=$(date '+%Y%m%d %H:%M:%S')
@@ -2149,10 +2274,8 @@ action_promote() {
 
                     [ -f "${OCF_RESKEY_policy_file}" ] && . "${OCF_RESKEY_policy_file}"
 
-                    # create timestamp file
-                    nowtime="$(now)"
-                    ocf_log info "${LH} Updating start timestamp with ${nowtime}"
-                    ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --update "${nowtime}"
+                    update_rabbit_start_time_if_rc $rc
+
                     ocf_log info "${LH} Checking master status"
                     get_monitor
                     rc=$?
@@ -2206,68 +2329,11 @@ action_promote() {
 
 
 action_demote() {
-    local rc=$OCF_ERR_GENERIC
     local LH="${LL} demote:"
-
-    if [ "${OCF_RESKEY_debug}" = 'true' ] ; then
-        d=`date '+%Y%m%d %H:%M:%S'`
-        echo $d >> /tmp/rmq-demote.log
-        env >> /tmp/rmq-demote.log
-        echo "$d  [demote]  start='${OCF_RESKEY_CRM_meta_notify_start_uname}' stop='${OCF_RESKEY_CRM_meta_notify_stop_uname}' active='${OCF_RESKEY_CRM_meta_notify_active_uname}' inactive='${OCF_RESKEY_CRM_meta_notify_inactive_uname}'" >> /tmp/rmq-ocf.log
-
-    fi
-
     ocf_log info "${LH} action begin."
-
-    get_monitor
-    rc=$?
-    case "$rc" in
-        "$OCF_RUNNING_MASTER")
-            # Running as master. Normal, expected behavior.
-            ocf_log warn "${LH} Resource is currently running as Master"
-            ocf_log info "${LH} Deleting master attribute"
-            ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-master' --delete
-            ocf_log info "${LH} Deleting start timestamp"
-            ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-start-time' --delete
-
-            # Wait for synced state first
-            ocf_log info "${LH} waiting $((OCF_RESKEY_stop_time/2)) to sync"
-            wait_sync $((OCF_RESKEY_stop_time/2))
-
-            stop_rmq_server_app
-            rc=$?
-            ;;
-        "$OCF_SUCCESS")
-            # Alread running as slave. Nothing to do.
-            ocf_log warn "${LH} Resource is currently running as Slave"
-            rc=$OCF_SUCCESS
-            ;;
-        "$OCF_FAILED_MASTER")
-            # Master failed and being demoted.
-            ocf_log err "${LH} Demoting of a failed Master."
-            ocf_log info "${LH} action end."
-            exit $OCF_FAILED_MASTER
-            ;;
-        "$OCF_NOT_RUNNING")
-            ocf_log warn "${LH} Try to demote currently not running resource. Nothing to do."
-            rc=$OCF_SUCCESS
-            ;;
-        "$OCF_ERR_GENERIC")
-            ocf_log err "${LH} Error while demote. Stopping resource."
-            action_stop
-            rc=$?
-            ;;
-        *)
-            # Failed resource. Let the cluster manager recover.
-            ocf_log err "${LH} Unexpected error, cannot demote"
-            ocf_log info "${LH} action end."
-            exit $rc
-            ;;
-    esac
-
-    # transform master RMQ-server to slave
+    ocf_run crm_attribute -N $THIS_PCMK_NODE -l reboot --name 'rabbit-master' --delete
     ocf_log info "${LH} action end."
-    return $rc
+    return $OCF_SUCCESS
 }
 #######################################################################
 
diff --git a/tests/runtests.sh b/tests/runtests.sh
deleted file mode 100755 (executable)
index c068407..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-#!/bin/bash
-set -o xtrace
-set -o nounset
-set -o errexit
-set -o pipefail
-
-PACKAGE="${1:?Usage: $0 <package-name>}"
-
-# Should be in separate directory, init script is creating/removing this dir
-rabbit_pid_path=/var/lib/rabbitmq/rabbitmq-pid-dir-for-tests/rabbit.pid
-mkdir -p $(dirname $rabbit_pid_path)
-chmod a+rwX $(dirname $rabbit_pid_path)
-
-if command -v systemctl > /dev/null; then
-    HAS_SYSTEMD=true
-else
-    HAS_SYSTEMD=false
-fi
-
-if [[ `cat /etc/*-release | head -n 1 | awk '{print $1}'` =~ Ubuntu ]]; then
-    OS=ubuntu
-    INSTALL_SHOULD_START=false
-    SHOULD_USE_HIPE=true
-    EPMD_UNIT=epmd
-else
-    OS=redhat
-    INSTALL_SHOULD_START=false
-    SHOULD_USE_HIPE=false
-    EPMD_UNIT=epmd@0.0.0.0
-fi
-
-install-packages-ubuntu() {
-    DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes "$@"
-}
-
-install-packages-redhat() {
-    yum install -y "$@"
-}
-
-install-packages() {
-    case $OS in
-        ubuntu)
-            install-packages-ubuntu "$@"
-            ;;
-        redhat)
-            install-packages-redhat "$@"
-            ;;
-        *)
-            echo "Unsupported os: $os"
-            exit 1
-    esac
-}
-
-start-service() {
-    local service="${1:?}"
-    service $service start
-}
-
-stop-service() {
-    local service="${1:?}"
-    service $service stop || true
-}
-
-run-ctl() {
-    /usr/bin/timeout 10 rabbitmqctl "$@"
-}
-
-rabbitmq-health-check() {
-    service rabbitmq-server status
-    run-ctl status
-    run-ctl list_channels
-    run-ctl list_queues
-}
-
-enable-management-plugin() {
-    rabbitmq-plugins enable rabbitmq_management
-}
-
-show-rabbit-startup-messages() {
-    set +e
-    case $OS in
-        ubuntu)
-            echo ==== /var/log/rabbitmq/startup_log
-            cat /var/log/rabbitmq/startup_log || true
-            echo ==== /var/log/rabbitmq/startup_err
-            cat /var/log/rabbitmq/startup_err || true
-            ;;
-        redhat)
-            journalctl _SYSTEMD_UNIT=rabbitmq-server.service
-            systemctl status rabbitmq-server.service
-            journalctl -xe
-            ;;
-    esac
-    set -e
-}
-
-configure-rabbitmq-server() {
-    mkdir -p /etc/rabbitmq
-    cat <<EOF > /etc/rabbitmq/rabbitmq-env.conf
-PID_FILE=$rabbit_pid_path
-NODENAME=rabbit@localhost
-SERVER_CODE_PATH=/var/lib/rabbitmq/native-code
-EOF
-}
-
-show-rabbit-logs() {
-    set +e
-    local log_file
-    ls -la /var/log/* || true
-    ls -la /var/lib/rabbitmq/* || true
-    ls -lad /tmp
-    for log_file in /var/log/rabbitmq/*.log; do
-        if [[ -e $log_file ]]; then
-            banner "Showing $log_file"
-            tail -n1000 $log_file
-        fi
-    done
-    set -e
-}
-
-start-rabbitmq-server() {
-    pkill -f beam || true
-    pkill -f epmd || true
-    if ! start-service rabbitmq-server; then
-        show-rabbit-startup-messages
-        show-rabbit-logs
-        return 1
-    fi
-    wait-rabbitmq
-}
-
-wait-rabbitmq() {
-    local try_no
-    for try_no in $(seq 1 10); do
-        if [[ -f $rabbit_pid_path ]]; then
-            break
-        fi
-    done
-
-    if [[ -f $rabbit_pid_path ]]; then
-        echo Rabbit PID is $(cat $rabbit_pid_path)
-    else
-        echo No rabbit pid-file yet, something is completely wrong
-        return 1
-    fi
-
-    run-ctl wait $rabbit_pid_path
-}
-
-install-helper-packages-redhat() {
-    install-packages epel-release
-}
-
-install-helper-packages() {
-    case $OS in
-        redhat)
-            install-helper-packages-redhat
-            ;;
-    esac
-
-    install-packages curl jq perl
-}
-
-rabbitmq-management-aliveness-test() {
-    local check_result
-    check_result=$(curl --silent --show-error -u guest:guest -X GET http://127.0.0.1:15672/api/aliveness-test/%2f | jq .status | perl -pe 's/^"|"$//g')
-    test "x$check_result" == xok
-}
-
-ensure-hipe-compiled() {
-    if [[ $SHOULD_USE_HIPE != true ]]; then
-        return 0
-    fi
-    local is_compiled
-    is_compiled=$(run-ctl eval "lists:module_info(native).")
-    if [[ $is_compiled != true ]]; then
-        echo "RabbitMQ is not using HiPE-compiled modules"
-        exit 1
-    fi
-}
-
-# rabbit may fail to notify systemd about successfull startup,
-# which'll result in timeouts and failures.
-test-repeated-restart() {
-    local try_no
-
-    stop-service rabbitmq-server
-    for try_no in $(seq 1 20); do
-        start-service rabbitmq-server
-        stop-service rabbitmq-server
-    done
-}
-
-# Logrotate should be able to successfully signal rabbit about a need
-# to reopen its logs.
-test-logrotate-sanity() {
-    logrotate -f /etc/logrotate.d/rabbitmq-server
-}
-
-validate-erlang-thread-pool-size() {
-    local pool_size_arg
-    start-service rabbitmq-server
-    pool_size_arg=$(ps ax | perl -nE '/-s rabbit boot/ && /^\s*(\d+).*?-A (\d+)/ && say "$2"' | head -n 1)
-    num_cores=$(erl -boot start_clean -noinput -eval 'io:format("~b", [erlang:system_info(logical_processors_available)]), erlang:halt(0).')
-    expected=$(($num_cores * 16))
-    if [[ $expected -lt 64 ]]; then
-        expected=64
-    elif [[ $expected -gt 1024 ]]; then
-        expected=1024
-    fi
-    if [[ $pool_size_arg -ne $expected ]]; then
-        echo "Async pool $pool_size_arg, but expected $expected"
-        exit 1
-    fi
-}
-
-# Our package should not start rabbit
-check-whether-rabbit-is-running-after-installation() {
-    local running_rc
-    set +e
-    pgrep -f beam > /dev/null
-    running_rc=$?
-    set -e
-
-    if [[ $INSTALL_SHOULD_START == true ]]; then
-        if [[ $running_rc -ne 0 ]]; then
-            echo "Installation process hasn't started rabbit, when it should have"
-            return 1
-        fi
-    else
-        if [[ $running_rc -eq 0 ]]; then
-            echo "Installation process has started rabbit, when it shoudn't have"
-            return 1
-        fi
-    fi
-}
-
-# Our package should not enable autostart of rabbti
-check-whether-rabbit-is-enabled-after-installation() {
-    local is_enabled=false
-    if command -v systemctl > /dev/null; then
-        if systemctl is-enabled rabbitmq-server > /dev/null 2>&1 ; then
-            is_enabled=true
-        fi
-    else
-        if [[ $(ls /etc/rc2.d/S*rabbitmq-server | wc -l) -ne 0 ]]; then
-            is_enabled=true
-        fi
-    fi
-    if [[ $INSTALL_SHOULD_START == true ]]; then
-        if [[ $is_enabled != true ]]; then
-            echo "Rabbitmq service wasn't enabled during installation, when it should"
-            return 1
-        fi
-    else
-        if [[ $is_enabled != false ]]; then
-            echo "Rabbit service was enabled during installation, when it shouldn't"
-        fi
-    fi
-}
-
-epmd-should-be-managed-by-systemd() {
-    if [[ $HAS_SYSTEMD != true ]]; then
-        return 0
-    fi
-    stop-service rabbitmq-server
-    systemctl stop epmd.socket
-    systemctl stop epmd.service
-    pkill -f epmd || true
-    start-service rabbitmq-server
-    if systemctl status rabitmq-server | grep -q epmd ; then
-        echo "epmd is running in same systemd unit as rabbitmq"
-        systemctl status
-        systemctl status $EPMD_UNIT
-        exit 1
-    fi
-    epmd-should-be-running-under-systemd
-}
-
-epmd-should-be-running-under-systemd() {
-    if ! systemctl status $EPMD_UNIT | grep -q -P 'Main PID: \d+ \(epmd\)'; then
-        echo "epmd is not running as a standalone systemd unit, which is very strange"
-        systemctl status
-        systemctl status $EPMD_UNIT
-        exit 1
-    fi
-}
-
-postinst-started-epmd-should-be-managed-by-systemd() {
-    if [[ $HAS_SYSTEMD != true ]]; then
-        return 0
-    fi
-    # If installation procedure started epmd (because of
-    # HiPE-compilation patch), we need to verify that it was
-    # done through systemd.
-    if pgrep epmd; then
-        epmd-should-be-running-under-systemd
-    fi
-}
-
-banner() {
-    set +x
-    echo
-    echo ================================================================================
-    echo "$@"
-    echo ================================================================================
-    echo
-    set -x
-}
-
-step() {
-    banner "STEP: $@"
-    "$@"
-}
-
-case $PACKAGE in
-    rabbitmq-server)
-        step install-helper-packages
-        step postinst-started-epmd-should-be-managed-by-systemd
-        step check-whether-rabbit-is-running-after-installation
-        step check-whether-rabbit-is-enabled-after-installation
-        step stop-service rabbitmq-server
-        step configure-rabbitmq-server
-        step enable-management-plugin
-        step start-rabbitmq-server
-        step test-logrotate-sanity
-        step rabbitmq-health-check
-        step rabbitmq-management-aliveness-test
-        step ensure-hipe-compiled
-        step validate-erlang-thread-pool-size
-        step test-repeated-restart
-        step epmd-should-be-managed-by-systemd
-        ;;
-    *)
-        echo "test not defined, skipping...."
-        ;;
-esac
diff --git a/upgrade/Makefile b/upgrade/Makefile
new file mode 100644 (file)
index 0000000..f7cc0a6
--- /dev/null
@@ -0,0 +1,109 @@
+
+UPGRADE_FROM = 3.6.5
+
+# UPGRADE_FROM_SCRIPT specifies a script name to use.
+# it should not be changed for every UPGRADE_FROM version
+UPGRADE_FROM_SCRIPT = 3.5
+UPGRADE_TO_SCRIPT = 3.6
+
+RELEASE_FOR_UPGRADE = $(CURDIR)/rabbitmq_r_$(UPGRADE_FROM)
+RELEASE_ARCHIVE = rabbitmq-server-generic-unix-$(UPGRADE_FROM).tar.xz
+RELEASE_FOR_UPGRADE_URL = "http://www.rabbitmq.com/releases/rabbitmq-server/v$(UPGRADE_FROM)/$(RELEASE_ARCHIVE)"
+RELEASE_UPGRADE_DATA = $(CURDIR)/rabbitmq_server_upgrade_data/rabbitmq-test-instances
+UPGRADE_CONFIG_DIR = $(CURDIR)/config
+UPGRADE_SCRIPTS_DIR = $(CURDIR)/scripts
+
+QUEUES_COUNT_TRANSIENT ?= 1
+QUEUES_COUNT_DURABLE ?= 1
+MSGS_COUNT_NON_PERSISTENT ?= 10
+MSGS_COUNT_PERSISTENT_INDEX ?= 10
+MSGS_COUNT_PERSISTENT_STORE ?= 10
+INDEX_MSG_SIZE ?= 50
+STORE_MSG_SIZE ?= 150
+
+# Clean up erlang.mk exported variables
+ifneq (0,${MAKELEVEL})
+export ERL_LIBS=
+export RABBITMQ_SCRIPTS_DIR=
+endif
+
+all: verify-and-cleanup
+
+$(RELEASE_ARCHIVE):
+       wget $(RELEASE_FOR_UPGRADE_URL) -O $(RELEASE_ARCHIVE)
+
+$(RELEASE_FOR_UPGRADE): $(RELEASE_ARCHIVE)
+       mkdir $(RELEASE_FOR_UPGRADE)
+       tar -xvf $(RELEASE_ARCHIVE)
+       mv rabbitmq_server-*/* $(RELEASE_FOR_UPGRADE)
+
+run-release-for-upgrade: $(RELEASE_FOR_UPGRADE)
+       rm -rf $(RELEASE_UPGRADE_DATA)
+       mkdir -p $(RELEASE_UPGRADE_DATA)
+       cd $(RELEASE_FOR_UPGRADE) && \
+       RABBITMQ_HOME=$(RELEASE_FOR_UPGRADE) \
+       RABBITMQ_CONFIG_FILE=$(UPGRADE_CONFIG_DIR)/rabbitmq \
+       RABBITMQ_NODENAME=rabbit_upgrade \
+       RABBITMQ_ENABLED_PLUGINS_FILE=$(UPGRADE_CONFIG_DIR)/enabled_plugins \
+       RABBITMQ_LOG_BASE=$(RELEASE_UPGRADE_DATA)/rabbit_upgrade/log \
+       RABBITMQ_MNESIA_BASE=$(RELEASE_UPGRADE_DATA)/rabbit_upgrade/mnesia \
+       RABBITMQ_MNESIA_DIR=$(RELEASE_UPGRADE_DATA)/rabbit_upgrade/mnesia/rabbit_upgrade \
+       RABBITMQ_SCHEMA_DIR=$(RELEASE_UPGRADE_DATA)/rabbit_upgrade/schema \
+       RABBITMQ_PLUGINS_EXPAND_DIR=$(RELEASE_UPGRADE_DATA)/rabbit_upgrade/plugins \
+       RABBITMQ_PLUGINS_DIR=$(RELEASE_FOR_UPGRADE)/plugins \
+       ./sbin/rabbitmq-server -detached
+       sleep 10
+
+stop-release-for-upgrade:
+       cd $(RELEASE_FOR_UPGRADE) && \
+       RABBITMQ_HOME=$(RELEASE_FOR_UPGRADE) \
+       ./sbin/rabbitmqctl -n rabbit_upgrade stop
+
+setup-release-for-upgrade: run-release-for-upgrade
+       RABBITMQCTL="$(RELEASE_FOR_UPGRADE)/sbin/rabbitmqctl -n rabbit_upgrade" \
+       UPGRADE_FROM_SCRIPT=$(UPGRADE_FROM_SCRIPT) \
+       QUEUES_COUNT_TRANSIENT=$(QUEUES_COUNT_TRANSIENT) \
+       QUEUES_COUNT_DURABLE=$(QUEUES_COUNT_DURABLE) \
+       MSGS_COUNT_NON_PERSISTENT=$(MSGS_COUNT_NON_PERSISTENT) \
+       MSGS_COUNT_PERSISTENT_INDEX=$(MSGS_COUNT_PERSISTENT_INDEX) \
+       MSGS_COUNT_PERSISTENT_STORE=$(MSGS_COUNT_PERSISTENT_STORE) \
+       INDEX_MSG_SIZE=$(INDEX_MSG_SIZE) \
+       STORE_MSG_SIZE=$(STORE_MSG_SIZE) \
+       bash $(UPGRADE_SCRIPTS_DIR)/upgrade-from.sh
+
+prepare-release-for-upgrade: setup-release-for-upgrade stop-release-for-upgrade
+
+run-broker-upgrade:
+       $(MAKE) -C ../ run-background-broker \
+       RABBITMQ_CONFIG_FILE=$(UPGRADE_CONFIG_DIR)/rabbitmq \
+       RABBITMQ_NODENAME=rabbit_upgrade \
+       TMPDIR=`dirname $(RELEASE_UPGRADE_DATA)` \
+       PLUGINS=rabbitmq_management
+       sleep 10
+
+verify-upgrade: prepare-release-for-upgrade run-broker-upgrade
+       RABBITMQCTL="$(RELEASE_FOR_UPGRADE)/sbin/rabbitmqctl -n rabbit_upgrade" \
+       UPGRADE_TO_SCRIPT=$(UPGRADE_TO_SCRIPT) \
+       QUEUES_COUNT_TRANSIENT=$(QUEUES_COUNT_TRANSIENT) \
+       QUEUES_COUNT_DURABLE=$(QUEUES_COUNT_DURABLE) \
+       MSGS_COUNT_NON_PERSISTENT=$(MSGS_COUNT_NON_PERSISTENT) \
+       MSGS_COUNT_PERSISTENT_INDEX=$(MSGS_COUNT_PERSISTENT_INDEX) \
+       MSGS_COUNT_PERSISTENT_STORE=$(MSGS_COUNT_PERSISTENT_STORE) \
+       INDEX_MSG_SIZE=$(INDEX_MSG_SIZE) \
+       STORE_MSG_SIZE=$(STORE_MSG_SIZE) \
+       $(UPGRADE_SCRIPTS_DIR)/upgrade-to.sh
+
+verify-and-stop: verify-upgrade
+       -$(MAKE) stop-release-for-upgrade
+
+verify-and-cleanup: verify-and-stop
+       $(MAKE) clean
+
+clean: 
+       -$(MAKE) stop-release-for-upgrade
+       rm -rf rabbitmq_server*
+       rm -rf rabbitmq_r*
+       rm -rf rabbitmqadmin
+
+distclean: clean
+       rm -rf rabbitmq-server-generic-unix-*
\ No newline at end of file
diff --git a/upgrade/README.md b/upgrade/README.md
new file mode 100644 (file)
index 0000000..a283fbe
--- /dev/null
@@ -0,0 +1,64 @@
+## Testing RabbitMQ upgrades.
+
+This tool can be used to test upgrade of RabbitMQ to a branch version.
+`rabbitmq-server` dependency should be checked out to the tested branch.
+
+### How it works:
+
+This tool use GNU Make to run following steps:
+
+ - install generic unix release for specified version to `rabbitmq_r_<version>`
+ - start a server with configuration from `config` directory and data directory in `rabbitmq_server_upgrade_data`
+ - set up vhost, user, policies, exchange (fanout), queues (transient and durable)
+ - publish messages to queues (persistent to queue index, persistent to storage, not persistent)
+ - stop the server
+ - start local branch server using `run-background-broker`
+ - verify everything is in place (transient queues and messages are expected to be lost)
+ - stop local server
+
+By default it will also clean up the test data.
+
+### Custom targets and configuration
+
+Make targets:
+
+ - `run-release-for-upgrade` - download release and run it in `rabbitmq_r_<version>` with data in `rabbitmq_server_upgrade_data`
+ - `setup-release-for-upgrade` - run previous step and set up test data
+ - `prepare-release-for-upgrade` - run previous step and stop the server (can be used to build "pre upgrade" state)
+ - `run-broker-upgrade` - run previous step and run a current branch server (can be used to observe "after upgrade" state for manual verification)
+ - `verify-upgrade` - run previous step and verification script (that will consume published messages and delete some vhosts)
+ - `verify-and-stop` - run previous stap and stop the server
+ - `verify-and-cleanup` - run previous step and delete test data **this is the default step**
+
+Additional targets:
+
+ - `clean` - stop server (if running) and delete temporary data
+ - `distclean` - same as `clean`, but also removes downloaded release package
+
+Environment:
+
+Following environment parameters can be used to configure upgrade validation:
+
+| parameter                   | default | description                                                    |
+|-----------------------------|---------|----------------------------------------------------------------|
+| UPGRADE_FROM                | 3.6.5   | Release version to upgrade from                                |
+| QUEUES_COUNT_TRANSIENT      | 1       | Number of transient queues                                     |
+| QUEUES_COUNT_DURABLE        | 1       | Number of durable queues                                       |
+| MSGS_COUNT_NON_PERSISTENT   | 10      | Number of transient messages to publish                        |
+| MSGS_COUNT_PERSISTENT_INDEX | 10      | Number of persistent messages to publish to queue index        |
+| MSGS_COUNT_PERSISTENT_STORE | 10      | Number of persistent messages to publish to message store      |
+| INDEX_MSG_SIZE              | 50      | Message size to fit queue index (depends on configuration)     |
+| STORE_MSG_SIZE              | 150     | Message size to not fit queue index (depends on configuration) |
+
+`INDEX_MSG_SIZE` and `STORE_MSG_SIZE` should be set to be more and less than `queue_index_embed_msgs_below` setting in `config/rabbitmq.config` file respectively.
+
+Unsafe. Do not change without need:
+
+| parameter | default | description |
+|-----------|---------|-------------|
+| UPGRADE_FROM_SCRIPT | 3.5   | Script to use for data setup. It's only `3.5` now used for both `3.5.x` and `3.6.x` releases |
+| UPGRADE_TO_SCRIPT   | 3.6   | Script to use for verification. Should correspond with branch version  |
+| RELEASE_ARCHIVE     | rabbitmq-server-generic-unix-$(UPGRADE_FROM).tar.xz | Filename for release archive |
+| RELEASE_FOR_UPGRADE_URL | http://www.rabbitmq.com/releases/rabbitmq-server/v$(UPGRADE_FROM)/$(RELEASE_ARCHIVE) | URL to load $RELEASE_ARCHIVE from. Should point to directly accessible (via wget) generic unix archive |
+
+
diff --git a/upgrade/config/enabled_plugins b/upgrade/config/enabled_plugins
new file mode 100644 (file)
index 0000000..352dfc4
--- /dev/null
@@ -0,0 +1 @@
+[rabbitmq_management].
diff --git a/upgrade/config/rabbitmq.config b/upgrade/config/rabbitmq.config
new file mode 100644 (file)
index 0000000..6a0278d
--- /dev/null
@@ -0,0 +1 @@
+[{rabbit, [{queue_index_embed_msgs_below, 100}]}].
diff --git a/upgrade/scripts/upgrade-from-3.5-helpers.sh b/upgrade/scripts/upgrade-from-3.5-helpers.sh
new file mode 100644 (file)
index 0000000..a8adbd3
--- /dev/null
@@ -0,0 +1,80 @@
+setup_steps() {
+    local test_vhost='test'
+    local test_user='test_user'
+
+    ${RABBITMQCTL} add_user $test_user $test_user
+    ${RABBITMQCTL} set_user_tags $test_user policymaker
+    ${RABBITMQCTL} add_vhost $test_vhost
+    ${RABBITMQCTL} set_permissions -p $test_vhost $test_user '.*' '.*' '.*'
+    ${RABBITMQCTL} set_policy -p $test_vhost my_policy_name "policy.*" '{"max-length":300}'
+
+    # TODO: create exchanges, queues, publish messages
+    local exchange_name="test_exchange"
+    local queue_name_base="test_queue"
+
+    prepare_rabbitmqadmin
+
+    ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost declare exchange name=$exchange_name type=fanout
+    for i in `seq 1 $QUEUES_COUNT_TRANSIENT`
+    do
+        local queue_name="${queue_name_base}_trans_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost declare queue name=$queue_name durable=false
+        ./rabbitmqadmin -utest_user -ptest_user -V $test_vhost declare binding source=$exchange_name destination=$queue_name
+    done
+
+    for i in `seq 1 $QUEUES_COUNT_DURABLE`
+    do
+        local queue_name="${queue_name_base}_dur_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost declare queue name=$queue_name durable=true
+        ./rabbitmqadmin -utest_user -ptest_user -V $test_vhost declare binding source=$exchange_name destination=$queue_name
+    done
+
+    local sequence_index=`seq 1 $INDEX_MSG_SIZE`
+    local msg_payload_index=`printf '=%.0s' $sequence_index`
+    local sequence_store=`seq 1 $STORE_MSG_SIZE`
+    local msg_payload_store=`printf '+%.0s' $sequence_store`
+    for i in `seq 1 $MSGS_COUNT_NON_PERSISTENT`
+    do
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost publish routing_key=any exchange=$exchange_name payload=$msg_payload
+    done
+
+    for i in `seq 1 $MSGS_COUNT_PERSISTENT_INDEX`
+    do
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost publish routing_key=any exchange=$exchange_name payload=$msg_payload_index properties='{"delivery_mode":2}'
+    done
+
+    for i in `seq 1 $MSGS_COUNT_PERSISTENT_STORE`
+    do
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost publish routing_key=any exchange=$exchange_name payload=$msg_payload_store properties='{"delivery_mode":2}'
+    done
+
+    # Second vhost to test data isolation
+
+    local test_vhost1="test_vhost_1"
+    local msg_payload_index_1=`printf '_%.0s' $sequence_index`
+    local msg_payload_store_1=`printf '0%.0s' $sequence_store`
+
+    ${RABBITMQCTL} add_vhost $test_vhost1
+    ${RABBITMQCTL} set_permissions -p $test_vhost1 $test_user '.*' '.*' '.*'
+
+    ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 declare exchange name=$exchange_name type=fanout
+    for i in `seq 1 $QUEUES_COUNT_DURABLE`
+    do
+        local queue_name="${queue_name_base}_dur_vhost1_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 declare queue name=$queue_name durable=true
+        ./rabbitmqadmin -utest_user -ptest_user -V $test_vhost1 declare binding source=$exchange_name destination=$queue_name
+    done
+    for i in `seq 1 $MSGS_COUNT_PERSISTENT_INDEX`
+    do
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 publish routing_key=any exchange=$exchange_name payload=$msg_payload_index_1 properties='{"delivery_mode":2}'
+    done
+
+    for i in `seq 1 $MSGS_COUNT_PERSISTENT_STORE`
+    do
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 publish routing_key=any exchange=$exchange_name payload=$msg_payload_store_1 properties='{"delivery_mode":2}'
+    done
+
+    ./rabbitmqadmin -utest_user -ptest_user -V $test_vhost list queues name durable messages
+    ./rabbitmqadmin -utest_user -ptest_user -V $test_vhost list exchanges
+}
+
diff --git a/upgrade/scripts/upgrade-from.sh b/upgrade/scripts/upgrade-from.sh
new file mode 100755 (executable)
index 0000000..90ac072
--- /dev/null
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+set -ex
+
+echo "UPGRADE_FROM ${UPGRADE_FROM}"
+
+. "$(dirname "$0")/upgrade-helpers.sh"
+. "$(dirname "$0")/upgrade-from-${UPGRADE_FROM_SCRIPT}-helpers.sh"
+
+setup_steps
\ No newline at end of file
diff --git a/upgrade/scripts/upgrade-helpers.sh b/upgrade/scripts/upgrade-helpers.sh
new file mode 100644 (file)
index 0000000..ccfc5f9
--- /dev/null
@@ -0,0 +1,5 @@
+prepare_rabbitmqadmin() {
+    rm -rf rabbitmqadmin
+    wget localhost:15672/cli/rabbitmqadmin
+    chmod +x rabbitmqadmin
+}
\ No newline at end of file
diff --git a/upgrade/scripts/upgrade-to-3.6-helpers.sh b/upgrade/scripts/upgrade-to-3.6-helpers.sh
new file mode 100644 (file)
index 0000000..4fd8866
--- /dev/null
@@ -0,0 +1,101 @@
+verify_steps() {
+    local test_vhost='test'
+    local test_user='test_user'
+
+    ${RABBITMQCTL} list_users | grep $test_user
+    ${RABBITMQCTL} list_vhosts | grep $test_vhost
+    ${RABBITMQCTL} list_user_permissions $test_user | grep $test_vhost | grep -F ".*"
+    ${RABBITMQCTL} list_permissions -p $test_vhost | grep $test_user | grep -F ".*"
+    ${RABBITMQCTL} list_policies -p $test_vhost | \
+        grep $test_vhost | \
+        grep my_policy_name | \
+        grep -F "policy.*" | \
+        grep -F '{"max-length":300}'
+
+    local exchange_name="test_exchange"
+    local queue_name_base="test_queue"
+
+    prepare_rabbitmqadmin
+    ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list exchanges | grep $exchange_name
+
+    local sequence_index=`seq 1 $INDEX_MSG_SIZE`
+    local msg_payload_index=`printf '=%.0s' $sequence_index`
+    local sequence_store=`seq 1 $STORE_MSG_SIZE`
+    local msg_payload_store=`printf '+%.0s' $sequence_store`
+
+    # Durable queues survive upgrade
+    for i in `seq 1 $QUEUES_COUNT_DURABLE`
+    do
+        local queue_name="${queue_name_base}_dur_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list queues name durable | \
+            grep $queue_name | grep True
+        # Each queue have $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list queues name messages | \
+            grep $queue_name | grep `expr $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE`
+
+        # Drain persistent messages from queue index
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_INDEX`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost get queue=$queue_name count=1 requeue=false | \
+                grep $msg_payload_index | grep $INDEX_MSG_SIZE | grep $exchange_name
+        done
+        # Drain persistent messages from message store
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_STORE`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost get queue=$queue_name count=1 requeue=false | \
+                grep $msg_payload_store | grep $STORE_MSG_SIZE | grep $exchange_name
+        done
+        # No more messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost get queue=$queue_name count=1 requeue=false | \
+            grep "No items"
+
+    done
+
+    # Transient queues are deleted
+    (! ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list queues name | grep "${queue_name_base}_trans_") || exit 2
+
+    # Test first vhost and check second
+    ${RABBITMQCTL} delete_vhost $test_vhost
+
+    # Also delete default vhost
+    ${RABBITMQCTL} delete_vhost /
+
+    local test_vhost1="test_vhost_1"
+    local msg_payload_index_1=`printf '_%.0s' $sequence_index`
+    local msg_payload_store_1=`printf '0%.0s' $sequence_store`
+
+    ${RABBITMQCTL} list_vhosts | grep $test_vhost1
+    ${RABBITMQCTL} list_user_permissions $test_user | grep $test_vhost1 | grep -F ".*"
+    ${RABBITMQCTL} list_permissions -p $test_vhost1 | grep $test_user | grep -F ".*"
+
+    ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 list exchanges | grep $exchange_name
+
+    # Durable queues
+    for i in `seq 1 $QUEUES_COUNT_DURABLE`
+    do
+        local queue_name="${queue_name_base}_dur_vhost1_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 list queues name durable | \
+            grep $queue_name | grep True
+        # Each queue have $MSGS_COUNT_PERSISTENT messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 list queues name messages | \
+            grep $queue_name | grep `expr $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE`
+
+        # Drain persistent messages from queue index
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_INDEX`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 get queue=$queue_name count=1 requeue=false | \
+                grep $msg_payload_index_1 | grep $INDEX_MSG_SIZE | grep $exchange_name
+        done
+        # Drain persistent messages from message store
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_STORE`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 get queue=$queue_name count=1 requeue=false | \
+                grep $msg_payload_store_1 | grep $STORE_MSG_SIZE | grep $exchange_name
+        done
+        # No more messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 get queue=$queue_name count=1 requeue=false | \
+            grep "No items"
+    done
+
+    echo "Finish verify"
+}
diff --git a/upgrade/scripts/upgrade-to-3.7-helpers.sh b/upgrade/scripts/upgrade-to-3.7-helpers.sh
new file mode 100644 (file)
index 0000000..54032ac
--- /dev/null
@@ -0,0 +1,104 @@
+verify_steps() {
+    local test_vhost='test'
+    local test_user='test_user'
+
+    ${RABBITMQCTL} list_users | grep $test_user
+    ${RABBITMQCTL} list_vhosts | grep $test_vhost
+    ${RABBITMQCTL} list_user_permissions $test_user | grep $test_vhost | grep -F ".*"
+    ${RABBITMQCTL} list_permissions -p $test_vhost | grep $test_user | grep -F ".*"
+    ${RABBITMQCTL} list_policies -p $test_vhost | \
+        grep $test_vhost | \
+        grep my_policy_name | \
+        grep -F "policy.*" | \
+        grep -F '{"max-length":300}'
+
+    local exchange_name="test_exchange"
+    local queue_name_base="test_queue"
+
+    prepare_rabbitmqadmin
+    ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list exchanges | grep $exchange_name
+
+    local sequence_index=`seq 1 $INDEX_MSG_SIZE`
+    local msg_payload_index=`printf '=%.0s' $sequence_index`
+    local sequence_store=`seq 1 $STORE_MSG_SIZE`
+    local msg_payload_store=`printf '+%.0s' $sequence_store`
+    
+    # Durable queues survive upgrade
+    for i in `seq 1 $QUEUES_COUNT_DURABLE`
+    do
+        local queue_name="${queue_name_base}_dur_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list queues name durable | \
+            grep $queue_name | grep True
+        # Each queue have $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list queues name messages | \
+            grep $queue_name | grep `expr $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE`
+
+        # Drain persistent messages from queue index
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_INDEX`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost get queue=$queue_name count=1 ackmode=ack_requeue_false | \
+                grep $msg_payload_index | grep $INDEX_MSG_SIZE | grep $exchange_name
+        done
+        # Drain persistent messages from message store
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_STORE`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost get queue=$queue_name count=1 ackmode=ack_requeue_false | \
+                grep $msg_payload_store | grep $STORE_MSG_SIZE | grep $exchange_name
+        done
+        # No more messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost get queue=$queue_name count=1 ackmode=ack_requeue_false | \
+            grep "No items"
+
+    done
+
+    # Transient queues are deleted
+    (! ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost list queues name | grep "${queue_name_base}_trans_") || exit 2
+
+    # Test first vhost and check second
+    ${RABBITMQCTL} delete_vhost $test_vhost
+
+    # Also delete default vhost
+    ${RABBITMQCTL} delete_vhost /
+
+    local test_vhost1="test_vhost_1"
+    local msg_payload_index_1=`printf '_%.0s' $sequence_index`
+    local msg_payload_store_1=`printf '0%.0s' $sequence_store`
+
+    ${RABBITMQCTL} list_vhosts | grep $test_vhost1
+    ${RABBITMQCTL} list_user_permissions $test_user | grep $test_vhost1 | grep -F ".*"
+    ${RABBITMQCTL} list_permissions -p $test_vhost1 | grep $test_user | grep -F ".*"
+
+    ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 list exchanges | grep $exchange_name
+
+    # Durable queues
+    for i in `seq 1 $QUEUES_COUNT_DURABLE`
+    do
+        local queue_name="${queue_name_base}_dur_vhost1_${i}"
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 list queues name durable | \
+            grep $queue_name | grep True
+        # Each queue have $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 list queues name messages | \
+            grep $queue_name | grep `expr $MSGS_COUNT_PERSISTENT_INDEX + $MSGS_COUNT_PERSISTENT_STORE`
+
+        # Drain persistent messages from queue index
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_INDEX`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 get queue=$queue_name count=1 ackmode=ack_requeue_false | \
+                grep $msg_payload_index_1 | grep $INDEX_MSG_SIZE | grep $exchange_name
+        done
+        # Drain persistent messages from message store
+        for j in `seq 1 $MSGS_COUNT_PERSISTENT_STORE`
+        do
+            ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 get queue=$queue_name count=1 ackmode=ack_requeue_false | \
+                grep $msg_payload_store_1 | grep $STORE_MSG_SIZE | grep $exchange_name
+        done
+        # No more messages
+        ./rabbitmqadmin -u $test_user -p $test_user -V $test_vhost1 get queue=$queue_name count=1 ackmode=ack_requeue_false | \
+            grep "No items"
+    done
+
+    echo "Finish verify"
+}
+
+
+ackmode=ack_requeue_false
\ No newline at end of file
diff --git a/upgrade/scripts/upgrade-to.sh b/upgrade/scripts/upgrade-to.sh
new file mode 100755 (executable)
index 0000000..e58348e
--- /dev/null
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -ex
+
+. "$(dirname "$0")/upgrade-helpers.sh"
+. "$(dirname "$0")/upgrade-to-${UPGRADE_TO_SCRIPT}-helpers.sh"
+
+verify_steps